Introduction
Hoy quiero compartir con ustedes una implementación en Python que desarrollé para utilizar el servicio de Speech to Text de Azure Cognitive Services.
Esta clase me resulto un reto interesante, especialmente en la parte de construcción de los eventos que menciona la documentación oficial de Azure. Pueden encontrar el código completo en mi repositorio de GitHub:
GitHub – mdiloreto/azure-speech-to-text-from-file
Siguiendo la documentación oficial, Azure permite realizar transcripciones de audio por un tiempo limitado (hasta 15 segundos) o hasta detectar un silencio. Sin embargo, para realizar transcripciones más largas en tiempo real, es necesario implementar callbacks utilizando los EventSignals.
A continuación, explico los eventos clave que el SpeechRecognizer de Azure puede manejar:
- recognizing: Se activa cuando el sistema genera resultados intermedios mientras procesa el audio, proporcionando transcripciones parciales.
- recognized: Este evento indica que se ha completado el reconocimiento exitoso de una porción del audio, generando una transcripción final.
- session_started: Señala el inicio de una sesión de reconocimiento. Cada vez que el sistema comienza a procesar el audio, este evento se activa.
- session_stopped: Marca el fin de la sesión de reconocimiento una vez que se ha procesado todo el audio o se ha detenido la operación.
- canceled: Ocurre cuando el reconocimiento es cancelado, ya sea por una solicitud explícita del usuario o por un fallo en la conexión o protocolo.
Debajo les dejo el detalle en la explicación de las secciones del codigo.
Importaciones y Configuración:
import os
import time
import azure.cognitiveservices.speech as speechsdk
os
: Para acceder a variables de entorno (en este caso, la clave de la API de Azure).time
: Se usa para manejar pausas en el bucle mientras se espera que finalice el reconocimiento de voz.
: Esta biblioteca de Azure proporciona acceso al servicio de reconocimiento de voz.azure.cognitiveservices.speech
Clase ExtractTranscript
:
Esta clase contiene los métodos necesarios para manejar el reconocimiento de voz y guardar las transcripciones.
Función continuous_recognition_handler
:
def continuous_recognition_handler(self, evt, transcriptions):
"""Handles the recognized speech."""
if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:
print(f"RECOGNIZED: {evt.result.text}")
transcriptions.append(evt.result.text)
- Este método es llamado cada vez que se reconoce una parte del audio.
- Si el resultado es exitoso (voz reconocida), se imprime y se agrega el texto reconocido a la lista
transcriptions
.
Función stop_cb
:
def stop_cb(self, evt, speech_recognizer):
"""Stops recognition when the stop event is received."""
print('CLOSING on {}'.format(evt))
speech_recognizer.stop_continuous_recognition()
global done
done = True
- Este método detiene el reconocimiento continuo cuando ocurre un evento de finalización o cancelación.
- Cambia la variable global
done
aTrue
para terminar el bucle principal del programa.
Función extract_transcript
:
def extract_transcript(self, audio_file):
"""Sets up continuous speech recognition from a file."""
global done
done = False
# Initialize a list to store transcriptions
transcriptions = []
# Set up the speech config
speech_key = os.getenv("AZURE_SPEECH_KEY")
service_region = "eastus"
speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)
auto_detect_source_language_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig(
languages=["en-US", "es-AR"])
# Set up the audio config using audio file
audio_config = speechsdk.audio.AudioConfig(filename=audio_file)
# Initialize the speech recognizer
speech_recognizer = speechsdk.SpeechRecognizer(
speech_config=speech_config,
auto_detect_source_language_config=auto_detect_source_language_config,
audio_config=audio_config
)
# Callbacks to events
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: self.continuous_recognition_handler(evt, transcriptions))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: self.stop_cb(evt, speech_recognizer))
speech_recognizer.canceled.connect(lambda evt: self.stop_cb(evt, speech_recognizer))
# Start continuous recognition
speech_recognizer.start_continuous_recognition()
# Keep the script running until the recognition is complete
while not done:
time.sleep(0.5)
return transcriptions
extract_transcript
realiza el reconocimiento de voz en un archivo de audio dado.- Configura las variables de entorno para Azure (clave de API y región) y en este caso agregue la detección automatico de lenguaje y español (en este caso, “en-US” y “es-AR”).
- Realiza la configuración del archivo de audio y crea un objeto
SpeechRecognizer
que inicia el reconocimiento continuo. - Los callbacks son el handling de los eventos para manejar las transcripciones. Basicamente permite gestionar la transcripción.
- Se detiene cuando la variable global
done
cambia aTrue
.
La siguiente linea:
speech_recognizer.recognized.connect(lambda evt: self.continuous_recognition_handler(evt, transcriptions))
Es la que se encarga de escribir las transcripciones en una lista transcriptions = [].
def continuous_recognition_handler(self, evt, transcriptions):
"""Handles the recognized speech."""
if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:
print(f"RECOGNIZED: {evt.result.text}")
transcriptions.append(evt.result.text)
Functions save_transcriptions_to_file
:
def save_transcriptions_to_file(self, transcriptions, file_name="transcriptions.txt"):
"""Save the transcriptions to a text file."""
with open(file_name, 'w', encoding='utf-8') as f:
for line in transcriptions:
f.write(line + '\n')
print(f"Transcriptions saved to {file_name}")
- Guarda las transcripciones obtenidas en un archivo de texto, una por línea, usando codificación UTF-8.
Leave a Reply