Creación de una aplicación web para extraer temas de audio con Python
El autor de la foto palacio de israel acerca de Abrelo
El artículo es una continuación de la historia. Cómo construir una aplicación web para transcribir y resumir audio con Python. En una publicación anterior, te mostré cómo crear un programa que transcriba y resuma el contenido de tu Spotify Podcast favorito. Un resumen de texto puede ser útil para que los oyentes determinen si un episodio es de su interés antes de escucharlo.
Pero hay otras características posibles que se pueden silenciar. Temas. El modelado de temas es una de las muchas técnicas de procesamiento del lenguaje natural que permiten la extracción automática de temas de diferentes tipos de fuentes, como reseñas de hoteles, ofertas de trabajo y publicaciones en redes sociales.
En este artículo, crearemos un programa en Python que recopila temas de un episodio de podcast y analiza la importancia de cada tema extraído con hermosas visualizaciones de datos. Finalmente, alojaremos la aplicación web en Heroku de forma gratuita.
Requisitos
- Crear repositorio GitHubserá necesario para implementar la aplicación web en producción en Heroku!
- Clona el repositorio en tu computadora local
git clone
. En mi caso, usaré VS Code, que es un IDE realmente eficiente para trabajar con scripts de python, incluye soporte para Git y se conecta a la terminal. Copie los siguientes comandos en la Terminal:.git
git init
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com//.git
git push -u origin master
- Crear un entorno virtual en Python.
Este tutorial se divide en dos partes principales. En la primera parte, creamos nuestra sencilla aplicación web para extraer temas de un podcast. El resto se enfoca en la implementación de la aplicación, que es un paso esencial para compartir su aplicación con el mundo en cualquier momento. ¡Empecemos!
1. Extraiga la URL del episodio de las notas de escucha

Exploraremos temas de la serie “Sin confirmar” titulada “Quiero un trabajo en Crypto”. Las acciones están contratando — Ep. 110. Puedes familiarizarte con el paso del episodio. aquí. Como sabe por las noticias en la televisión y los periódicos, la industria de la cadena de bloques está explotando y existe una necesidad constante de actualizar las ofertas de trabajo en este campo. Sin duda, necesitarán ingenieros de datos y científicos de datos para gestionar los datos y extraer valores de estos grandes volúmenes de datos.
Listen Notes es un motor de búsqueda de podcasts en línea y una base de datos que le permite acceder al audio de podcasts a través de sus API. Necesitamos definir una función para extraer la URL del episodio de la página web. Primero, debe crear una cuenta para acceder a los datos y suscribirse plan gratis Usando la API de Listen Notes.
A continuación, haga clic en el episodio que le interese y seleccione “Usar la API para obtener este episodio” en el lado derecho de la página. Después de hacer clic en él, puede cambiar el lenguaje de codificación predeterminado a Python y hacer clic en la opción de solicitudes para usar ese paquete de python. Luego copia y pega el código en la función.
import streamlit as st
import requests
import zipfile
import json
from time import sleep
import yaml
def retrieve_url_podcast(parameters,episode_id):
url_episodes_endpoint="https://listen-api.listennotes.com/api/v2/episodes"
headers = {
'X-ListenAPI-Key': parameters["api_key_listennotes"],
}
url = f"{url_episodes_endpoint}/{episode_id}"
response = requests.request('GET', url, headers=headers)
print(response.json())
data = response.json()
audio_url = data['audio']
return audio_url
Recupera las credenciales de un archivo separado, secreto.yamlconsiste en una colección de pares clave-valor como los diccionarios:
api_key:{your-api-key-assemblyai}
api_key_listennotes:{your-api-key-listennotes}
2. Obtenga transcripciones y temas de audio
Para extraer temas, primero debemos enviar una solicitud de escritura al punto final de transcripción de AssemblyAI ingresando la URL de audio obtenida en el paso anterior. Luego podemos recuperar la transcripción y los temas de nuestro podcast enviando una solicitud GET Asamblea IA.
## send transcription request
def send_transc_request(headers, audio_url):
transcript_endpoint = "https://api.assemblyai.com/v2/transcript"
transcript_request = {
"audio_url": audio_url,
"iab_categories": True,
}
transcript_response = requests.post(
transcript_endpoint, json=transcript_request, headers=headers
)
transcript_id = transcript_response.json()["id"]
return transcript_id
##retrieve transcription and topics
def obtain_polling_response(headers, transcript_id):
polling_endpoint = (
f"https://api.assemblyai.com/v2/transcript/{transcript_id}"
)
polling_response = requests.get(polling_endpoint, headers=headers)
i = 0
while polling_response.json()["status"] != "completed":
sleep(5)
polling_response = requests.get(
polling_endpoint, headers=headers
)
return polling_response
Los resultados se guardarán en dos archivos diferentes:
def save_files(polling_response):
with open("transcript.txt", 'w') as f:
f.write(polling_response.json()['text'])
f.close()
with open('only_topics.json', 'w') as f:
topics = polling_response.json()['iab_categories_result']
json.dump(topics, f, indent=4)
def save_zip():
list_files = ['transcript.txt','only_topics.json','barplot.html']
with zipfile.ZipFile('final.zip', 'w') as zipF:
for file in list_files:
zipF.write(file, compress_type=zipfile.ZIP_DEFLATED)
zipF.close()
A continuación muestro un ejemplo de transcripción:
Hi everyone. Welcome to Unconfirmed, the podcast that reveals how the marketing names and crypto are reacting to the week's top headlines and gets the insights you on what they see on the horizon. I'm your host, Laura Shin. Crypto, aka Kelman Law, is a New York law firm run by some of the first lawyers to enter crypto in 2013 with expertise in litigation, dispute resolution and anti money laundering. Email them at info at kelman law. ....
Ahora muestro el resultado de los temas extraídos del episodio del podcast:
{
"status": "success",
"results": [
{
"text": "Hi everyone. Welcome to Unconfirmed, the podcast that reveals how the marketing names and crypto are reacting to the week's top headlines and gets the insights you on what they see on the horizon. I'm your host, Laura Shin. Crypto, aka Kelman Law, is a New York law firm run by some of the first lawyers to enter crypto in 2013 with expertise in litigation, dispute resolution and anti money laundering. Email them at info at kelman law.",
"labels": [
{
"relevance": 0.015229620970785618,
"label": "PersonalFinance>PersonalInvesting"
},
{
"relevance": 0.007826927118003368,
"label": "BusinessAndFinance>Industries>FinancialIndustry"
},
{
"relevance": 0.007203377783298492,
"label": "BusinessAndFinance>Business>BusinessBanking&Finance>AngelInvestment"
},
{
"relevance": 0.006419596262276173,
"label": "PersonalFinance>PersonalInvesting>HedgeFunds"
},
{
"relevance": 0.0057992455549538136,
"label": "Hobbies&Interests>ContentProduction"
},
{
"relevance": 0.005361487623304129,
"label": "BusinessAndFinance>Economy>Currencies"
},
{
"relevance": 0.004509655758738518,
"label": "BusinessAndFinance>Industries>LegalServicesIndustry"
},
{
"relevance": 0.004465851932764053,
"label": "Technology&Computing>Computing>Internet>InternetForBeginners"
},
{
"relevance": 0.0021628723479807377,
"label": "BusinessAndFinance>Economy>Commodities"
},
{
"relevance": 0.0017050291644409299,
"label": "PersonalFinance>PersonalInvesting>StocksAndBonds"
}
],
"timestamp": {
"start": 4090,
"end": 26670
}
},...],
"summary": {
"Careers>JobSearch": 1.0,
"BusinessAndFinance>Business>BusinessBanking&Finance>VentureCapital": 0.9733043313026428,
"BusinessAndFinance>Business>Startups": 0.9268804788589478,
"BusinessAndFinance>Economy>JobMarket": 0.7761372327804565,
"BusinessAndFinance>Business>BusinessBanking&Finance>AngelInvestment": 0.6847236156463623,
"PersonalFinance>PersonalInvesting>StocksAndBonds": 0.6514145135879517,
"BusinessAndFinance>Business>BusinessBanking&Finance>PrivateEquity": 0.3943130075931549,
"BusinessAndFinance>Industries>FinancialIndustry": 0.3717447817325592,
"PersonalFinance>PersonalInvesting": 0.3703657388687134,
"BusinessAndFinance>Industries": 0.29375147819519043,
"BusinessAndFinance>Economy>Currencies": 0.27661699056625366,
"BusinessAndFinance": 0.1965470314025879,
"Hobbies&Interests>ContentProduction": 0.1607944369316101,
"BusinessAndFinance>Economy>FinancialRegulation": 0.1570006012916565,
"Technology&Computing": 0.13974210619926453,
"Technology&Computing>Computing>ComputerSoftwareAndApplications>SharewareAndFreeware": 0.13566900789737701,
"BusinessAndFinance>Industries>TechnologyIndustry": 0.13414880633354187,
"BusinessAndFinance>Industries>InformationServicesIndustry": 0.12478621304035187,
"BusinessAndFinance>Economy>FinancialReform": 0.12252965569496155,
"BusinessAndFinance>Business>BusinessBanking&Finance>MergersAndAcquisitions": 0.11304120719432831
}
}
Obtuvimos un archivo JSON que contiene todos los temas detectados por AssemblyAI. Básicamente, convertimos el podcast en un texto que se desglosó en diferentes oraciones y sus respectivas coincidencias. Hay una lista de sujetos para cada oración. Al final de este gran diccionario hay un resumen de los temas extraídos de todas las oraciones.
Cabe destacar que Carrera y Búsqueda de Empleo es el tema más relevante. En las cinco etiquetas principales también encontramos Business & Finance, Startups, Economics, Business & Banking, Venture Capital y otros temas similares.
3. Cree una aplicación web con Streamlit

Es un enlace a la Aplicación Embebida aquí
Ahora colocamos todas las funciones definidas en los pasos anteriores en el bloque principal, donde construimos nuestra aplicación web con Streamlit, un marco gratuito de código abierto que nos permite crear aplicaciones con solo unas pocas líneas de código usando Python:
- El título principal del programa se muestra usando
st.markdown
. - Se crea una barra lateral del panel izquierdo usando
st.sidebar
. Necesitamos que incluya el ID del episodio de nuestro podcast. - Después de hacer clic en enviar, aparecerá un gráfico de barras que muestra los 5 temas más relevantes extraídos.
- Hay un botón Descargar si desea descargar la transcripción, los temas y la visualización de datos.
st.markdown("# **Web App for Topic Modeling**")
bar = st.progress(0)
st.sidebar.header("Input parameter")
with st.sidebar.form(key="my_form"):
episode_id = st.text_input("Insert Episode ID:")
# 7b23aaaaf1344501bdbe97141d5250ff
submit_button = st.form_submit_button(label="Submit")
if submit_button:
f = open("secrets.yaml", "rb")
parameters = yaml.load(f, Loader=yaml.FullLoader)
f.close()
# step 1 - Extract episode's url from listen notes
audio_url = retrieve_url_podcast(parameters, episode_id)
# bar.progress(30)
api_key = parameters["api_key"]
headers = {
"authorization": api_key,
"content-type": "application/json",
}
# step 2 - retrieve id of transcription response from AssemblyAI
transcript_id = send_transc_request(headers, audio_url)
# bar.progress(70)
# step 3 - topics
polling_response = obtain_polling_response(headers, transcript_id)
save_files(polling_response)
df = create_df_topics()
import plotly.express as px
st.subheader("Top 5 topics extracted from the podcast's episode")
fig = px.bar(
df.iloc[:5, :].sort_values(
by=["Probability"], ascending=True
),
x="Probability",
y="Topics",
text="Probability",
)
fig.update_traces(
texttemplate="%{text:.2f}", textposition="outside"
)
fig.write_html("barplot.html")
st.plotly_chart(fig)
save_zip()
with open("final.zip", "rb") as zip_download:
btn = st.download_button(
label="Download",
data=zip_download,
file_name="final.zip",
mime="application/zip",
)
Para ejecutar la aplicación web, debe escribir la siguiente línea de comando en la terminal:
streamlit run topic_app.py
¡Asombroso! Ahora deberían aparecer dos URL, haga clic en uno de ellos y la aplicación web está lista para usar.
Una vez que haya completado la codificación de su aplicación web y verificado que funciona bien, el siguiente paso es implementarla en Heroku en la web.
¿Qué es lo que probablemente te estés preguntando? Heroku lo hace. Es una plataforma en la nube que le permite desarrollar e implementar aplicaciones web utilizando varios lenguajes de codificación.
1. Cree los requisitos.txt, Procfile y setup.sh
Después de eso creamos un archivo. requisitos.txt, que incluye todos los paquetes de python requeridos por su secuencia de comandos. Usando esta maravillosa biblioteca de python podemos generar automáticamente usando la siguiente línea de comando piprex.
Esto creará mágicamente un requisitos.txt expediente:
pandas==1.4.3
plotly==5.10.0
PyYAML==6.0
requests==2.28.1
streamlit==1.12.2
No use la línea de comando pip freeze > requirements
a quién Este artículo el sugirió. El problema es que devuelve más paquetes de Python que no son necesarios para ese proyecto en particular.
Además de requisitos.txttambién necesitamos un Procfile que especifique los comandos necesarios para ejecutar la aplicación web.
web: sh setup.sh && streamlit run topic_app.py
El último requisito debe ser uno instalar.sh archivo que contiene el siguiente código:
mkdir -p ~/.streamlit/
echo "\
[server]\n\
port = $PORT\n\
enableCORS = false\n\
headless = true\n\
\n\
" > ~/.streamlit/config.toml
2. Conéctate a Heroku
Si aún no te has registrado Herokuel sitio web de, debe crear una cuenta gratuita para utilizar sus servicios. También necesita instalar Heroku en su computadora local. Una vez que hayamos cumplido estos dos requisitos, ¡podemos comenzar la parte divertida! Copie la siguiente línea de comando en la Terminal:
Después de presionar el comando, aparecerá una ventana de Heroku en su navegador y deberá ingresar el correo electrónico y la contraseña de su cuenta. Si funciona, debería obtener el siguiente resultado:

Entonces puede volver a VS Code y escribir el comando para construir su aplicación web en la terminal:
heroku create topic-web-app-heroku
Producción:
Creating ⬢ topic-web-app-heroku... done
https://topic-web-app-heroku.herokuapp.com/ | https://git.heroku.com/topic-web-app-heroku.git
Para implementar la aplicación en Heroku, necesitamos esta línea de comando:
Se utiliza para enviar código desde la rama maestra del repositorio local al remoto heroku. Después de enviar los cambios a su repositorio con otros comandos:
git add -A
git commit -m "App over!"
git push
¡Finalmente hemos terminado! ¡Ahora finalmente deberías ver tu aplicación implementada!
¡Espero que hayas disfrutado este mini proyecto! Crear e implementar aplicaciones puede ser muy divertido. Puede ser un poco intimidante la primera vez, pero una vez que termines, ¡no te arrepentirás! También quiero mencionar que es mejor alojar su aplicación web en Heroku cuando se trabaja en proyectos pequeños con requisitos de memoria bajos. Otras alternativas pueden ser marcos de plataforma en la nube más grandes, como AWS Lambda y Google Cloud. Aquí está el código de GitHub aquí. Gracias por leer. ¡Te deseo un buen dia!
eugenia anello Actualmente, es investigador en el Departamento de Ingeniería de la Información de la Universidad de Padova, Italia. Su proyecto de investigación se centra en el Aprendizaje Continuo con detección de anomalías.
Original. Republicado con permiso.