Speech to Text desde un archivo con Python

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.
  • azure.cognitiveservices.speech: Esta biblioteca de Azure proporciona acceso al servicio de reconocimiento de voz.

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 a True 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 a True.

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.

Posted

in

,

by

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.