Reconocimiento de voz

Documentación de referencia | Paquete (NuGet) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Creación de una configuración de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de SpeechConfig. Esta clase incluye información sobre la suscripción, como la clave y la región o ubicación asociada, el punto de conexión, el host, o el token de autorización.

  1. Cree una instancia de SpeechConfig mediante la clave y la región o ubicación.
  2. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    }
}

Puede inicializar SpeechConfig de varias maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. La clave y el token de autorización son opcionales.
  • Use un host y pase una dirección de host. La clave y el token de autorización son opcionales.
  • Use un token de autorización con la región o ubicación asociada.

Nota:

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.

Reconocimiento de voz a través de un micrófono

Para reconocer voz mediante el micrófono del dispositivo, cree una instancia de AudioConfig mediante el método FromDefaultMicrophoneInput(). A continuación, para inicializar el objeto SpeechRecognizer, pase speechConfig y audioConfig.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromMic(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        Console.WriteLine("Speak into your microphone.");
        var result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromMic(speechConfig);
    }
}

Si desea usar un dispositivo de entrada de audio específico, debe especificar el identificador de dispositivo en la clase AudioConfig. Obtenga información sobre cómo obtener el identificador del dispositivo de entrada de audio.

Reconocer la voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de un micrófono, tiene que crear una instancia de AudioConfig. Pero para este caso no llama a FromDefaultMicrophoneInput(). Llama a FromWavFileInput() y pasa la ruta del archivo:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromFile(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        var result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromFile(speechConfig);
    }
}

Reconocimiento de voz a partir de una secuencia en memoria

En muchos casos de uso, posiblemente los datos de audio procederán de Azure Blob Storage o, de lo contrario, ya estarán en memoria como una instancia de byte[] o una estructura de datos sin procesar similar. En el ejemplo siguiente se usa PushAudioInputStream para reconocer la voz, que es básicamente una secuencia de memoria abstracta. En el código de ejemplo se realizan las tareas siguientes:

  • Escribe los datos de audio sin formato (PCM) en PushAudioInputStream mediante la función Write(), que acepta una instancia de byte[].
  • Lee un archivo .wav mediante FileReader con fines de demostración. Si ya tiene datos de audio en una instancia de byte[], puede pasar directamente a escribir el contenido en el flujo de entrada.
  • El formato predeterminado es datos de modulación de código de pulso mono (PCM) de 16 bits y 16 KHz. Para personalizar el formato, puede pasar un objeto AudioStreamFormat a CreatePushStream() mediante la función estática AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels).
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromStream(SpeechConfig speechConfig)
    {
        var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
        using var audioConfigStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioConfigStream);
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        byte[] readBytes;
        do
        {
            readBytes = reader.ReadBytes(1024);
            audioConfigStream.Write(readBytes, readBytes.Length);
        } while (readBytes.Length > 0);

        var result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromStream(speechConfig);
    }
}

El uso de una secuencia de extracción como entrada interpreta que los datos de audio son un PCM sin formato; es decir, se omiten los encabezados. La API seguirá funcionando en determinados casos si no se ha omitido el encabezado. Para obtener los mejores resultados, considere la posibilidad de implementar lógica para leer los encabezados de modo que byte[] esté al principio de los datos de audio.

Control de errores

Los ejemplos anteriores simplemente obtienen el texto reconocido de la propiedad result.Text. Para controlar errores y otras respuestas, debe escribir código para controlar el resultado. En el código siguiente se evalúa la propiedad result.Reason y:

  • Imprime el resultado del reconocimiento: ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, se informa al usuario: ResultReason.NoMatch.
  • Si se produce un error, se imprime el mensaje de error: ResultReason.Canceled.
switch (result.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(result);
        Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

        if (cancellation.Reason == CancellationReason.Error)
        {
            Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
            Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
            Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
        }
        break;
}

Uso del reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento de una sola captura, que reconoce una única expresión. El final de una expresión única se determina mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio.

En cambio, puede usar el reconocimiento continuo para establecer cuándo detener el reconocimiento. Requiere que se suscriba a los eventos Recognizing, Recognized y Canceled para obtener los resultados del reconocimiento. Para detener el reconocimiento, debe llamar a StopContinuousRecognitionAsync. Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience por definir la entrada e inicializar SpeechRecognizer:

using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

A continuación, cree una instancia de TaskCompletionSource<int> para administrar el estado del reconocimiento de voz.

var stopRecognition = new TaskCompletionSource<int>();

A continuación, suscríbase a los eventos que envía SpeechRecognizer:

  • Recognizing: señala los eventos que contienen los resultados intermedios del reconocimiento.
  • Recognized: señala los eventos que contienen los resultados finales del reconocimiento (lo que indica un intento de reconocimiento correcto).
  • SessionStopped: señala los eventos que indican el final de una sesión de reconocimiento (operación).
  • Canceled: señala los eventos que contienen los resultados cancelados del reconocimiento. Estos resultados indican un intento de reconocimiento que se canceló como resultado de una solicitud de cancelación directa. Como alternativa, indican un error de transporte o protocolo.
speechRecognizer.Recognizing += (s, e) =>
{
    Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};

speechRecognizer.Recognized += (s, e) =>
{
    if (e.Result.Reason == ResultReason.RecognizedSpeech)
    {
        Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
    }
    else if (e.Result.Reason == ResultReason.NoMatch)
    {
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.Canceled += (s, e) =>
{
    Console.WriteLine($"CANCELED: Reason={e.Reason}");

    if (e.Reason == CancellationReason.Error)
    {
        Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
        Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
        Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
    }

    stopRecognition.TrySetResult(0);
};

speechRecognizer.SessionStopped += (s, e) =>
{
    Console.WriteLine("\n    Session stopped event.");
    stopRecognition.TrySetResult(0);
};

Cuando todo esté configurado, llame a StartContinuousRecognitionAsync para iniciar el reconocimiento:

await speechRecognizer.StartContinuousRecognitionAsync();

// Waits for completion. Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });

// Make the following call at some point to stop recognition:
// await speechRecognizer.StopContinuousRecognitionAsync();

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, busque la instancia de SpeechConfig y agregue esta línea directamente debajo:

speechConfig.SpeechRecognitionLanguage = "it-IT";

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Para obtener más información, consulte la lista de configuraciones regionales de conversión de voz en texto admitidas.

Identificación del idioma

Puede usar la identificación de idioma con el reconocimiento para conversión de voz en texto cuando necesite identificar el idioma de un origen de audio y transcribirlo en texto.

Para obtener un ejemplo de código completo, vea identificación de idioma.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado.

var speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Cambiar cómo se controla el silencio

Si se espera que un usuario hable más rápido o más lento de lo habitual, es posible que los comportamientos predeterminados para el silencio que no sea de voz en el audio de entrada no produzcan lo esperado. Entre los problemas comunes con el control de silencio se incluyen:

  • Encadenamiento rápido de voz entre muchas oraciones en un solo resultado de reconocimiento en lugar de dividir oraciones en resultados individuales.
  • Separar las partes de habla lenta de una oración en varios resultados.
  • El reconocimiento de una sola captura termina demasiado rápido mientras se espera a que comience la voz.

Estos problemas se pueden solucionar estableciendo una de las dos propiedades de tiempo de espera en la instancia SpeechConfig utilizada para crear un SpeechRecognizer:

  • El tiempo de espera de silencio de segmentación ajusta la cantidad de audio que no es de voz permitida dentro de una frase que se está hablando en el momento antes de que se considere que la frase ha "terminado".
    • Los valores más elevados normalmente generan resultados más largos y permiten pausas más largas del hablante dentro de una frase, pero los resultados tardan más tiempo en llegar. También pueden hacer que frases independientes se combinen en un único resultado cuando son demasiado altos.
    • Los valores más bajos normalmente generan resultados más cortos y aseguran interrupciones más frecuentes y rápidas entre frases, pero también pueden hacer que las frases individuales se separen en varios resultados cuando son demasiado bajos.
    • Este tiempo de espera se puede establecer en valores enteros entre 100 y 5000, en milisegundos, y 500 es el valor predeterminado típico.
  • El tiempo de espera de silencio inicial ajusta la cantidad de audio que no es de voz permitida antes de una frase antes de que el intento de reconocimiento termine en un resultado "sin coincidencia".
    • Los valores más altos dan a los hablantes más tiempo para reaccionar y empezar a hablar, pero también pueden dar lugar a una capacidad de respuesta lenta cuando no se habla nada.
    • Los valores más bajos garantizan un mensaje "sin coincidencia" para una experiencia de usuario más rápida y un mayor control de audio, pero puede cortar a un hablante demasiado rápido cuando los valores establecidos sean demasiado bajos.
    • Dado que el reconocimiento continuo genera muchos resultados, este valor determina la frecuencia con la que llegarán los resultados "sin coincidencia", pero no afecta al contenido de los resultados del reconocimiento.
    • Este tiempo de espera se puede definir como cualquier valor entero no negativo, en milisegundos, o establecerse en 0 para deshabilitarlo por completo. 5000 es un valor predeterminado típico para el reconocimiento de una sola captura, mientras que 15 000 es un valor predeterminado típico para el reconocimiento continuo.

Dado que hay inconvenientes al modificar estos tiempos de espera, solo se recomienda cambiar la configuración cuando se observa un problema relacionado con el control de silencio. Los valores predeterminados controlan de forma óptima la mayoría del audio hablado y solo se encuentran problemas en los escenarios poco comunes.

Ejemplo: los usuarios que dictan un número de serie como "ABC-123-4567" pueden hacer una pausa entre grupos lo suficientemente larga para que el número de serie se divida en varios resultados. En este caso, pruebe un valor superior como 2000 ms para el tiempo de espera de silencio de segmentación:

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "2000");

Ejemplo: la voz de un moderador grabado es lo suficientemente rápida como para que varias oraciones de una fila se combinen, con grandes resultados de reconocimiento que solo llegan una o dos veces por minuto. En este caso, establezca el tiempo de espera de silencio de segmentación en un valor inferior, como 300 ms:

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "300");

Ejemplo: un reconocimiento de una sola toma que pide a un hablante que busque y lea un número de serie termina demasiado rápido mientras se busca el número. En este caso, pruebe un tiempo de espera de silencio inicial más largo, como 10 000 ms:

speechConfig.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "10000");

Documentación de referencia | Paquete (NuGet) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Creación de una configuración de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de SpeechConfig. Esta clase incluye información sobre la suscripción, como la clave y la región o ubicación asociada, el punto de conexión, el host, o el token de autorización.

  1. Cree una instancia de SpeechConfig mediante la clave y la región.
  2. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio.
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");

Puede inicializar SpeechConfig de varias maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. La clave y el token de autorización son opcionales.
  • Use un host y pase una dirección de host. La clave y el token de autorización son opcionales.
  • Use un token de autorización con la región o ubicación asociada.

Nota:

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.

Reconocimiento de voz a través de un micrófono

Para reconocer voz mediante el micrófono del dispositivo, cree una instancia de AudioConfig mediante la función de miembro FromDefaultMicrophoneInput(). A continuación, para inicializar el objeto SpeechRecognizer, pase audioConfig y config.

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

cout << "Speak into your microphone." << std::endl;
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

Si desea usar un dispositivo de entrada de audio específico, debe especificar el identificador de dispositivo en la clase AudioConfig. Para obtener más información sobre cómo seleccionar un id. de dispositivo de entrada de audio, consulte Selección de un dispositivo de entrada de audio con el SDK de Voz

Reconocer la voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de usar un micrófono, tiene que crear una instancia de AudioConfig. Pero para este caso no llama a FromDefaultMicrophoneInput(). Llama a FromWavFileInput() y pasa la ruta del archivo:

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

Reconocimiento de voz mediante la clase Recognizer

La clase Recognizer de Speech SDK para C++ expone algunos métodos que puede usar para el reconocimiento de voz.

Reconocimiento de una sola captura

El reconocimiento de una sola captura reconoce de forma asincrónica una única expresión. El final de una expresión única se determina mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio. Este es un ejemplo de reconocimiento asincrónico de una sola captura mediante RecognizeOnceAsync:

auto result = speechRecognizer->RecognizeOnceAsync().get();

Debe escribir código para controlar el resultado. Este ejemplo evalúa el elemento result->Reason y:

  • Imprime el resultado del reconocimiento: ResultReason::RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, se informa al usuario: ResultReason::NoMatch.
  • Si se produce un error, se imprime el mensaje de error: ResultReason::Canceled.
switch (result->Reason)
{
    case ResultReason::RecognizedSpeech:
        cout << "We recognized: " << result->Text << std::endl;
        break;
    case ResultReason::NoMatch:
        cout << "NOMATCH: Speech could not be recognized." << std::endl;
        break;
    case ResultReason::Canceled:
        {
            auto cancellation = CancellationDetails::FromResult(result);
            cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
    
            if (cancellation->Reason == CancellationReason::Error) {
                cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
                cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
                cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
            }
        }
        break;
    default:
        break;
}

Reconocimiento continuo

El reconocimiento continuo es un poco más complicado que el reconocimiento de una sola captura. Requiere que se suscriba a los eventos Recognizing, Recognized y Canceled para obtener los resultados del reconocimiento. Para detener el reconocimiento, debe llamar a StopContinuousRecognitionAsync. Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience por definir la entrada e inicializar SpeechRecognizer:

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

A continuación, cree una variable para administrar el estado del reconocimiento de voz. Declare promise<void> porque, al principio del reconocimiento, puede suponer con seguridad que no ha finalizado:

promise<void> recognitionEnd;

A continuación, suscríbase a los eventos que envía SpeechRecognizer:

  • Recognizing: señala los eventos que contienen los resultados intermedios del reconocimiento.
  • Recognized: señala los eventos que contienen los resultados finales del reconocimiento (lo que indica un intento de reconocimiento correcto).
  • SessionStopped: señala los eventos que indican el final de una sesión de reconocimiento (operación).
  • Canceled: señala los eventos que contienen los resultados cancelados del reconocimiento. Estos resultados indican un intento de reconocimiento que se canceló como resultado de una solicitud de cancelación directa. Como alternativa, indican un error de transporte o protocolo.
speechRecognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
    {
        cout << "Recognizing:" << e.Result->Text << std::endl;
    });

speechRecognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
    {
        if (e.Result->Reason == ResultReason::RecognizedSpeech)
        {
            cout << "RECOGNIZED: Text=" << e.Result->Text 
                 << " (text could not be translated)" << std::endl;
        }
        else if (e.Result->Reason == ResultReason::NoMatch)
        {
            cout << "NOMATCH: Speech could not be recognized." << std::endl;
        }
    });

speechRecognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
    {
        cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
        if (e.Reason == CancellationReason::Error)
        {
            cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
                 << "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
                 << "CANCELED: Did you set the speech resource key and region values?" << std::endl;

            recognitionEnd.set_value(); // Notify to stop recognition.
        }
    });

speechRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
    {
        cout << "Session stopped.";
        recognitionEnd.set_value(); // Notify to stop recognition.
    });

Cuando todo esté configurado, llame a StopContinuousRecognitionAsync para iniciar el reconocimiento:

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer->StartContinuousRecognitionAsync().get();

// Waits for recognition end.
recognitionEnd.get_future().get();

// Stops recognition.
speechRecognizer->StopContinuousRecognitionAsync().get();

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a alemán. En el código, busque la instancia de SpeechConfig y agregue esta línea directamente debajo:

speechConfig->SetSpeechRecognitionLanguage("de-DE");

SetSpeechRecognitionLanguage es un parámetro que toma una cadena como argumento. Para obtener más información, consulte la lista de configuraciones regionales de conversión de voz en texto admitidas.

Identificación del idioma

Puede usar la identificación de idioma con el reconocimiento para conversión de voz en texto cuando necesite identificar el idioma de un origen de audio y transcribirlo en texto.

Para obtener un ejemplo de código completo, vea identificación de idioma.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado.

auto speechConfig = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Documentación de referencia | Paquete (Go) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Reconocimiento para la conversión de voz en texto desde un micrófono

Use el siguiente ejemplo de código para ejecutar el reconocimiento de voz desde el micrófono del dispositivo predeterminado. Reemplace las variables subscription y region por la clave de voz y la suscripción o región respectivamente. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio. Al ejecutar el script, se iniciará una sesión de reconocimiento en el micrófono y el texto de salida predeterminados:

package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func sessionStartedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Started (ID=", event.SessionID, ")")
}

func sessionStoppedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}

func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognizing:", event.Result.Text)
}

func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognized:", event.Result.Text)
}

func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
	defer event.Close()
	fmt.Println("Received a cancellation: ", event.ErrorDetails)
	fmt.Println("Did you set the speech resource key and region values?")
}

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"

	audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(sessionStartedHandler)
	speechRecognizer.SessionStopped(sessionStoppedHandler)
	speechRecognizer.Recognizing(recognizingHandler)
	speechRecognizer.Recognized(recognizedHandler)
	speechRecognizer.Canceled(cancelledHandler)
	speechRecognizer.StartContinuousRecognitionAsync()
	defer speechRecognizer.StopContinuousRecognitionAsync()
	bufio.NewReader(os.Stdin).ReadBytes('\n')
}

Ejecute los comandos siguientes para crear un archivo go.mod que vincule a los componentes hospedados en GitHub:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Compile y ejecute ahora el código:

go build
go run quickstart

Para obtener información detallada, consulte el contenido de referencia de la clase SpeechConfig y el contenido de referencia de la clase SpeechRecognizer.

Reconocimiento para la conversión de voz en texto desde un archivo de audio

Use el ejemplo siguiente para ejecutar el reconocimiento de voz desde un archivo de audio. Reemplace las variables subscription y region por la clave de voz y la suscripción o región respectivamente. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio. Además, reemplace la variable file por una ruta de acceso a un archivo .wav. Al ejecutar el script, reconoce la voz del archivo y genera el resultado del texto:

package main

import (
	"fmt"
	"time"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"
    file := "path/to/file.wav"

	audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Started (ID=", event.SessionID, ")")
	})
	speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Stopped (ID=", event.SessionID, ")")
	})

	task := speechRecognizer.RecognizeOnceAsync()
	var outcome speech.SpeechRecognitionOutcome
	select {
	case outcome = <-task:
	case <-time.After(5 * time.Second):
		fmt.Println("Timed out")
		return
	}
	defer outcome.Close()
	if outcome.Error != nil {
		fmt.Println("Got an error: ", outcome.Error)
	}
	fmt.Println("Got a recognition!")
	fmt.Println(outcome.Result.Text)
}

Ejecute los comandos siguientes para crear un archivo go.mod que vincule a los componentes hospedados en GitHub:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Compile y ejecute ahora el código:

go build
go run quickstart

Para obtener información detallada, consulte el contenido de referencia de la clase SpeechConfig y el contenido de referencia de la clase SpeechRecognizer.

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Documentación de referencia | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Creación de una configuración de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de SpeechConfig. Esta clase incluye información sobre la suscripción, como la clave y la región o ubicación asociada, el punto de conexión, el host, o el token de autorización.

  1. Cree una instancia de SpeechConfig mediante la clave y la región o ubicación.
  2. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
    }
}

Puede inicializar SpeechConfig de varias maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. La clave y el token de autorización son opcionales.
  • Use un host y pase una dirección de host. La clave y el token de autorización son opcionales.
  • Use un token de autorización con la región o ubicación asociada.

Nota:

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.

Reconocimiento de voz a través de un micrófono

Para reconocer voz mediante el micrófono del dispositivo, cree una instancia de AudioConfig mediante el método fromDefaultMicrophoneInput(). A continuación, para inicializar el objeto SpeechRecognizer, pase audioConfig y config.

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        fromMic(speechConfig);
    }

    public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        System.out.println("Speak into your microphone.");
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

Si desea usar un dispositivo de entrada de audio específico, debe especificar el identificador de dispositivo en la clase AudioConfig. Para obtener más información sobre cómo seleccionar un id. de dispositivo de entrada de audio, consulte Selección de un dispositivo de entrada de audio con el SDK de Voz.

Reconocer la voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de usar un micrófono, tiene que crear una instancia de AudioConfig. Pero para este caso no llama a FromDefaultMicrophoneInput(). Llame a fromWavFileInput() y pase la ruta del archivo:

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        fromFile(speechConfig);
    }

    public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

Control de errores

Los ejemplos anteriores simplemente obtienen el texto reconocido mediante result.getText(). Para controlar errores y otras respuestas, debe escribir código para controlar el resultado. En el ejemplo siguiente, se evalúa result.getReason() y:

  • Imprime el resultado del reconocimiento: ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, se informa al usuario: ResultReason.NoMatch.
  • Si se produce un error, se imprime el mensaje de error: ResultReason.Canceled.
switch (result.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + result.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(result);
            System.out.println("CANCELED: Reason=" + cancellation.getReason());

            if (cancellation.getReason() == CancellationReason.Error) {
                System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                System.out.println("CANCELED: Did you set the speech resource key and region values?");
            }
        }
        break;
}

Uso del reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento de una sola captura, que reconoce una única expresión. El final de una expresión única se determina mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio.

En cambio, puede usar el reconocimiento continuo para establecer cuándo detener el reconocimiento. Requiere que se suscriba a los eventos recognizing, recognized y canceled para obtener los resultados del reconocimiento. Para detener el reconocimiento, debe llamar a stopContinuousRecognitionAsync. Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience por definir la entrada e inicializar SpeechRecognizer:

AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(config, audioConfig);

A continuación, cree una variable para administrar el estado del reconocimiento de voz. Declare una instancia de Semaphore en el ámbito de clase:

private static Semaphore stopTranslationWithFileSemaphore;

A continuación, suscríbase a los eventos que envía SpeechRecognizer:

  • recognizing: señala los eventos que contienen los resultados intermedios del reconocimiento.
  • recognized: señala los eventos que contienen los resultados finales del reconocimiento (lo que indica un intento de reconocimiento correcto).
  • sessionStopped: señala los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: señala los eventos que contienen los resultados cancelados del reconocimiento. Estos resultados indican un intento de reconocimiento que se canceló como resultado de una solicitud de cancelación directa. Como alternativa, indican un error de transporte o protocolo.
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);

speechRecognizer.recognizing.addEventListener((s, e) -> {
    System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});

speechRecognizer.recognized.addEventListener((s, e) -> {
    if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
        System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
    }
    else if (e.getResult().getReason() == ResultReason.NoMatch) {
        System.out.println("NOMATCH: Speech could not be recognized.");
    }
});

speechRecognizer.canceled.addEventListener((s, e) -> {
    System.out.println("CANCELED: Reason=" + e.getReason());

    if (e.getReason() == CancellationReason.Error) {
        System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
        System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
        System.out.println("CANCELED: Did you set the speech resource key and region values?");
    }

    stopTranslationWithFileSemaphore.release();
});

speechRecognizer.sessionStopped.addEventListener((s, e) -> {
    System.out.println("\n    Session stopped event.");
    stopTranslationWithFileSemaphore.release();
});

Cuando todo esté configurado, llame a startContinuousRecognitionAsync para iniciar el reconocimiento:

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer.startContinuousRecognitionAsync().get();

// Waits for completion.
stopTranslationWithFileSemaphore.acquire();

// Stops recognition.
speechRecognizer.stopContinuousRecognitionAsync().get();

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a francés. En el código, busque la instancia de SpeechConfig y agregue esta línea directamente debajo:

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage es un parámetro que toma una cadena como argumento. Consulte la lista de configuraciones regionales de conversión de voz en texto admitidas.

Identificación del idioma

Puede usar la identificación de idioma con el reconocimiento para conversión de voz en texto cuando necesite identificar el idioma de un origen de audio y transcribirlo en texto.

Para obtener un ejemplo de código completo, vea identificación de idioma.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado:

SpeechConfig speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Documentación de referencia | Paquete (npm) | Ejemplos adicionales en GitHub | Código fuente de la biblioteca

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Creación de una configuración de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de SpeechConfig. Esta clase incluye información sobre la suscripción, como la clave y la región o ubicación asociada, el punto de conexión, el host, o el token de autorización.

  1. Cree una instancia de SpeechConfig mediante la clave y la región o ubicación.
  2. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio.
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

Puede inicializar SpeechConfig de varias maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. La clave y el token de autorización son opcionales.
  • Use un host y pase una dirección de host. La clave y el token de autorización son opcionales.
  • Use un token de autorización con la región o ubicación asociada.

Nota:

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.

Reconocimiento de voz a través de un micrófono

El reconocimiento de voz desde un micrófono no se admite en Node.js. Solo se admite en un entorno de JavaScript basado en explorador. Para obtener más información, consulte el ejemplo de React y la implementación de la conversión de voz en texto a través de un micrófono en GitHub. En el ejemplo de React se muestran patrones de diseño para el intercambio y la administración de tokens de autenticación. También se muestra la captura de audio desde un micrófono o un archivo para realizar conversiones de voz en texto.

Nota:

Si desea usar un dispositivo de entrada de audio específico, debe especificar el id. del dispositivo en el objeto AudioConfig. Para obtener más información, vea Selección de un dispositivo de entrada de audio con el SDK de Voz.

Reconocer la voz a partir de un archivo

Para reconocer la voz de un archivo de audio, cree una instancia de AudioConfig mediante fromWavFileInput() que acepte un objeto Buffer. A continuación, para inicializar SpeechRecognizer, pase audioConfig y speechConfig.

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

function fromFile() {
    let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromFile();

Reconocimiento de voz a partir de una secuencia en memoria

En muchos casos de uso, los datos de audio posiblemente procederán de Azure Blob Storage. O bien, ya estarán en memoria como un ArrayBuffer o una estructura de datos sin procesar similar. El código siguiente:

  • Crea una secuencia de entrada mediante createPushStream().
  • Lea un archivo .wav mediante fs.createReadStream con fines de demostración. Si ya tiene datos de audio en ArrayBuffer, puede pasar directamente a escribir el contenido en el flujo de entrada.
  • Crea una configuración de audio mediante el flujo de inserción.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

function fromStream() {
    let pushStream = sdk.AudioInputStream.createPushStream();

    fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
        pushStream.write(arrayBuffer.slice());
    }).on('end', function() {
        pushStream.close();
    });
 
    let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromStream();

El uso de una secuencia de inserción como entrada interpreta que los datos de audio son datos sin formato de modulación por código de pulso (PCM) que omiten los encabezados. La API seguirá funcionando en determinados casos si no se omitió el encabezado. Para obtener los mejores resultados, considere la posibilidad de implementar lógica para leer los encabezados de modo que fs esté al principio de los datos de audio.

Control de errores

Los ejemplos anteriores simplemente obtienen el texto reconocido de la propiedad result.text. Para controlar errores y otras respuestas, debe escribir código para controlar el resultado. En el código siguiente se evalúa la propiedad result.reason y:

  • Imprime el resultado del reconocimiento: ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, se informa al usuario: ResultReason.NoMatch.
  • Si se produce un error, se imprime el mensaje de error: ResultReason.Canceled.
switch (result.reason) {
    case sdk.ResultReason.RecognizedSpeech:
        console.log(`RECOGNIZED: Text=${result.text}`);
        break;
    case sdk.ResultReason.NoMatch:
        console.log("NOMATCH: Speech could not be recognized.");
        break;
    case sdk.ResultReason.Canceled:
        const cancellation = sdk.CancellationDetails.fromResult(result);
        console.log(`CANCELED: Reason=${cancellation.reason}`);

        if (cancellation.reason == sdk.CancellationReason.Error) {
            console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
            console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
            console.log("CANCELED: Did you set the speech resource key and region values?");
        }
        break;
    }

Uso del reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento de una sola captura, que reconoce una única expresión. El final de una expresión única se determina mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio.

En cambio, use el reconocimiento continuo para establecer cuándo detener el reconocimiento. Requiere que se suscriba a los eventos Recognizing, Recognized y Canceled para obtener los resultados del reconocimiento. Para detener el reconocimiento, debe llamar a stopContinuousRecognitionAsync. Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience por definir la entrada e inicializar SpeechRecognizer:

const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

A continuación, suscríbase a los eventos enviados desde SpeechRecognizer:

  • recognizing: señala los eventos que contienen los resultados intermedios del reconocimiento.
  • recognized: señala los eventos que contienen los resultados finales del reconocimiento (lo que indica un intento de reconocimiento correcto).
  • sessionStopped: señala los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: señala los eventos que contienen los resultados cancelados del reconocimiento. Estos resultados indican un intento de reconocimiento que se canceló como resultado de una solicitud de cancelación directa. Como alternativa, indican un error de transporte o protocolo.
speechRecognizer.recognizing = (s, e) => {
    console.log(`RECOGNIZING: Text=${e.result.text}`);
};

speechRecognizer.recognized = (s, e) => {
    if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
        console.log(`RECOGNIZED: Text=${e.result.text}`);
    }
    else if (e.result.reason == sdk.ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);

    if (e.reason == sdk.CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you set the speech resource key and region values?");
    }

    speechRecognizer.stopContinuousRecognitionAsync();
};

speechRecognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    speechRecognizer.stopContinuousRecognitionAsync();
};

Cuando todo esté configurado, llame a startContinuousRecognitionAsync para iniciar el reconocimiento:

speechRecognizer.startContinuousRecognitionAsync();

// Make the following call at some point to stop recognition:
// speechRecognizer.stopContinuousRecognitionAsync();

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, busque la instancia de SpeechConfig y agregue esta línea directamente debajo:

speechConfig.speechRecognitionLanguage = "it-IT";

La propiedad speechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Para obtener más información, consulte la lista de configuraciones regionales de conversión de voz en texto admitidas.

Identificación del idioma

Puede usar la identificación de idioma con el reconocimiento para conversión de voz en texto cuando necesite identificar el idioma de un origen de audio y transcribirlo en texto.

Para obtener un ejemplo de código completo, vea identificación de idioma.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado.

var speechConfig = SpeechSDK.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Documentación de referencia | Paquete (Download) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Instalación del SDK de Voz y ejemplos

El repositorio Azure-Samples/cognitive-services-speech-sdk contiene ejemplos escritos en Objective-C para iOS y Mac. Seleccione un vínculo para ver las instrucciones de instalación de cada ejemplo:

Para más información, consulte la referencia del SDK de Voz para Objective-C.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado:

SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:"YourSubscriptionKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Documentación de referencia | Paquete (Download) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Instalación del SDK de Voz y ejemplos

El repositorio Azure-Samples/cognitive-services-speech-sdk contiene ejemplos escritos en Swift para iOS y Mac. Seleccione un vínculo para ver las instrucciones de instalación de cada ejemplo:

Para más información, consulte la referencia del SDK de Voz para Swift.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado:

let speechConfig = SPXSpeechConfiguration(subscription: "YourSubscriptionKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Documentación de referencia | Paquete (PyPi) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Creación de una configuración de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de SpeechConfig. Esta clase incluye información sobre la suscripción, como la clave de voz y la región o ubicación asociada, el punto de conexión, el host, o el token de autorización.

  1. Cree una instancia de SpeechConfig mediante la clave de voz y la región o ubicación.
  2. Cree un recurso de voz en Azure Portal. Para más información, consulte Crear un recurso multiservicio.
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")

Puede inicializar SpeechConfig de varias maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. La clave de voz y el token de autorización son opcionales.
  • Use un host y pase una dirección de host. La clave de voz y el token de autorización son opcionales.
  • Use un token de autorización con la región o ubicación asociada.

Nota:

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.

Reconocimiento de voz a través de un micrófono

Para reconocer la voz mediante el micrófono del dispositivo, cree una instancia de SpeechRecognizer sin pasar AudioConfig y, después, pase speech_config:

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

    print("Speak into your microphone.")
    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_mic()

Si desea usar un dispositivo de entrada de audio específico, debe especificar el identificador de dispositivo en una clase AudioConfig y pasarlo al parámetro audio_config del constructor SpeechRecognizer. Para obtener más información sobre cómo seleccionar un id. de dispositivo de entrada de audio, consulte Selección de un dispositivo de entrada de audio con el SDK de Voz

Reconocer la voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de usar un micrófono, cree una instancia de AudioConfig y use el parámetro filename.

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    audio_config = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_file()

Control de errores

Los ejemplos anteriores simplemente obtienen el texto reconocido de la propiedad result.text. Para controlar errores y otras respuestas, debe escribir código para controlar el resultado. En el código siguiente se evalúa la propiedad result.reason y:

  • Imprime el resultado del reconocimiento: speechsdk.ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, se informa al usuario: speechsdk.ResultReason.NoMatch.
  • Si se produce un error, se imprime el mensaje de error: speechsdk.ResultReason.Canceled.
if result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(result.text))
elif result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(result.no_match_details))
elif result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = result.cancellation_details
    print("Speech Recognition canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        print("Error details: {}".format(cancellation_details.error_details))
        print("Did you set the speech resource key and region values?")

Uso del reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento de una sola captura, que reconoce una única expresión. El final de una expresión única se determina mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio.

En cambio, puede usar el reconocimiento continuo para establecer cuándo detener el reconocimiento. Requiere que se conecte a EventSignal para obtener los resultados del reconocimiento. Para detener el reconocimiento, debe llamar a stop_continuous_recognition() o stop_continuous_recognition(). Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience por definir la entrada e inicializar SpeechRecognizer:

audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

A continuación, cree una variable para administrar el estado del reconocimiento de voz. Establezca la variable en False porque, al principio del reconocimiento, puede suponer con seguridad que no ha finalizado:

done = False

Ahora, cree una devolución de llamada para detener el reconocimiento continuo cuando se reciba un elemento evt. Tenga en cuenta los siguientes puntos:

  • Cuando se recibe un elemento evt, se imprime el mensaje del elemento evt.
  • Una vez recibido un elemento evt, se llama a evt para detener el reconocimiento.
  • El estado del reconocimiento se cambia a True.
def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    nonlocal done
    done = True

En el ejemplo de código se muestra cómo conectar devoluciones de llamada a eventos enviados desde el elemento SpeechRecognizer. Los eventos son:

  • recognizing: señala los eventos que contienen los resultados intermedios del reconocimiento.
  • recognized: señala los eventos que contienen los resultados finales del reconocimiento (lo que indica un intento de reconocimiento correcto).
  • session_started: señala los eventos que indican el comienzo de una sesión de reconocimiento (operación).
  • session_stopped: señala los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: señala los eventos que contienen los resultados cancelados del reconocimiento. Estos resultados indican un intento de reconocimiento que se canceló como resultado de una solicitud de cancelación directa. Como alternativa, indican un error de transporte o protocolo.
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))

speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)

Con todo configurado, podemos llamar a start_continuous_recognition():

speech_recognizer.start_continuous_recognition()
while not done:
    time.sleep(.5)

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a alemán. En el código, busque la instancia de SpeechConfig y agregue esta línea directamente debajo:

speech_config.speech_recognition_language="de-DE"

speech_recognition_language es un parámetro que toma una cadena como argumento. Para obtener más información, consulte la lista de configuraciones regionales de conversión de voz en texto admitidas.

Identificación del idioma

Puede usar la identificación de idioma con el reconocimiento con conversión de voz en texto cuando necesite identificar el idioma de un origen de audio y transcribirlo en texto.

Para obtener un ejemplo de código completo, vea identificación de idioma.

Uso de un punto de conexión personalizado

Con Voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre modelos e implementar un modelo en un punto de conexión personalizado. En el ejemplo siguiente se muestra cómo establecer un punto de conexión personalizado.

speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Referencia de la API de REST en la conversión de voz en texto | Referencia de la API de REST en la conversión de voz en texto para audios breves | Ejemplos adicionales sobre GitHub

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Conversión de voz en texto

En el símbolo del sistema, ejecute el siguiente comando. Inserte los siguientes valores en el comando:

  • La clave de suscripción del servicio de voz.
  • Región del servicio de voz.
  • Ruta de acceso de los archivos de audio de entrada. Puede generar archivos de audio mediante la conversión de texto en voz.
curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_AUDIO_FILE_PATH_HERE'

Debe recibir una respuesta con un cuerpo JSON similar al siguiente:

{
    "RecognitionStatus": "Success",
    "DisplayText": "My voice is my passport, verify me.",
    "Offset": 6600000,
    "Duration": 32100000
}

Para más información, consulte la referencia de la API de REST de la conversión de voz en texto.

En esta guía paso a paso, aprenderá a reconocer y a transcribir voz a texto en tiempo real.

Reconocimiento de voz a través de un micrófono

Conecte y encienda el micrófono del equipo. Desactive todas las aplicaciones que también puedan usar el micrófono. Algunos equipos tienen un micrófono integrado, mientras que otros requieren la configuración de un dispositivo Bluetooth.

Ahora está listo para ejecutar la CLI de Voz y reconocer la voz que procede del micrófono. Desde la línea de comandos, cambie al directorio que contiene el archivo binario de la CLI de Voz. Luego, ejecute el siguiente comando:

spx recognize --microphone

Nota

La CLI de Voz tiene como valor predeterminado el inglés. Puede elegir un idioma diferente en la tabla de voz a texto. Por ejemplo, agregue --source de-DE para reconocer voz en alemán.

Hable al micrófono y verá la transcripción de sus palabras en texto en tiempo real. La CLI de Voz se detendrá después de un período de silencio o cuando seleccione Ctrl+C.

Reconocer la voz a partir de un archivo

La CLI de Voz puede reconocer voz en muchos formatos de archivo e idiomas naturales. En este ejemplo, puede usar un archivo .wav (16 kHz u 8 kHz, 16 bits y PCM mono) que contenga voz en inglés. O bien, si desea algo más rápido, descargue el archivo whatstheweatherlike.wav y cópielo en el mismo directorio que el archivo binario de la CLI de Voz.

Use el siguiente comando para ejecutar la CLI de Voz y reconocer la voz que se encuentra en el archivo de audio.

spx recognize --file whatstheweatherlike.wav

Nota

La CLI de Voz tiene como valor predeterminado el inglés. Puede elegir un idioma diferente en la tabla de voz a texto. Por ejemplo, agregue --source de-DE para reconocer voz en alemán.

La CLI de Voz muestra una transcripción a texto de la voz en la pantalla.

Ejecutar y usar un contenedor

Los contenedores de voz proporcionan API de punto de conexión de consulta basadas en websocket a las que se accede a través del SDK de Voz y la CLI de Voz. De forma predeterminada, el SDK de Voz y la CLI de Voz usan el servicio de Voz público. Para usar el contenedor, deberá cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de la clave y la región.

Para obtener más información sobre los contenedores, consulte Direcciones URL de host en Instalación y ejecución de contenedores de Voz con Docker.

Pasos siguientes