Introducción a la conversión de voz a texto

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar el SDK de voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Pasar a los ejemplos en GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de C# en GitHub.

Requisitos previos

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Instalación de Speech SDK

Si solo desea el nombre del paquete para empezar, ejecute Install-Package Microsoft.CognitiveServices.Speech en la consola de NuGet.

Para obtener instrucciones de instalación específicas de la plataforma, consulte los vínculos siguientes:

Creación de una configuración de voz

Para llamar al servicio de voz con Speech SDK, debe crear un elemento 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. Cree una clase SpeechConfig mediante la clave y la región o ubicación. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación.

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("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    }
}

Existen otras maneras de inicializar una clase SpeechConfig:

  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y 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 desde un micrófono

Para reconocer la voz desde el micrófono del dispositivo, cree una clase AudioConfig mediante FromDefaultMicrophoneInput(). A continuación, inicialice una clase SpeechRecognizer, y pase audioConfig y speechConfig.

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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
        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.

Reconocimiento desde un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de un micrófono, tiene que crear un elemento AudioConfig. Sin embargo, al crear AudioConfig, en lugar de llamar a FromDefaultMicrophoneInput(), llame a FromWavFileInput() y pase la ruta de acceso 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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
        await FromFile(speechConfig);
    }
}

Reconocimiento desde la secuencia en memoria

En muchos casos de uso, es probable que los datos de audio procedan de Blob Storage o que ya estén en memoria como byte[] o una estructura similar de datos sin procesar. En el ejemplo siguiente se usa una clase 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 byte[].
  • Lee un archivo .wav mediante FileReader con fines de demostración, pero si ya tiene datos de audio en byte[], puede pasar directamente a escribir el contenido en el flujo de entrada.
  • El formato predeterminado es PCM mono 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 audioInputStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioInputStream);
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
        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, pero para obtener mejores resultados considere la posibilidad de aplicar la lógica para leer los encabezados, de manera que byte[] se inicie al principio de los datos de audio.

Control de errores

Los ejemplos anteriores sencillamente obtienen el texto reconocido de result.text, pero para gestionar los errores y otras respuestas, deberá escribir código para determinar 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 update the speech key and location/region info?");
        }
        break;
}

Reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento al inicio, 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, el reconocimiento continuo se usa para establecer cuándo cesar 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 una clase SpeechRecognizer:

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

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

var stopRecognition = new TaskCompletionSource<int>();

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

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

recognizer.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.");
    }
};

recognizer.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 update the speech key and location/region info?");
    }

    stopRecognition.TrySetResult(0);
};

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

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

await recognizer.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 recognizer.StopContinuousRecognitionAsync();

Modo de dictado

Al usar el reconocimiento continuo, puede habilitar el procesamiento de dictado mediante la función "habilitar dictado" correspondiente. Este modo hará que la instancia de configuración de voz interprete las descripciones de palabras de estructuras de oraciones como puntuación. Por ejemplo, la expresión "Interrogación de apertura vive en la ciudad interrogación de cierre" se interpretaría como el texto "¿Vive en la ciudad?".

Para habilitar el modo de dictado, use el método EnableDictation del elemento SpeechConfig.

speechConfig.EnableDictation();

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano. En el código, busque SpeechConfig y, a continuación, agregue esta línea directamente debajo.

speechConfig.SpeechRecognitionLanguage = "it-IT";

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. En la columna Locale, puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.

Mejora de la precisión del reconocimiento

Las listas de frases se usan para identificar frases conocidas en datos de audio, como el nombre de una persona o una ubicación específica. Al proporcionar una lista de frases, mejorará la precisión del reconocimiento de voz.

Por ejemplo, si tiene el comando "Mover a" y "Cerca" como posible destino que se puede decir, puede añadir la entrada "Mover a Cerca". Al agregar una frase, aumentará la probabilidad de que, cuando se reconozca el audio, se reconozca "Mover a Cerca" en lugar de "Mover acerca".

A una lista de frases se pueden agregar palabras solas o frases completas. Durante el reconocimiento, se usa una entrada de una lista de frases para mejorar el reconocimiento de las palabras y frases de la lista incluso cuando las entradas aparecen en medio de la expresión.

Importante

La característica de lista de frases está disponible en los siguientes idiomas: en-US, de-DE, en-AU, en-CA, en-GB, en-IN, es-ES, fr-FR, it-IT, ja-JP, pt-BR, zh-CN

La característica de lista de frases debe usarse con no más de unos cientos de frases. Si tiene una lista mayor o es de idiomas que no se admiten actualmente, es probable que entrenar un modelo personalizado sea la mejor opción para mejorar la precisión.

La característica Lista de frases no se admite con puntos de conexión personalizados. Por tanto, no la use con ellos. En su lugar, entrene un modelo personalizado que incluya las frases.

Para usar una lista de frases, primero debe crear un objeto PhraseListGrammar y, a continuación, agregar palabras y frases específicas con AddPhrase.

Los cambios realizados en el objeto PhraseListGrammar se aplican en el siguiente reconocimiento o después de una reconexión al servicio de voz.

var phraseList = PhraseListGrammar.FromRecognizer(recognizer);
phraseList.AddPhrase("Supercalifragilisticexpialidocious");

Si necesita borrar la lista de frases:

phraseList.Clear();

Otras opciones para mejorar la precisión del reconocimiento

Las listas de frases son solo una opción para mejorar la precisión del reconocimiento. También puede:

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar el SDK de voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Pasar a los ejemplos en GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de C++ en GitHub.

Requisitos previos

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Instalación de Speech SDK

En primer lugar, deberá instalar Speech SDK. Utilice las siguientes instrucciones en función de la plataforma:

Creación de una configuración de voz

Para llamar al servicio de voz con Speech SDK, debe crear un elemento 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. Cree una clase SpeechConfig mediante su clave y región. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación.

using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

Existen otras maneras de inicializar una clase SpeechConfig:

  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la regió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 desde un micrófono

Para reconocer la voz desde el micrófono del dispositivo, cree una clase AudioConfig mediante FromDefaultMicrophoneInput(). A continuación, inicialice una clase SpeechRecognizer, y pase audioConfig y config.

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

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

cout << "Speak into your microphone." << std::endl;
auto result = recognizer->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. Obtenga información sobre cómo obtener el identificador del dispositivo de entrada de audio.

Reconocimiento desde un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de usar un micrófono, tiene que crear un elemento AudioConfig. Sin embargo, al crear AudioConfig, en lugar de llamar a FromDefaultMicrophoneInput(), llame a FromWavFileInput() y pase la ruta de acceso del archivo.

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

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

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

Reconocer la voz

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

Reconocimiento al inicio

El reconocimiento al inicio 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 al inicio mediante RecognizeOnceAsync:

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

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

  • 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 update the speech key and location/region info?" << std::endl;
            }
        }
        break;
    default:
        break;
}

Reconocimiento continuo

El reconocimiento continuo es un poco más complicado que el reconocimiento al inicio. 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.

Comencemos por definir la entrada e inicializar un elemento SpeechRecognizer:

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

A continuación, vamos a crear una variable para administrar el estado del reconocimiento de voz. Para empezar, vamos a declarar un elemento promise<void>, ya que al inicio del reconocimiento podemos suponer que no ha terminado.

promise<void> recognitionEnd;

Nos suscribiremos a los eventos enviados desde el elemento SpeechRecognizer.

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

recognizer->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;
        }
    });

recognizer->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 update the speech key and location/region info?" << std::endl;

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

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

Con todo configurado, podemos llamar a StopContinuousRecognitionAsync.

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

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

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

Modo de dictado

Al usar el reconocimiento continuo, puede habilitar el procesamiento de dictado mediante la función "habilitar dictado" correspondiente. Este modo hará que la instancia de configuración de voz interprete las descripciones de palabras de estructuras de oraciones como puntuación. Por ejemplo, la expresión "Interrogación de apertura vive en la ciudad interrogación de cierre" se interpretaría como el texto "¿Vive en la ciudad?".

Para habilitar el modo de dictado, use el método EnableDictation del elemento SpeechConfig.

config->EnableDictation();

Cambio del idioma de origen

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

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

SetSpeechRecognitionLanguage es un parámetro que toma una cadena como argumento. Puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.

Mejora de la precisión del reconocimiento

Las listas de frases se usan para identificar frases conocidas en datos de audio, como el nombre de una persona o una ubicación específica. Al proporcionar una lista de frases, mejorará la precisión del reconocimiento de voz.

Por ejemplo, si tiene el comando "Mover a" y "Cerca" como posible destino que se puede decir, puede añadir la entrada "Mover a Cerca". Al agregar una frase, aumentará la probabilidad de que, cuando se reconozca el audio, se reconozca "Mover a Cerca" en lugar de "Mover acerca".

A una lista de frases se pueden agregar palabras solas o frases completas. Durante el reconocimiento, se usa una entrada de una lista de frases para mejorar el reconocimiento de las palabras y frases de la lista incluso cuando las entradas aparecen en medio de la expresión.

Importante

La característica de lista de frases está disponible en los siguientes idiomas: en-US, de-DE, en-AU, en-CA, en-GB, en-IN, es-ES, fr-FR, it-IT, ja-JP, pt-BR, zh-CN

La característica de lista de frases debe usarse con no más de unos cientos de frases. Si tiene una lista mayor o es de idiomas que no se admiten actualmente, es probable que entrenar un modelo personalizado sea la mejor opción para mejorar la precisión.

La característica Lista de frases no se admite con puntos de conexión personalizados. Por tanto, no la use con ellos. En su lugar, entrene un modelo personalizado que incluya las frases.

Para usar una lista de frases, primero debe crear un objeto PhraseListGrammar y, a continuación, agregar palabras y frases específicas con AddPhrase.

Los cambios realizados en el objeto PhraseListGrammar se aplican en el siguiente reconocimiento o después de una reconexión al servicio de voz.

auto phraseListGrammar = PhraseListGrammar::FromRecognizer(recognizer);
phraseListGrammar->AddPhrase("Supercalifragilisticexpialidocious");

Si necesita borrar la lista de frases:

phraseListGrammar->Clear();

Otras opciones para mejorar la precisión del reconocimiento

Las listas de frases son solo una opción para mejorar la precisión del reconocimiento. También puede:

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar el SDK de voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Pasar a los ejemplos en GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de Go en GitHub.

Requisitos previos

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Instalación de Speech SDK

En primer lugar, deberá instalar el SDK de Voz para Go.

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. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación. 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)
}

func main() {
    subscription :=  "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"

    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 siguientes comandos 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

Vea los documentos de referencia para obtener información detallada sobre las clases SpeechConfig y SpeechRecognizer.

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. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación. Además, reemplace la variable file por una ruta de acceso a un archivo .wav. Al ejecutar el script, se reconocerá la voz del archivo y se generará 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 :=  "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"
    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 siguientes comandos 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

Vea los documentos de referencia para obtener información detallada sobre las clases SpeechConfig y SpeechRecognizer.

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar el SDK de voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Pasar a los ejemplos en GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de Java en GitHub.

Requisitos previos

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Instalación de Speech SDK

En primer lugar, deberá instalar Speech SDK. Utilice las siguientes instrucciones en función de la plataforma:

Creación de una configuración de voz

Para llamar al servicio de voz con Speech SDK, debe crear un elemento 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. Cree una clase SpeechConfig mediante la clave y la región o ubicación. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación.

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>");
    }
}

Existen otras maneras de inicializar una clase SpeechConfig:

  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la regió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 desde un micrófono

Para reconocer la voz desde el micrófono del dispositivo, cree una clase AudioConfig mediante fromDefaultMicrophoneInput(). A continuación, inicialice una clase SpeechRecognizer, y 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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);

        System.out.println("Speak into your microphone.");
        Future<SpeechRecognitionResult> task = recognizer.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. Obtenga información sobre cómo obtener el identificador del dispositivo de entrada de audio.

Reconocimiento desde un archivo

Si desea reconocer la voz de un archivo de audio, en lugar de usar un micrófono, tiene que crear un elemento AudioConfig. Sin embargo, al crear AudioConfig, en lugar de llamar a fromDefaultMicrophoneInput(), llame a fromWavFileInput() y pase la ruta de acceso 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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = recognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

Control de errores

En los ejemplos anteriores se obtiene sencillamente el texto reconocido mediante result.getText(); sin embargo, para controlar los errores y otras respuestas, deberá escribir código para determinar el resultado. En el ejemplo siguiente se evalúa result.getReason() y se:

  • 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 update the subscription info?");
            }
        }
        break;
}

Reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento al inicio, 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, el reconocimiento continuo se usa para establecer cuándo cesar 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.

Comencemos por definir la entrada e inicializar un elemento SpeechRecognizer:

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

A continuación, vamos a crear una variable para administrar el estado del reconocimiento de voz. Para empezar, declararemos un elemento Semaphore en el ámbito de clase.

private static Semaphore stopTranslationWithFileSemaphore;

Nos suscribiremos a los eventos enviados desde el elemento SpeechRecognizer.

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

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

recognizer.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.");
    }
});

recognizer.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 update the subscription info?");
    }

    stopTranslationWithFileSemaphore.release();
});

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

Con todo configurado, podemos llamar a startContinuousRecognitionAsync.

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

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

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

Modo de dictado

Al usar el reconocimiento continuo, puede habilitar el procesamiento de dictado mediante la función "habilitar dictado" correspondiente. Este modo hará que la instancia de configuración de voz interprete las descripciones de palabras de estructuras de oraciones como puntuación. Por ejemplo, la expresión "Interrogación de apertura vive en la ciudad interrogación de cierre" se interpretaría como el texto "¿Vive en la ciudad?".

Para habilitar el modo de dictado, use el método enableDictation del elemento SpeechConfig.

config.enableDictation();

Cambio del idioma de origen

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

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage es un parámetro que toma una cadena como argumento. Puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.

Mejora de la precisión del reconocimiento

Las listas de frases se usan para identificar frases conocidas en datos de audio, como el nombre de una persona o una ubicación específica. Al proporcionar una lista de frases, mejorará la precisión del reconocimiento de voz.

Por ejemplo, si tiene el comando "Mover a" y "Cerca" como posible destino que se puede decir, puede añadir la entrada "Mover a Cerca". Al agregar una frase, aumentará la probabilidad de que, cuando se reconozca el audio, se reconozca "Mover a Cerca" en lugar de "Mover acerca".

A una lista de frases se pueden agregar palabras solas o frases completas. Durante el reconocimiento, se usa una entrada de una lista de frases para mejorar el reconocimiento de las palabras y frases de la lista incluso cuando las entradas aparecen en medio de la expresión.

Importante

La característica de lista de frases está disponible en los siguientes idiomas: en-US, de-DE, en-AU, en-CA, en-GB, en-IN, es-ES, fr-FR, it-IT, ja-JP, pt-BR, zh-CN

La característica de lista de frases debe usarse con no más de unos cientos de frases. Si tiene una lista mayor o es de idiomas que no se admiten actualmente, es probable que entrenar un modelo personalizado sea la mejor opción para mejorar la precisión.

La característica Lista de frases no se admite con puntos de conexión personalizados. Por tanto, no la use con ellos. En su lugar, entrene un modelo personalizado que incluya las frases.

Para usar una lista de frases, primero debe crear un objeto PhraseListGrammar y, a continuación, agregar palabras y frases específicas con AddPhrase.

Los cambios realizados en el objeto PhraseListGrammar se aplican en el siguiente reconocimiento o después de una reconexión al servicio de voz.

PhraseListGrammar phraseList = PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Supercalifragilisticexpialidocious");

Si necesita borrar la lista de frases:

phraseList.clear();

Otras opciones para mejorar la precisión del reconocimiento

Las listas de frases son solo una opción para mejorar la precisión del reconocimiento. También puede:

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar el SDK de voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Pasar a los ejemplos en GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de JavaScript en GitHub.

También puede ver el ejemplo de React para aprender a usar el SDK de Voz en un entorno basado en explorador.

Requisitos previos

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Instalación de Speech SDK

Lo primero que debe hacer es instalar el SDK de Voz para Node.js. Si solo desea el nombre del paquete que se va a instalar, ejecute npm install microsoft-cognitiveservices-speech-sdk. Para obtener instrucciones sobre la instalación guiada, consulte el artículo de introducción.

Use la siguiente instrucción require para importar el SDK.

const sdk = require("microsoft-cognitiveservices-speech-sdk");

Para más información sobre require, consulte la documentación necesaria.

Creación de una configuración de voz

Para llamar al servicio de voz con Speech SDK, debe crear un elemento 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. Cree una clase SpeechConfig mediante la clave y la región o ubicación. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación.

const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

Existen otras maneras de inicializar una clase SpeechConfig:

  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la región o ubicación asociadas.

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 desde un micrófono (solo explorador)

El reconocimiento de voz de un micrófono no se admite en Node.js y solo se admite en un entorno de JavaScript basado en explorador. En el ejemplo de React en GitHub puede ver la implementación de la conversión de voz en texto desde un micrófono.

Nota

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.

Reconocimiento desde un archivo

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

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

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

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

Reconocimiento desde la secuencia en memoria

En muchos casos de uso, es probable que los datos de audio procedan de Blob Storage o que ya estén en memoria como ArrayBuffer o una estructura similar de datos sin procesar. El código siguiente:

  • Crea una secuencia de entrada mediante createPushStream().
  • Lee un archivo .wav mediante fs.createReadStream con fines de demostración, pero 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 entrada.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

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 recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    recognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        recognizer.close();
    });
}
fromStream();

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, pero para obtener mejores resultados considere la posibilidad de aplicar la lógica para leer los encabezados, de manera que fs se inicie al principio de los datos de audio.

Control de errores

Los ejemplos anteriores sencillamente obtienen el texto reconocido de result.text, pero para gestionar los errores y otras respuestas, deberá escribir código para determinar 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 = 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 update the key and location/region info?");
        }
        break;
    }

Reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento al inicio, 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, el reconocimiento continuo se usa para establecer cuándo cesar 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 una clase SpeechRecognizer:

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

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

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

recognizer.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.");
    }
};

recognizer.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 update the key and location/region info?");
    }

    recognizer.stopContinuousRecognitionAsync();
};

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

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

recognizer.startContinuousRecognitionAsync();

// make the following call at some point to stop recognition.
// recognizer.stopContinuousRecognitionAsync();

Modo de dictado

Al usar el reconocimiento continuo, puede habilitar el procesamiento de dictado mediante la función "habilitar dictado" correspondiente. Este modo hará que la instancia de configuración de voz interprete las descripciones de palabras de estructuras de oraciones como puntuación. Por ejemplo, la expresión "Interrogación de apertura vive en la ciudad interrogación de cierre" se interpretaría como el texto "¿Vive en la ciudad?".

Para habilitar el modo de dictado, use el método enableDictation del elemento SpeechConfig.

speechConfig.enableDictation();

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano. En el código, busque SpeechConfig y, a continuación, agregue esta línea directamente debajo.

speechConfig.speechRecognitionLanguage = "it-IT";

La propiedad speechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. En la columna Locale, puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.

Mejora de la precisión del reconocimiento

Las listas de frases se usan para identificar frases conocidas en datos de audio, como el nombre de una persona o una ubicación específica. Al proporcionar una lista de frases, mejorará la precisión del reconocimiento de voz.

Por ejemplo, si tiene el comando "Mover a" y "Cerca" como posible destino que se puede decir, puede añadir la entrada "Mover a Cerca". Al agregar una frase, aumentará la probabilidad de que, cuando se reconozca el audio, se reconozca "Mover a Cerca" en lugar de "Mover acerca".

A una lista de frases se pueden agregar palabras solas o frases completas. Durante el reconocimiento, se usa una entrada de una lista de frases para mejorar el reconocimiento de las palabras y frases de la lista incluso cuando las entradas aparecen en medio de la expresión.

Importante

La característica de lista de frases está disponible en los siguientes idiomas: en-US, de-DE, en-AU, en-CA, en-GB, en-IN, es-ES, fr-FR, it-IT, ja-JP, pt-BR, zh-CN

La característica de lista de frases debe usarse con no más de unos cientos de frases. Si tiene una lista mayor o es de idiomas que no se admiten actualmente, es probable que entrenar un modelo personalizado sea la mejor opción para mejorar la precisión.

La característica Lista de frases no se admite con puntos de conexión personalizados. Por tanto, no la use con ellos. En su lugar, entrene un modelo personalizado que incluya las frases.

Para usar una lista de frases, primero debe crear un objeto PhraseListGrammar y, a continuación, agregar palabras y frases específicas con addPhrase.

Los cambios realizados en el objeto PhraseListGrammar se aplican en el siguiente reconocimiento o después de una reconexión al servicio de voz.

const phraseList = sdk.PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Supercalifragilisticexpialidocious");

Si necesita borrar la lista de frases:

phraseList.clear();

Otras opciones para mejorar la precisión del reconocimiento

Las listas de frases son solo una opción para mejorar la precisión del reconocimiento. También puede:

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este ejemplo, aprenderá a usar el SDK de Voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Ejemplo de React en GitHub

Vaya al ejemplo de React en GitHub para aprender a usar el SDK de Voz un entorno de JavaScript basado en explorador. En este ejemplo se muestran ejemplos de patrones de diseño para la administración e intercambio de tokens de autenticación, y la captura de audio desde un micrófono o un archivo para realizar conversiones de voz en texto.

Además, los modelos de diseño que se usan en el inicio rápido deNode.js también se pueden usar en un entorno de explorador.

Puede transcribir la voz en texto con el SDK de Voz para Swift y Objective-C.

Requisitos previos

En los ejemplos siguientes se da por sentado que tiene una cuenta de Azure y una suscripción al servicio Voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Instalación del SDK de Voz y ejemplos

El SDK de Voz de Cognitive Services contiene ejemplos escritos en escritos en Swift y Objective-C para iOS y Mac. Haga clic en un vínculo para ver las instrucciones de instalación de cada ejemplo:

También proporcionamos un SDK de Voz de referencia de Objective-C en línea.

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar el SDK de voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Pasar a los ejemplos en GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de Python en GitHub.

Prerrequisitos

En este artículo se da por hecho que:

Instalación e importación de Speech SDK

En primer lugar, deberá instalar Speech SDK.

pip install azure-cognitiveservices-speech

Si trabaja en macOS y tiene problemas de instalación, puede que tenga que ejecutar este comando primero.

python3 -m pip install --upgrade pip

Una vez instalado el SDK de Voz, impórtelo en el proyecto de Python.

import azure.cognitiveservices.speech as speechsdk

Creación de una configuración de voz

Para llamar al servicio de voz con Speech SDK, debe crear un elemento 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. Cree una clase SpeechConfig mediante la clave y la región o ubicación. Vea la página Búsqueda de claves y región o ubicación para encontrar el par clave-región o ubicación.

speech_config = speechsdk.SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")

Existen otras maneras de inicializar una clase SpeechConfig:

  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la regió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 desde un micrófono

Para reconocer la voz desde el micrófono del dispositivo, cree una clase SpeechRecognizer sin pasar AudioConfig, y pase speech_config.

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")
    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. Obtenga información sobre cómo obtener el identificador del dispositivo de entrada de audio.

Reconocimiento desde un archivo

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

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")
    audio_input = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_input)
    
    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_file()

Control de errores

Los ejemplos anteriores sencillamente obtienen el texto reconocido de result.text, pero para gestionar los errores y otras respuestas, deberá escribir código para determinar 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))

Reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento al inicio, 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, el reconocimiento continuo se usa para establecer cuándo cesar el reconocimiento. Requiere que se conecte a EventSignal para obtener los resultados del reconocimiento y, 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.

Comencemos por definir la entrada e inicializar un elemento SpeechRecognizer:

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

A continuación, vamos a crear una variable para administrar el estado del reconocimiento de voz. Para empezar, lo estableceremos en False, ya que al inicio del reconocimiento podemos suponer que no ha terminado.

done = False

Ahora, vamos a crear una devolución de llamada para detener el reconocimiento continuo cuando se reciba un elemento evt. Hay algunos aspectos que se deben tener en cuenta.

  • Cuando se recibe un elemento evt, se imprime el mensaje del elemento evt.
  • Una vez recibido un elemento evt, se llama a stop_continuous_recognition() 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 este ejemplo de código se muestra cómo conectar devoluciones de llamada a eventos enviados desde el elemento SpeechRecognizer.

  • recognizing: se señalizan los eventos que contienen los resultados intermedios del reconocimiento.
  • recognized: se señalizan los eventos que contienen los resultados finales del reconocimiento (lo que indica un intento de reconocimiento correcto).
  • session_started: se señalizan los eventos que indican el inicio de una sesión de reconocimiento (operación).
  • session_stopped: se señalizan los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: se señalizan los eventos que contienen los resultados de reconocimiento cancelados (que indican un intento de reconocimiento que se canceló como resultado de una solicitud de cancelación directa o, de forma alternativa, por un error de protocolo o transporte).
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)

Modo de dictado

Al usar el reconocimiento continuo, puede habilitar el procesamiento de dictado mediante la función "habilitar dictado" correspondiente. Este modo hará que la instancia de configuración de voz interprete las descripciones de palabras de estructuras de oraciones como puntuación. Por ejemplo, la expresión "Interrogación de apertura vive en la ciudad interrogación de cierre" se interpretaría como el texto "¿Vive en la ciudad?".

Para habilitar el modo de dictado, use el método enable_dictation() del elemento SpeechConfig.

SpeechConfig.enable_dictation()

Cambio del idioma de origen

Una tarea común en el reconocimiento de voz es especificar el idioma de entrada (u origen). Echemos un vistazo a cómo se cambiaría el idioma de entrada a alemán. En el código, busque SpeechConfig y, a continuación, 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. Puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.

Mejora de la precisión del reconocimiento

Las listas de frases se usan para identificar frases conocidas en datos de audio, como el nombre de una persona o una ubicación específica. Al proporcionar una lista de frases, mejorará la precisión del reconocimiento de voz.

Por ejemplo, si tiene el comando "Mover a" y "Cerca" como posible destino que se puede decir, puede añadir la entrada "Mover a Cerca". Al agregar una frase, aumentará la probabilidad de que, cuando se reconozca el audio, se reconozca "Mover a Cerca" en lugar de "Mover acerca".

A una lista de frases se pueden agregar palabras solas o frases completas. Durante el reconocimiento, se usa una entrada de una lista de frases para mejorar el reconocimiento de las palabras y frases de la lista incluso cuando las entradas aparecen en medio de la expresión.

Importante

La característica de lista de frases está disponible en los siguientes idiomas: en-US, de-DE, en-AU, en-CA, en-GB, en-IN, es-ES, fr-FR, it-IT, ja-JP, pt-BR, zh-CN

La característica de lista de frases debe usarse con no más de unos cientos de frases. Si tiene una lista mayor o es de idiomas que no se admiten actualmente, es probable que entrenar un modelo personalizado sea la mejor opción para mejorar la precisión.

La característica Lista de frases no se admite con puntos de conexión personalizados. Por tanto, no la use con ellos. En su lugar, entrene un modelo personalizado que incluya las frases.

Para usar una lista de frases, primero debe crear un objeto PhraseListGrammar y, a continuación, agregar palabras y frases específicas con addPhrase.

Los cambios realizados en el objeto PhraseListGrammar se aplican en el siguiente reconocimiento o después de una reconexión al servicio de voz.

phrase_list_grammar = speechsdk.PhraseListGrammar.from_recognizer(reco)
phrase_list_grammar.addPhrase("Supercalifragilisticexpialidocious")

Si necesita borrar la lista de frases:

phrase_list_grammar.clear()

Otras opciones para mejorar la precisión del reconocimiento

Las listas de frases son solo una opción para mejorar la precisión del reconocimiento. También puede:

En este inicio rápido, aprenderá a convertir voz en texto mediante el servicio de voz y cURL.

Para obtener una visión general de los conceptos de conversión de voz en texto, consulte el artículo de información general.

Requisitos previos

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.

Conversión de voz en texto

En el símbolo del sistema, ejecute el siguiente comando. Tendrá que insertar los siguientes valores en el comando.

  • Clave de suscripción del servicio de voz.
  • Región del servicio de voz.
  • Ruta de acceso del archivo 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'

Debería recibir una respuesta similar a la 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 REST de la conversión de voz en texto.

Una de las características principales del servicio de voz es la capacidad para reconocer y transcribir la voz humana (que a menudo se denomina "conversión de voz en texto"). En este inicio rápido, aprenderá a usar la CLI de Voz en sus aplicaciones y productos para realizar una conversión de voz en texto de alta calidad.

Descargar e instalar

Siga estos pasos para instalar la CLI de Voz en Windows:

  1. En Windows, necesita Microsoft Visual C++ Redistributable para Visual Studio 2019 para su plataforma. Durante la primera instalación es posible que deba reiniciar.

  2. Instale el SDK de .NET Core 3.1.

  3. Para instalar la CLI de Voz para que use NuGet, escriba este comando:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    

Escriba spx para ver la ayuda de la CLI de Voz.

Nota

Como alternativa a NuGet, puede descargar y extraer la CLI de Voz para Windows como un archivo ZIP.

Limitaciones de fuentes

En Windows, la CLI de Voz solo puede mostrar las fuentes disponibles para el símbolo del sistema en el equipo local. El terminal de Windows admite todas las fuentes que genera de forma interactiva la CLI de Voz.

Si se genera la salida a un archivo, un editor de texto como el Bloc de notas o un explorador Web como Microsoft Edge también pueden mostrar todas las fuentes.

Creación de la configuración de la suscripción

Si desea empezar a usar la CLI de Voz, debe especificar la clave de la suscripción al servicio de voz y la información de la región. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz. Una vez que tenga la clave de suscripción y el identificador de región (p. ej., eastus, westus), ejecute los comandos siguientes.

spx config @key --set SUBSCRIPTION-KEY
spx config @region --set REGION

La autenticación de la suscripción se almacena ahora para futuras solicitudes de SPX. Si tiene que quitar cualquiera de estos valores almacenados, ejecute spx config @region --clear o spx config @key --clear.

Conversión de voz en texto desde un micrófono

Conecte y encienda el micrófono de su PC y desactive las aplicaciones que puedan usarlo también. 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 y ejecute el comando siguiente.

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 presione ctrl+C.

Conversión de voz en texto desde un archivo de audio

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.

Ya está listo para ejecutar la CLI de Voz y reconocer la voz que se encuentra en el archivo de sonido. Para ello, solo hay que ejecutar el siguiente comando.

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 mostrará una transcripción a texto de la voz en la pantalla y, luego,

Pasos siguientes