Cómo desarrollar un asistente de voz bilingüe

y Siri son los asistentes de voz ubicuos que sirven a la mayoría de la población conectada a Internet hoy. En su mayor parte, el inglés es el idioma dominante utilizado con estos asistentes de voz. Sin embargo, para que un asistente de voz sea realmente útil, debe ser capaz de comprender al usuario como hablan naturalmente. En muchas partes del mundo, especialmente en un país diverso como India, es común que las personas sean multilingües y cambien entre varios idiomas en una sola conversación. Un asistente verdaderamente inteligente debería poder manejar esto.

Google Assistant ofrece la capacidad de agregar un segundo idioma; Pero su funcionalidad se limita solo a ciertos dispositivos y ofrece esto solo para un conjunto limitado de idiomas principales. Por ejemplo, el Hub Nest de Google aún no es compatible con las capacidades bilingües para Tamil, un idioma hablado por más de 80 millones de personas. Alexa apoya el enfoque bilingüe siempre que sea compatible con su par de idiomas internos; Nuevamente, esto solo admite un conjunto limitado de idiomas principales. Siri no tiene capacidad bilingüe y permite solo un idioma a la vez.

En este artículo discutiré el enfoque adoptado para habilitar Mi asistente de voz tener una capacidad bilingüe con inglés y tamil como idiomas. Usando este enfoque, el asistente de voz podrá detectar automáticamente el lenguaje que una persona está hablando analizando el audio directamente. Al usar un algoritmo basado en “puntuación de confianza”, el sistema determinará si el inglés o el tamil se hablan y responden en el idioma correspondiente.

Enfoque de la capacidad bilingüe

Para que el asistente entienda tanto inglés como tamil, hay algunas soluciones potenciales. El primer enfoque sería entrenar un modelo de aprendizaje automático personalizado desde cero, específicamente en los datos del lenguaje tamil, y luego integrar ese modelo en la Raspberry Pi. Si bien esto ofrecería un alto grado de personalización, es un proceso increíblemente que requiere mucho tiempo e intensivo en recursos. Entrenar un modelo requiere un conjunto de datos masivo y una potencia computacional significativa. Además, ejecutar un modelo personalizado pesado probablemente ralentizaría la Raspberry Pi, lo que lleva a una mala experiencia del usuario.

enfoque de texto rápido

Una solución más práctica es utilizar un modelo existente previamente capacitado que ya está optimizado para una tarea específica. Para la identificación del idioma, una excelente opción es FastText.

FastText es una biblioteca de código abierto de Facebook AI Research diseñada para una clasificación de texto eficiente y representación de palabras. Viene con modelos previamente capacitados que pueden identificar de manera rápida y precisa el lenguaje de un texto determinado de una gran cantidad de idiomas. Debido a que es liviano y altamente optimizado, es una excelente opción para ejecutarse en un dispositivo con recursos limitados como una Raspberry Pi sin causar problemas de rendimiento significativos. El plan, por lo tanto, era usar fastText Para clasificar el idioma hablado del usuario.

Para usar FastText, descarga el modelo correspondiente (Lid.176.bin) y lo guarda en la carpeta de su proyecto. Especifique esto como model_path y cargue el modelo.

import fastText
import speech_recognition as sr
import fasttext

# --- Configuration ---
MODEL_PATH = "./lid.176.bin" # This is the model file you downloaded and unzipped

# --- Main Application Logic ---
print("Loading fastText language identification model...")
try:
    # Load the pre-trained model
    model = fasttext.load_model(MODEL_PATH)
except Exception as e:
    print(f"FATAL ERROR: Could not load the fastText model. Error: {e}")
    exit()

El siguiente paso sería pasar los comandos de voz, como grabaciones, al modelo y recuperar la predicción. Esto se puede lograr a través de una función dedicada.

def identify_language(text, model):
    # The model.predict() function returns a tuple of labels and probabilities
    predictions = model.predict(text, k=1)
    language_code = predictions[0][0] # e.g., '__label__en'
    return language_code

try:
    with microphone as source:
        recognizer.adjust_for_ambient_noise(source, duration=1)
        print("\nPlease speak now...")
        audio = recognizer.listen(source, phrase_time_limit=8)

    print("Transcribing audio...")
    # Get a rough transcription without specifying a language
    transcription = recognizer.recognize_google(audio)
    print(f"Heard: \"{transcription}\"")

    # Identify the language from the transcribed text
    language = identify_language(transcription, model)

    if language == '__label__en':
        print("\n---> Result: The detected language is English. <---")
    elif language == '__label__ta':
        print("\n---> Result: The detected language is Tamil. <---")
    else:
        print(f"\n---> Result: Detected a different language: {language}")

except sr.UnknownValueError:
    print("Could not understand the audio.")
except sr.RequestError as e:
    print(f"Speech recognition service error; {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

El bloque de código anterior sigue una ruta simple. Usa el Reconconizer.Recognize_Google (audio) Funciona para transcribir el comando de voz y luego pasa esta transcripción al modelo FastText para obtener una predicción en el idioma. Si la predicción es “__label__en”, entonces se ha detectado el inglés y si la predicción es “__label_ta”, entonces se ha detectado tamil.

Sin embargo, este enfoque condujo a malas predicciones. El problema es que Spice_recognition La biblioteca predeterminada al inglés. Entonces, cuando hablo algo en tamil, encuentra las palabras sonoras equivalentes más cercanas (e incorrectas) en inglés y lo pasa a FastText.

Por ejemplo cuando dije “En peyar enna” (¿Cuál es mi nombre en tamil), Spice_recognition lo entendió como “Imperio na” y, por lo tanto, FastText predijo el idioma como inglés. Para superar esto, puedo codificar el Spice_recognition función para detectar solo tamil. Pero esto derrotaría la idea de ser verdaderamente “inteligente” y “bilingüe”. El asistente debe poder detectar el idioma en función de lo que se habla; no basado en lo que está codificado.

Foto Fotografía de Siora en Sin estelares

El método de ‘puntaje de confianza’

Lo que necesitamos es un método más directo y basado en datos. La solución se encuentra dentro de una característica de la biblioteca Speech_Recognition. El Reconconator.Recognize_Google () La función es la API de reconocimiento de voz de Google y puede transcribir audio a partir de un gran número de idiomas, incluidos el inglés y el tamil. Una característica clave de esta API es que para cada transcripción que proporciona, también puede devolver un puntaje de confianza – Un valor numérico entre 0 y 1, lo que indica cuán seguro es que su transcripción es correcta.

Esta característica permite un enfoque mucho más elegante y dinámico para la identificación del lenguaje. Echemos un vistazo al código.

def recognize_with_confidence(recognizer, audio_data):
    
    tamil_text = None
    tamil_confidence = 0.0
    english_text = None
    english_confidence = 0.0

    # 1. Attempt to recognize as Tamil and get confidence
    try:
        print("Attempting to transcribe as Tamil...")
        # show_all=True returns a dictionary with transcription alternatives
        response_tamil = recognizer.recognize_google(audio_data, language='ta-IN', show_all=True)
        # We only look at the top alternative
        if response_tamil and 'alternative' in response_tamil:
            top_alternative = response_tamil['alternative'][0]
            tamil_text = top_alternative['transcript']
            if 'confidence' in top_alternative:
                tamil_confidence = top_alternative['confidence']
            else:
                tamil_confidence = 0.8 # Assign a default high confidence if not provided
    except sr.UnknownValueError:
        print("Could not understand audio as Tamil.")
    except sr.RequestError as e:
        print(f"Tamil recognition service error; {e}")

    # 2. Attempt to recognize as English and get confidence
    try:
        print("Attempting to transcribe as English...")
        response_english = recognizer.recognize_google(audio_data, language='en-US', show_all=True)
        if response_english and 'alternative' in response_english:
            top_alternative = response_english['alternative'][0]
            english_text = top_alternative['transcript']
            if 'confidence' in top_alternative:
                english_confidence = top_alternative['confidence']
            else:
                english_confidence = 0.8 # Assign a default high confidence
    except sr.UnknownValueError:
        print("Could not understand audio as English.")
    except sr.RequestError as e:
        print(f"English recognition service error; {e}")

    # 3. Compare confidence scores and return the winner
    print(f"\nConfidence Scores -> Tamil: {tamil_confidence:.2f}, English: {english_confidence:.2f}")
    if tamil_confidence > english_confidence:
        return tamil_text, "Tamil"
    elif english_confidence > tamil_confidence:
        return english_text, "English"
    else:
        # If scores are equal (or both zero), return neither
        return None, None

La lógica en este bloque de código es simple. Pasamos el audio al reconocimiento_google () funcione y obtenga toda la lista de alternativas y sus puntajes. Primero probamos el idioma como tamil y obtenemos el puntaje de confianza correspondiente. Luego probamos el mismo audio que el inglés y obtenemos el puntaje de confianza correspondiente de la API. Una vez que tenemos ambos, comparamos los puntajes de confianza y elegimos el que tiene el puntaje más alto como el lenguaje detectado por el sistema.

A continuación se muestra la salida de la función cuando hablo en inglés y cuando hablo en tamil.

Captura de pantalla de la salida de Visual Studio (tamil). Imagen propiedad del autor.
Captura de pantalla de la salida de Visual Studio (inglés). Imagen propiedad del autor.

Los resultados anteriores muestran cómo el código puede comprender el lenguaje que se habla dinámicamente, en función del puntaje de confianza.

Poniendo todo junto: el asistente bilingüe

El paso final sería integrar este enfoque en el código para el asistente de voz basado en Raspberry Pi. El código completo se puede encontrar en mi Github. Una vez integrado, el siguiente paso sería probar el funcionamiento del asistente de voz hablando en inglés y tamil y viendo cómo responde para cada idioma. Las grabaciones a continuación demuestran el funcionamiento del asistente de voz bilingüe cuando se le hace una pregunta en inglés y en tamil.

https://www.youtube.com/watch?v=-ufo7xh3kog

https://www.youtube.com/watch?v=a7enyxj9ofo

Conclusión

En este artículo, hemos visto cómo actualizar con éxito un asistente de voz simple en una herramienta verdaderamente bilingüe. Al implementar un algoritmo de “puntaje de confianza”, el sistema se puede hacer para determinar si se habla un comando en inglés o tamil, lo que permite que comprenda y responda en el idioma elegido del usuario para esa consulta específica. Esto crea una experiencia de conversación más natural y perfecta.

La ventaja clave de este método es su confiabilidad y escalabilidad. Si bien este proyecto se centró en solo dos idiomas, la misma lógica de puntaje de confianza podría extenderse fácilmente para admitir tres, cuatro o más simplemente agregando una llamada API para cada nuevo idioma y comparando todos los resultados. Las técnicas exploradas aquí sirven como una base robusta para crear herramientas de IA personales más avanzadas e intuitivas.

Referencia:

[1] A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, Bolsa de trucos para una clasificación de texto eficiente

[2] A. Joulin, E. Grave, P. Bojanowski, M. Douze, H. Jégou, T. Mikolov, FastText.zip: modelos de clasificación de texto de comprimir