Obteniendo la transcripción de videos de Youtube con GCP Speech-to-Text.
TL;DR: Utilizando Python 3 y los paquetes google-cloud-speech y youtube-dl podemos obtener la transcripción de un video de youtube.
DISCLAIMER
- Esta publicación ejemplifica la forma en que se puede obtener una transcripción partiendo del audio de un Video.
- La distribución de contenido sin el debido permiso es ilegal.
- Asegúrate de disponer de todos los derechos necesarios.
La idea para realizar esta publicación fue tomado del reto que hizo Juan Villalvazo en su vídeo Conferencias — Talleres en Talent Land — EDCamp y Proyecto Secreto, el cual consistía en contar cuantas veces menciona la frase vida de programador.
Entorno
Lenguaje: Python 3.7.0 (usando pyenv)
Editor de código: Visual Studio Code (no es relevante)
Descargando el Audio del Video
Para realizar dicha acción utilizaremos youtube-dl
pip install youtube_dl
Es es un programa de línea de comandos para descargar vídeos o extraer audio de sitios de streaming.
Comenzamos de la siguiente manera:
Siguiendo el ejemplo proporcionado en su documentación, creamos un diccionario con las opciones necesarias.
Requerimos solo el audio por lo tanto especificamos “format”: “bestaudio”, especificamos el nombre de salida con la clave “outtmpl” que utiliza un template, esto se especifica en el archivo YoutubeDL.py del paquete, usaremos el nombre origen del archivo y la extensión que especificamos en “postprocessors”.
¿Porque usamos el codec FLAC?
Esto porque la documentación de Speech to Text lo recomienda: Use a lossless codec to record and transmit audio.FLAC
orLINEAR16
is recommended.
Para descargar usamos el método ydl.download, requiere una lista, en la cual especificamos la URL de nuestro archivo.
Ejecutamos nuestro script y obtendremos algo como esto:
Pasos previos a la transcripción del audio
Utilizaremos la API de Speech to Text de GCP (Google Cloud Platform), si aun no tienes cuenta crea una aquí, GCP cuenta con un nivel gratuito.
NOTA: Google no patrocina esta publicación, hago referencia solo por el uso de Speech to Text.
Dentro de la Consola de GCloud crearemos un nuevo proyecto y lo seleccionamos, nos dirigimos a la opción API y Servicios > Biblioteca, dentro de la Biblioteca buscaremos Cloud Speech-to-Text API y la habilitamos.
Accedemos a la opción API y Servicios > Credenciales, y generamos una Clave de cuenta de servicio en formato JSON, esta acción es recomendada para servidores (en nuestro caso el equipo local), al crearla iniciará la descarga de la credencial (la nombraremos speech-key.json).
Almacenando speech-key.json localmente, establecemos la variable de entorno GOOGLE_APPLICATION_CREDENTIALS
export GOOGLE_APPLICATION_CREDENTIALS="/ruta-archivo/speech-key.json"
Obteniendo la transcripción del audio
Instalaremos el paquete google-cloud-speech
pip install google-cloud-speech
Este paquete cuenta con dos métodos para obtener la transcripción de un archivo de audio, el primero para audios cortos (con duración máxima de un minuto) y el segundo para audios largos (duración mayor a un minuto).
En nuestro caso utilizaremos audio largo (depende de la duración del audio extraído del video) y nos basaremos en el ejemplo proporcionado por la documentación de paquete para audios largos.
NOTA: Al trabajar con audios largos tendremos que alojar el archivo dentro de un Depósito en GCloud.
Subiendo un archivo a Cloud Storage
Para subir nuestro archivo de audio a un depósito, accederemos al proyecto creado, opción Storage > Navegador, y creamos un depósito Regional (lo nombraremos audio-devlife)
Ahora instalamos el paquete google-cloud-storage
pip install google-cloud-storage
Utilizamos el siguiente código para realizar la carga del archivo
Para tener un nombre mas corto y no tener que leer los archivos del directorio, renombramos el único archivo .flac que obtuvimos en la descarga como audio.flac
Instanciamos un Cliente de Storage(linea 6) y hacemos referencia al depósito (linea 7); con BLOB_PATH hacemos referencia al archivo que se encuentra al mismo nivel que el script actual y también indicaremos que se almacenará en la raíz del depósito; al solicitar la carga del archivo (linea 11) el método no devolverá ninguna respuesta, pero podemos usar la excepción GoogleCloudError para capturar el error al subir el archivo.
Para más detalles sobre el Paquete Storage visita su documentación
Continuando con la transcripción del audio
Una vez cargado el archivo de audio en el depósito proseguimos con la obtención de la transcripción, pero antes de ello instalaremos un paquete llamado audioread que nos ayudará a obtener el numero de canales del archivo de audio.
pip install audioread
¿Porqué instalamos el paquete audioread?
Al utilizar el método RecognitionConfig nos percatamos que en archivos de audios multicanal se necesita especificar el número de canales, por ello utilizaremos el parámetro audioChannelCount con el valor obtenido a través del paquete.
Así que para obtener la transcripción nuestro script quedará de la siguiente manera:
Reutilizamos BLOB_PATH para que con audioread (lineas 13-15) obtengamos el numero de canales y la frecuencia de muestreo; formateamos la uri de nuestro recurso en el déposito (linea 17) e instanciamos un cliente de Speech.
Especificamos dentro de audio la referencia al archivo de audio (linea 20) y especificamos los parámetros de su configuración (lineas 23–26) donde:
- encoding: Número entero (int:0–7) que especifica la codificación del audio, para nuestro caso enums.RecognitionConfig.AudioEncoding.FLAC = 2
- language_code: Cadena de texto (str) indica el lenguaje que tiene la mayor probabilidad de ser hablado en el audio, utiliza el código de idioma BCP-47
- audio_channel_count: Número entero (int) indica el número de canales en la entra de datos del audio, dependerá de la codificación.
- enable_separate_recognition_per_channel: Booleano (bool)se establece como Verdadero al especificar audio_channel_count
ejecutamos el método long_running_recognize (linea 28) para enviar el audio a la API de Speech, que recibe audios hasta de 80 minutos de duración, utilizando este método podemos recibir resultados a través de la interfaz de google.longrunning.Operations.
En nuestro caso no agregamos el callback, y esperaremos hasta que finalice la operación guardando el resultado en response (linea 29).
response es una lista del tipo SpeechRecognitionResult que contiene el resultado del reconocimiento de voz de una parte del Audio, con una lista de alternativas (result.alternatives) donde sus objetos son del tipo SpeechRecognitionAlternative y del cual podemos obtener la transcripción (transcript) y el nivel de confianza de la transcripción (confidence) este último retorna un valor entre 0.0 y 1.0
Buscando la frase vida de programador.
Agreguemos al script anterior algunas expresiones regulares, así como unos contadores para obtener el resultado que esperamos.
Al final obtendremos una salida como esta:
Consideraciones:
- Esta publicación abarca lo básico del paquete Speech to Text.
- El resultado tarda en mostrarse, esto porque no utilizamos callback para tener un seguimiento continuo, sé paciente.
- La transcripción no siempre será 100% fidedigna, ya que desconocemos todos los sonidos o ruido que exista en el audio, así como la cadencia y la dicción del orador u oradores.
- En otra publicación abordaremos la transcripción de archivos de audio cortos y con ello comprobaremos la fidelidad de la misma (espéralo)
- Si crees que existen partes para mejorar esta publicación no dudes en comentarlo, o mándame un tweet a Deiv Guerrero