Reconocimiento de voz

Referencia de la API REST de conversión de voz a texto | Referencia de la API REST de conversión de voz a texto para audio corto | Ejemplos adicionales en GitHub

En esta guía de instrucciones, aprenderá a usar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Conversión de voz en texto

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

  • La clave de API para el recurso de reconocimiento de voz
  • La región del servicio de voz
  • Ruta de acceso del archivo de audio de entrada
curl --location --request POST 'https://YourResourceName.cognitiveservices.azure.com/stt/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 como en el ejemplo 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 conversión de voz en texto.

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

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Creación de una instancia de configuración de voz

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

  1. Crear un recurso de Foundry para Voz en Azure Portal. Obtenga la clave y la región del recurso de Voz.
  2. Cree una SpeechConfig instancia mediante el código siguiente. Reemplace YourSpeechKey con su clave de recurso de Voz y YourSpeechRegion con su región.
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")

Puede inicializar SpeechConfig de algunas otras maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. Una clave de voz o un token de autorización es opcional.
  • Utilice un host e ingrese una dirección de host. Una clave de voz o un token de autorización es opcional.
  • Use un token de autorización con la región o ubicación asociada.

Nota

Independientemente de si va a realizar el reconocimiento de voz, la síntesis de voz, la traducción o el reconocimiento de intenciones, siempre se crea una configuración.

Reconocimiento de voz desde un micrófono

Para reconocer la voz utilizando el micrófono de su dispositivo, cree una instancia de SpeechRecognizer sin pasar AudioConfig, y luego 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.")
    speech_recognition_result = speech_recognizer.recognize_once_async().get()
    print(speech_recognition_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 información sobre cómo obtener el identificador de dispositivo, consulte Selección de un dispositivo de entrada de audio con el SDK de Voz.

Reconocimiento de 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 AudioConfig instancia y use el filename parámetro :

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)

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

from_file()

Manejo de errores

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

  • Imprime el resultado del reconocimiento: speechsdk.ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, informa al usuario: speechsdk.ResultReason.NoMatch.
  • Si se produce un error, imprime el mensaje de error: speechsdk.ResultReason.Canceled.
if speech_recognition_result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(speech_recognition_result.text))
elif speech_recognition_result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(speech_recognition_result.no_match_details))
elif speech_recognition_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_recognition_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 captura única, que reconoce una sola 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, se usa el reconocimiento continuo cuando se desea controlar cuándo dejar de reconocer. 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_async().. Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience definiendo la entrada e inicializando 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 un callback para detener el reconocimiento continuo cuando se recibe evt. Tenga en cuenta estos puntos:

  • Cuando se recibe un elemento evt, se imprime el mensaje del elemento evt.
  • Después de que evt se reciba, se llama a la función stop_continuous_recognition() para detener el reconocimiento.
  • El estado de reconocimiento se cambia a True.
def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    global done
    done = True

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

  • recognizing: indica los eventos que contienen resultados intermedios de reconocimiento.
  • recognized: Señal para eventos que contienen los resultados finales del reconocimiento, que indican un intento exitoso de reconocimiento.
  • session_started: Señal para eventos que indican el inicio de una sesión de reconocimiento (operación).
  • session_stopped: indica los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: indica los eventos que contienen resultados de reconocimiento cancelados. 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, puede llamar a start_continuous_recognition():

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

Cambiar el idioma de origen

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

speech_config.speech_recognition_language="de-DE"

speech_recognition_language es un parámetro que toma una cadena como argumento. Para obtener una lista de las configuraciones regionales admitidas, consulte Compatibilidad con idiomas y voz para el servicio voz.

Identificación del idioma

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

Para obtener un ejemplo de código completo, consulte Identificación del idioma.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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="YourSpeechResoureKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

Segmentación semántica

La segmentación semántica es una estrategia de segmentación de reconocimiento de voz diseñada para mitigar los problemas asociados a la segmentación basada en silencio:

  • Subsegmentación: cuando los usuarios hablan durante mucho tiempo sin pausas, pueden ver una larga secuencia de texto sin saltos ("pared del texto"), lo que degrada gravemente su experiencia de legibilidad.
  • Sobresegmentación: cuando un usuario se detiene durante un breve tiempo, el mecanismo de detección de silencio puede segmentar incorrectamente.

En lugar de depender solo de tiempos de espera de silencio, la segmentación semántica principalmente segmenta y devuelve resultados finales cuando detecta signos de puntuación al final de la frase (como "." o "?"). Esto mejora la experiencia del usuario con segmentos de mayor calidad y semánticamente completos y evita largos resultados intermedios.

Para usar la segmentación semántica, debe establecer la siguiente propiedad en la SpeechConfig instancia usada para crear un SpeechRecognizer:

speech_config.set_property(speechsdk.PropertyId.Speech_SegmentationStrategy, "Semantic") 

Algunas de las limitaciones de la segmentación semántica son las siguientes:

  • Necesita la versión 1.41 o posterior del SDK de Voz para usar la segmentación semántica.
  • La segmentación semántica solo está pensada para su uso en el reconocimiento continuo. Esto incluye escenarios como dictado y subtítulos. No se debe usar en el modo de reconocimiento único ni en escenarios interactivos.
  • La segmentación semántica no está disponible para todos los idiomas y configuraciones regionales.
  • La segmentación semántica aún no admite puntuaciones de confianza y listas NBest. Por lo tanto, no se recomienda la segmentación semántica si usa puntuaciones de confianza o listas NBest.

Refinamiento posterior a la transmisión (vista previa)

El refinamiento post-transmisión mejora la precisión final de la transcripción ejecutando una segunda pasada de reconocimiento en paralelo con la transmisión en tiempo real. Los resultados intermedios y parciales siguen siendo de baja latencia. Solo el resultado final se reemplaza por una versión más precisa que usa un contexto de audio más amplio.

Para habilitar el refinamiento después de la secuencia, establezca la propiedad SpeechServiceResponse_PostProcessingOption en la instancia SpeechConfig.

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

Algunas consideraciones importantes para el refinamiento posterior al flujo:

  • El posprocesamiento funciona mejor para enunciados más largos, como conversaciones, reuniones y dictados. Para frases muy cortas, el resultado refinado podría ser idéntico al resultado estándar.
  • No se pueden utilizar juntos el refinamiento posterior a la secuencia y la segmentación semántica.
  • El refinamiento posterior a la transmisión y TrueText son valores distintos de la misma propiedad SpeechServiceResponse_PostProcessingOption. Solo se puede establecer un valor a la vez.
  • El refinamiento posterior a la secuencia solo está disponible en regiones de Azure seleccionadas durante la versión preliminar pública.

Para obtener más información sobre las opciones posteriores al procesamiento, vea Uso del procesamiento posterior.

Importante

El refinamiento después de la transmisión se encuentra actualmente en versión preliminar pública. Las mejoras de precisión varían según el idioma y la configuración regional. Es posible que algunas localizaciones no muestren mejoras de calidad significativas, y los resultados pueden diferir de lo que se observa con el reconocimiento estándar. Solo se admite el reconocimiento monolingüe durante la versión preliminar. La identificación de idioma automática y multilingüe no está disponible con refinamiento posterior a la secuencia.

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

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Creación de una instancia de configuración de voz

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

  1. Crear un recurso de Foundry para Voz en Azure Portal. Obtenga la clave y el punto de conexión del recurso de Voz.
  2. Cree una SpeechConfig instancia mediante el código siguiente. Sustituya YourSpeechKey y YourSpeechEndpoint por su clave de recurso de Voz y su punto de conexió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.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
    }
}

Puede inicializar SpeechConfig de algunas otras maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. Un token de clave o autorización es opcional.
  • Utilice un host e ingrese una dirección de host. Un token de clave o autorización es opcional.
  • Use un token de autorización con la región o ubicación asociada.

Nota

Independientemente de si va a realizar el reconocimiento de voz, la síntesis de voz, la traducción o el reconocimiento de intenciones, siempre se crea una configuración.

Reconocimiento de voz desde un micrófono

Para reconocer la voz mediante el micrófono del dispositivo, cree una AudioConfig instancia mediante el FromDefaultMicrophoneInput() método . A continuación, inicialice el SpeechRecognizer objeto pasando 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 speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromMic(speechConfig);
    }
}

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

Reconocimiento de voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio en lugar de un micrófono, debe crear una AudioConfig instancia. Sin embargo, no llama a FromDefaultMicrophoneInput(). Llame a FromWavFileInput() y proporcione 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 speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromFile(speechConfig);
    }
}

Reconocimiento de voz de una secuencia en memoria

En muchos casos de uso, es probable que los datos de audio provengan de Azure Blob Storage o que ya estén en memoria como una instancia de byte[] o una estructura de datos en bruto similar. En el ejemplo siguiente se usa PushAudioInputStream para reconocer la voz, que es básicamente una secuencia de memoria abstracta. El código de ejemplo realiza las siguientes acciones:

  • Escribe los datos de audio sin formato en PushAudioInputStream mediante la función Write(), que acepta una instancia de byte[].
  • Lee un archivo de .wav mediante FileReader para fines de demostración. Si ya tiene datos de audio en una byte[] instancia, puede ir directamente a escribir el contenido en el flujo de entrada.
  • El formato predeterminado es PCM (modulación por impulsos codificados) mono de 16 bits y 16 kHz. Para personalizar el formato, puede pasar un AudioStreamFormat objeto a CreatePushStream() mediante la función AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels)estática .
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 speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromStream(speechConfig);
    }
}

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

Manejo de errores

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

  • Imprime el resultado del reconocimiento: ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, informa al usuario: ResultReason.NoMatch.
  • Si se produce un error, imprime el mensaje de error: ResultReason.Canceled.
switch (speechRecognitionResult.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(speechRecognitionResult);
        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 endpoint values?");
        }
        break;
}

Uso del reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento de captura única, que reconoce una sola 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, se usa el reconocimiento continuo cuando se desea controlar cuándo dejar de reconocer. 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 definiendo la entrada e inicializando SpeechRecognizer:

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

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

var stopRecognition = new TaskCompletionSource<int>();

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

  • Recognizing: indica los eventos que contienen resultados intermedios de reconocimiento.
  • Recognized: Señal para eventos que contienen los resultados finales del reconocimiento, que indican un intento exitoso de reconocimiento.
  • SessionStopped: indica los eventos que indican el final de una sesión de reconocimiento (operación).
  • Canceled: indica los eventos que contienen resultados de reconocimiento cancelados. 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 endpoint values?");
    }

    stopRecognition.TrySetResult(0);
};

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

Con todo configurado, llama a StartContinuousRecognitionAsync para empezar a reconocer:

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();

Cambiar el idioma de origen

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

speechConfig.SpeechRecognitionLanguage = "it-IT";

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Para obtener una lista de las configuraciones regionales admitidas, consulte Compatibilidad con idiomas y voz para el servicio voz.

Identificación del idioma

Puede usar la identificación del idioma con el reconocimiento de voz a texto cuando necesite identificar el idioma en un origen de audio y, a continuación, transcribirlo al texto.

Para obtener un ejemplo de código completo, consulte Identificación del idioma.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para más información sobre los contenedores, consulte Host URLs en Instalación y ejecución de contenedores de voz con Docker.

Cambio del modo en que se controla el silencio

Si un usuario habla más rápido o más lento de lo habitual, es posible que los comportamientos predeterminados para el silencio no hablado en el audio de entrada no resulten en lo que esperas. Entre los problemas comunes con el control de silencio se incluyen:

  • Voz rápida que encadena muchas oraciones en un único resultado de reconocimiento, en lugar de dividir oraciones en resultados individuales.
  • Voz lenta que separa partes de una sola oración en varios resultados.
  • Un reconocimiento de una sola captura que termina demasiado rápido mientras 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 que se utiliza para crear un SpeechRecognizer.

  • El tiempo de espera del silencio de segmentación ajusta la cantidad de audio sin habla que se permite dentro de una frase que se está pronunciando antes de que esa frase se considere "completada".
    • Los valores más altos generalmente hacen que los resultados sean más largos y permitan pausas más largas desde el hablante dentro de una frase, pero los resultados tardan más tiempo en llegar. También pueden combinar frases independientes en un único resultado cuando son demasiado altos.
    • Los valores más bajos generalmente hacen que los resultados sean más cortos y aseguran que se produzcan interrupciones más frecuentes y rápidas entre frases, pero también pueden hacer que las frases individuales se separen en varios resultados cuando se establecen valores demasiado bajos.
    • Este tiempo de espera se puede establecer en valores enteros entre 100 y 5000, en milisegundos, con 500 valores predeterminados típicos.
  • El tiempo de espera de silencio inicial ajusta la cantidad de audio sin habla que se permite antes de una frase, para que el intento de reconocimiento no termine en un resultado "sin coincidencia".
    • Los valores más altos proporcionan 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 llegan los resultados "sin coincidencia", pero no afecta de otro modo al contenido de los resultados del reconocimiento.
    • Este tiempo de espera se puede establecer en cualquier valor entero no negativo, en milisegundos o establecer en 0 para deshabilitarlo por completo. 5000 es un valor predeterminado típico para el reconocimiento de una sola toma, mientras que 15000 es un valor predeterminado típico para el reconocimiento continuo.

Dado que hay inconvenientes al modificar estos tiempos de espera, solo debe cambiar la configuración cuando tenga un problema relacionado con el control de silencio. Los valores predeterminados gestionan de forma óptima la mayoría del audio hablado y solo en escenarios poco comunes es probable que encuentren problemas.

Ejemplo: Los usuarios que hablan un número de serie como "ABC-123-4567" pueden pausar entre grupos de caracteres lo suficiente para que el número de serie se divida en varios resultados. En este caso, pruebe un valor mayor como 2000 milisegundos 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");

Segmentación semántica

La segmentación semántica es una estrategia de segmentación de reconocimiento de voz diseñada para mitigar los problemas asociados a la segmentación basada en silencio:

  • Subsegmentación: cuando los usuarios hablan durante mucho tiempo sin pausas, pueden ver una larga secuencia de texto sin saltos ("pared del texto"), lo que degrada gravemente su experiencia de legibilidad.
  • Sobresegmentación: cuando un usuario se detiene durante un breve tiempo, el mecanismo de detección de silencio puede segmentar incorrectamente.

En lugar de depender solo de tiempos de espera de silencio, la segmentación semántica principalmente segmenta y devuelve resultados finales cuando detecta signos de puntuación al final de la frase (como "." o "?"). Esto mejora la experiencia del usuario con segmentos de mayor calidad y semánticamente completos y evita largos resultados intermedios.

Para usar la segmentación semántica, debe establecer la siguiente propiedad en la SpeechConfig instancia usada para crear un SpeechRecognizer:

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

Algunas de las limitaciones de la segmentación semántica son las siguientes:

  • Necesita la versión 1.41 o posterior del SDK de Voz para usar la segmentación semántica.
  • La segmentación semántica solo está pensada para su uso en el reconocimiento continuo. Esto incluye escenarios como dictado y subtítulos. No se debe usar en el modo de reconocimiento único ni en escenarios interactivos.
  • La segmentación semántica no está disponible para todos los idiomas y configuraciones regionales.
  • La segmentación semántica aún no admite puntuaciones de confianza y listas NBest. Por lo tanto, no se recomienda la segmentación semántica si usa puntuaciones de confianza o listas NBest.

Refinamiento posterior a la transmisión (vista previa)

El refinamiento post-transmisión mejora la precisión final de la transcripción ejecutando una segunda pasada de reconocimiento en paralelo con la transmisión en tiempo real. Los resultados intermedios y parciales siguen siendo de baja latencia. Solo el resultado final se reemplaza por una versión más precisa que usa un contexto de audio más amplio.

Para habilitar el refinamiento después de la secuencia, establezca la propiedad SpeechServiceResponse_PostProcessingOption en la instancia SpeechConfig.

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

Algunas consideraciones importantes para el refinamiento posterior al flujo:

  • El posprocesamiento funciona mejor para enunciados más largos, como conversaciones, reuniones y dictados. Para frases muy cortas, el resultado refinado podría ser idéntico al resultado estándar.
  • No se pueden utilizar juntos el refinamiento posterior a la secuencia y la segmentación semántica.
  • El refinamiento posterior a la transmisión y TrueText son valores distintos de la misma propiedad SpeechServiceResponse_PostProcessingOption. Solo se puede establecer un valor a la vez.
  • El refinamiento posterior a la secuencia solo está disponible en regiones de Azure seleccionadas durante la versión preliminar pública.

Para obtener más información sobre las opciones posteriores al procesamiento, vea Uso del procesamiento posterior.

Importante

El refinamiento después de la transmisión se encuentra actualmente en versión preliminar pública. Las mejoras de precisión varían según el idioma y la configuración regional. Es posible que algunas localizaciones no muestren mejoras de calidad significativas, y los resultados pueden diferir de lo que se observa con el reconocimiento estándar. Solo se admite el reconocimiento monolingüe durante la versión preliminar. La identificación de idioma automática y multilingüe no está disponible con refinamiento posterior a la secuencia.

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

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Creación de una instancia de configuración de voz

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

  1. Crear un recurso de Foundry para Voz en Azure Portal. Obtenga la clave y el punto de conexión del recurso de Voz.
  2. Cree una SpeechConfig instancia mediante el código siguiente. Reemplazar YourSpeechEndpoint y YourSpeechKey por el punto de conexión y la clave del recurso de voz.
const speechConfig = sdk.SpeechConfig.fromEndpoint(new URL("YourSpeechEndpoint"), "YourSpeechKey");

Puede inicializar SpeechConfig de algunas otras maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. Un token de clave o autorización es opcional.
  • Utilice un host e ingrese una dirección de host. Un token de clave o autorización es opcional.
  • Use un token de autorización con la región o ubicación asociada.

Nota

Independientemente de si va a realizar el reconocimiento de voz, la síntesis de voz, la traducción o el reconocimiento de intenciones, siempre se crea una configuración.

Reconocimiento de voz desde un micrófono

No se admite el reconocimiento de voz desde un micrófono en Node.js. Solo se admite en un entorno de JavaScript basado en explorador. Para obtener más información, consulte el ejemplo React y la implementación de voz en texto desde 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 muestra la captura de audio de un micrófono o archivo para las conversiones de voz a texto.

Nota

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

Reconocimiento de voz a partir de un archivo

Para reconocer la voz de un archivo de audio, cree una AudioConfig instancia mediante el fromWavFileInput() método , que acepta un Buffer objeto . A continuación, inicialice SpeechRecognizer pasando audioConfig y speechConfig.

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

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 de una secuencia en memoria

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

  • Crea una secuencia de inserción mediante createPushStream().
  • Lee un archivo de .wav mediante fs.createReadStream para fines de demostración. Si ya tiene datos de audio en ArrayBuffer, puede ir 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.fromEndpoint("YourSpeechEndpoint", "YourSpeechKey");

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 sigue funcionando en determinados casos si no se omite el encabezado. Para obtener los mejores resultados, considere la posibilidad de implementar lógica para leer los encabezados de modo que fs comience al principio de los datos de audio.

Manejo de errores

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

  • Imprime el resultado del reconocimiento: ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, informa al usuario: ResultReason.NoMatch.
  • Si se produce un error, 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 endpoint values?");
        }
        break;
    }

Uso del reconocimiento continuo

En los ejemplos anteriores se usa el reconocimiento de captura única, que reconoce una sola 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 cuando quiera controlar cuándo dejar de reconocer. 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] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-stopcontinuousrecognitionasync). Este es un ejemplo de cómo se realiza el reconocimiento continuo en un archivo de entrada de audio.

Comience definiendo la entrada e inicializando SpeechRecognizer:

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

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

  • recognizing: indica los eventos que contienen resultados intermedios de reconocimiento.
  • recognized: Señal para eventos que contienen los resultados finales del reconocimiento, que indican un intento exitoso de reconocimiento.
  • sessionStopped: indica los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: indica los eventos que contienen resultados de reconocimiento cancelados. 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 endpoint values?");
    }

    speechRecognizer.stopContinuousRecognitionAsync();
};

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

Con todo configurado, llame a [startContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-startkeywordrecognitionasync) para empezar a reconocer:

speechRecognizer.startContinuousRecognitionAsync();

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

Cambiar el idioma de origen

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

speechConfig.speechRecognitionLanguage = "it-IT";

La propiedad speechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Para obtener una lista de las configuraciones regionales admitidas, consulte Compatibilidad con idiomas y voz para el servicio voz.

Identificación del idioma

Puede usar la identificación del idioma con el reconocimiento de voz a texto cuando necesite identificar el idioma en un origen de audio y, a continuación, transcribirlo al texto.

Para obtener un ejemplo de código completo, consulte Identificación del idioma.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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("YourSpeechResoureKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

Documentación de referencia | Ejemplos adicionales en GitHub

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Creación de una instancia de configuración de voz

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

  1. Crear un recurso de Foundry para Voz en Azure Portal. Obtenga la clave y la región del recurso de Voz.
  2. Cree una instancia de SpeechConfig mediante la clave de Voz y la región.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
    }
}

Puede inicializar SpeechConfig de algunas otras maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. Un token de clave o autorización es opcional.
  • Utilice un host e ingrese una dirección de host. Un token de clave o autorización es opcional.
  • Use un token de autorización con la región o ubicación asociada.

Nota

Independientemente de si va a realizar el reconocimiento de voz, la síntesis de voz, la traducción o el reconocimiento de intenciones, siempre creará una configuración.

Reconocimiento de voz desde un micrófono

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

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

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
        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 speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

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

Reconocimiento de voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio en lugar de usar un micrófono, deberá crear una AudioConfig instancia. Sin embargo, no llama a FromDefaultMicrophoneInput(). Llame a fromWavFileInput() y proporcione la ruta de acceso del archivo:

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

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
        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 speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

Manejo de errores

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

  • Imprime el resultado del reconocimiento: ResultReason.RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, informa al usuario: ResultReason.NoMatch.
  • Si se produce un error, imprime el mensaje de error: ResultReason.Canceled.
switch (speechRecognitionResult.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + speechRecognitionResult.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(speechRecognitionResult);
            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 captura única, que reconoce una sola 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, se usa el reconocimiento continuo cuando se desea controlar cuándo dejar de reconocer. 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 puede realizar el reconocimiento continuo en un archivo de entrada de audio.

Comience definiendo la entrada e inicializando 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 Semaphore instancia en el ámbito de la clase.

private static Semaphore stopTranslationWithFileSemaphore;

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

  • recognizing: indica los eventos que contienen resultados intermedios de reconocimiento.
  • recognized: Señal para eventos que contienen los resultados finales del reconocimiento, que indican un intento exitoso de reconocimiento.
  • sessionStopped: indica los eventos que indican el final de una sesión de reconocimiento (operación).
  • canceled: indica los eventos que contienen resultados de reconocimiento cancelados. 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();
});

Con todo configurado, llama a startContinuousRecognitionAsync para empezar a reconocer:

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

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

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

Cambiar el idioma de origen

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

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage es un parámetro que toma una cadena como argumento. Consulte la lista de regiones admitidas para la conversión de voz a texto.

Identificación del idioma

Puede usar la identificación del idioma con el reconocimiento de voz a texto cuando necesite identificar el idioma en un origen de audio y, a continuación, transcribirlo al texto.

Para obtener un ejemplo de código completo, consulte Identificación del idioma.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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("YourSpeechKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

Segmentación semántica

La segmentación semántica es una estrategia de segmentación de reconocimiento de voz diseñada para mitigar los problemas asociados a la segmentación basada en silencio:

  • Subsegmentación: cuando los usuarios hablan durante mucho tiempo sin pausas, pueden ver una larga secuencia de texto sin saltos ("pared del texto"), lo que degrada gravemente su experiencia de legibilidad.
  • Sobresegmentación: cuando un usuario se detiene durante un breve tiempo, el mecanismo de detección de silencio puede segmentar incorrectamente.

En lugar de depender solo de tiempos de espera de silencio, la segmentación semántica principalmente segmenta y devuelve resultados finales cuando detecta signos de puntuación al final de la frase (como "." o "?"). Esto mejora la experiencia del usuario con segmentos de mayor calidad y semánticamente completos y evita largos resultados intermedios.

Para usar la segmentación semántica, debe establecer la siguiente propiedad en la SpeechConfig instancia usada para crear un SpeechRecognizer:

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

Algunas de las limitaciones de la segmentación semántica son las siguientes:

  • Necesita la versión 1.41 o posterior del SDK de Voz para usar la segmentación semántica.
  • La segmentación semántica solo está pensada para su uso en el reconocimiento continuo. Esto incluye escenarios como dictado y subtítulos. No se debe usar en el modo de reconocimiento único ni en escenarios interactivos.
  • La segmentación semántica no está disponible para todos los idiomas y configuraciones regionales.
  • La segmentación semántica aún no admite puntuaciones de confianza y listas NBest. Por lo tanto, no se recomienda la segmentación semántica si usa puntuaciones de confianza o listas NBest.

Refinamiento posterior a la transmisión (vista previa)

El refinamiento post-transmisión mejora la precisión final de la transcripción ejecutando una segunda pasada de reconocimiento en paralelo con la transmisión en tiempo real. Los resultados intermedios y parciales siguen siendo de baja latencia. Solo el resultado final se reemplaza por una versión más precisa que usa un contexto de audio más amplio.

Para habilitar el refinamiento después de la secuencia, establezca la propiedad SpeechServiceResponse_PostProcessingOption en la instancia SpeechConfig.

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

Algunas consideraciones importantes para el refinamiento posterior al flujo:

  • El posprocesamiento funciona mejor para enunciados más largos, como conversaciones, reuniones y dictados. Para frases muy cortas, el resultado refinado podría ser idéntico al resultado estándar.
  • No se pueden utilizar juntos el refinamiento posterior a la secuencia y la segmentación semántica.
  • El refinamiento posterior a la transmisión y TrueText son valores distintos de la misma propiedad SpeechServiceResponse_PostProcessingOption. Solo se puede establecer un valor a la vez.
  • El refinamiento posterior a la secuencia solo está disponible en regiones de Azure seleccionadas durante la versión preliminar pública.

Para obtener más información sobre las opciones posteriores al procesamiento, vea Uso del procesamiento posterior.

Importante

El refinamiento después de la transmisión se encuentra actualmente en versión preliminar pública. Las mejoras de precisión varían según el idioma y la configuración regional. Es posible que algunas configuraciones regionales no muestren mejoras de calidad significativas y que los resultados puedan diferir de lo que observa con el reconocimiento estándar. Solo se admite el reconocimiento monolingüe durante la versión preliminar. La identificación de idioma automática y multilingüe no está disponible con refinamiento posterior a la secuencia.

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

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Creación de una instancia de configuración de voz

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

  1. Crear un recurso de Foundry para Voz en Azure Portal. Obtenga la clave del servicio de voz y el punto de conexión.
  2. Cree una SpeechConfig instancia mediante el código siguiente. Sustituya YourSpeechKey y YourSpeechEndpoint por su clave de recurso de Voz y su punto de conexión.
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSpeechResourceKey");

Puede inicializar SpeechConfig de algunas otras maneras:

  • Con un punto de conexión, pase un punto de conexión de servicio de voz. Un token de clave o autorización es opcional.
  • Utilice un host e ingrese una dirección de host. Un token de clave o autorización es opcional.
  • Use un token de autorización con la región o ubicación asociada.

Nota

Independientemente de si va a realizar el reconocimiento de voz, la síntesis de voz o la traducción, siempre se crea una configuración.

Reconocimiento de voz desde un micrófono

Para reconocer la voz mediante el micrófono del dispositivo, cree una AudioConfig instancia usando la función miembro FromDefaultMicrophoneInput(). A continuación, inicialice elSpeechRecognizer objeto pasando 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 AudioConfig. Para obtener información sobre cómo obtener el identificador de dispositivo, consulte Selección de un dispositivo de entrada de audio con el SDK de Voz.

Reconocimiento de voz a partir de un archivo

Si desea reconocer la voz de un archivo de audio en lugar de usar un micrófono, deberá crear una AudioConfig instancia. Sin embargo, no llama a FromDefaultMicrophoneInput(). Llame a FromWavFileInput() y pase la ruta de acceso 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 del SDK de Voz para C++ expone algunos métodos que puede usar para el reconocimiento de voz.

Reconocimiento de captura única

El reconocimiento de una sola toma reconoce de manera asincrónica una sola oració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 captura única mediante RecognizeOnceAsync:

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

Debe escribir algún código para manejar el resultado. En este ejemplo se evalúa result->Reason y:

  • Imprime el resultado del reconocimiento: ResultReason::RecognizedSpeech.
  • Si no hay ninguna coincidencia de reconocimiento, informa al usuario: ResultReason::NoMatch.
  • Si se produce un error, 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 endpoint values?" << std::endl;
            }
        }
        break;
    default:
        break;
}

Reconocimiento continuo

El reconocimiento continuo es un poco más implicado 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 reconocimiento continuo realizado en un archivo de entrada de audio.

Comience definiendo la entrada e inicializando 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 SpeechRecognizer envía:

  • Recognizing: indica los eventos que contienen resultados intermedios de reconocimiento.
  • Recognized: Señal para eventos que contienen los resultados finales del reconocimiento, que indican un intento exitoso de reconocimiento.
  • SessionStopped: indica los eventos que indican el final de una sesión de reconocimiento (operación).
  • Canceled: indica los eventos que contienen resultados de reconocimiento cancelados. 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 endpoint 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.
    });

Con todo configurado, llama a StartContinuousRecognitionAsync para empezar a reconocer:

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

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

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

Cambiar el idioma de origen

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

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

SetSpeechRecognitionLanguage es un parámetro que toma una cadena como argumento. Para obtener una lista de las configuraciones regionales admitidas, consulte Compatibilidad con idiomas y voz para el servicio voz.

Identificación del idioma

Puede usar la identificación del idioma con el reconocimiento de voz a texto cuando necesite identificar el idioma en un origen de audio y, a continuación, transcribirlo al texto.

Para obtener un ejemplo de código completo, consulte Identificación del idioma.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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::FromEndpoint("YourServiceEndpoint", "YourSpeechResourceKey");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y un punto de conexión.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

Segmentación semántica

La segmentación semántica es una estrategia de segmentación de reconocimiento de voz diseñada para mitigar los problemas asociados a la segmentación basada en silencio:

  • Subsegmentación: cuando los usuarios hablan durante mucho tiempo sin pausas, pueden ver una larga secuencia de texto sin saltos ("pared del texto"), lo que degrada gravemente su experiencia de legibilidad.
  • Sobresegmentación: cuando un usuario se detiene durante un breve tiempo, el mecanismo de detección de silencio puede segmentar incorrectamente.

En lugar de depender solo de tiempos de espera de silencio, la segmentación semántica principalmente segmenta y devuelve resultados finales cuando detecta signos de puntuación al final de la frase (como "." o "?"). Esto mejora la experiencia del usuario con segmentos de mayor calidad y semánticamente completos y evita largos resultados intermedios.

Para usar la segmentación semántica, debe establecer la siguiente propiedad en la SpeechConfig instancia usada para crear un SpeechRecognizer:

speechConfig->SetProperty(PropertyId::Speech_SegmentationStrategy, "Semantic");

Algunas de las limitaciones de la segmentación semántica son las siguientes:

  • Necesita la versión 1.41 o posterior del SDK de Voz para usar la segmentación semántica.
  • La segmentación semántica solo está pensada para su uso en el reconocimiento continuo. Esto incluye escenarios como dictado y subtítulos. No se debe usar en el modo de reconocimiento único ni en escenarios interactivos.
  • La segmentación semántica no está disponible para todos los idiomas y configuraciones regionales.
  • La segmentación semántica aún no admite puntuaciones de confianza y listas NBest. Por lo tanto, no se recomienda la segmentación semántica si usa puntuaciones de confianza o listas NBest.

Refinamiento posterior a la transmisión (vista previa)

El refinamiento post-transmisión mejora la precisión final de la transcripción ejecutando una segunda pasada de reconocimiento en paralelo con la transmisión en tiempo real. Los resultados intermedios y parciales siguen siendo de baja latencia. Solo el resultado final se reemplaza por una versión más precisa que usa un contexto de audio más amplio.

Para habilitar el refinamiento después de la secuencia, establezca la propiedad SpeechServiceResponse_PostProcessingOption en la instancia SpeechConfig.

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

Algunas consideraciones importantes para el refinamiento posterior al flujo:

  • El posprocesamiento funciona mejor para enunciados más largos, como conversaciones, reuniones y dictados. Para frases muy cortas, el resultado refinado podría ser idéntico al resultado estándar.
  • No se pueden utilizar juntos el refinamiento posterior a la secuencia y la segmentación semántica.
  • El refinamiento posterior a la transmisión y TrueText son valores distintos de la misma propiedad SpeechServiceResponse_PostProcessingOption. Solo se puede establecer un valor a la vez.
  • El refinamiento posterior a la secuencia solo está disponible en regiones de Azure seleccionadas durante la versión preliminar pública.

Para obtener más información sobre las opciones posteriores al procesamiento, vea Uso del procesamiento posterior.

Importante

El refinamiento después de la transmisión se encuentra actualmente en versión preliminar pública. Las mejoras de precisión varían según el idioma y la configuración regional. Es posible que algunas localizaciones no muestren mejoras de calidad significativas, y los resultados pueden diferir de lo que se observa con el reconocimiento estándar. Solo se admite el reconocimiento monolingüe durante la versión preliminar. La identificación de idioma automática y multilingüe no está disponible con refinamiento posterior a la secuencia.

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

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

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

  1. Crear un recurso de Foundry para Voz en Azure Portal. Obtenga la clave y la región del recurso de Voz.
  2. Use el ejemplo de código siguiente para ejecutar el reconocimiento de voz desde el micrófono de dispositivo predeterminado. Reemplace YourSpeechKey con su clave de recurso de Voz y YourSpeechRegion con su región. La ejecución del script inicia una sesión de reconocimiento en tu micrófono predeterminado y genera el texto como salida.
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 siguientes comandos para crear un archivo go.mod que se vincula a los componentes hospedados en GitHub:

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

Ahora compile y ejecute el código:

go build
go run quickstart

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

Reconocer voz en texto desde un archivo de audio

Use el ejemplo siguiente para ejecutar el reconocimiento de voz desde un archivo de audio. Reemplace YourSpeechKey con su clave de recurso de Voz y YourSpeechRegion con su región. 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 siguientes comandos para crear un archivo go.mod que se vincula a los componentes hospedados en GitHub:

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

Ahora compile y ejecute el código:

go build
go run quickstart

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

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

Documentación de referencia | Paquete (descargar) | Muestras adicionales en GitHub

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

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 obtener más información, consulte la referencia del SDK de Voz para Objective-C.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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:"YourSpeechResoureKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

Reconocimiento de voz desde un micrófono

Conecte y active el micrófono del PC. Desactive 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 interfaz de línea de comandos para reconocimiento de voz y reconocer la voz captada por el micrófono. En la línea de comandos, cambie al directorio que contiene el archivo binario de la CLI de Voz. A continuación, ejecute el siguiente comando:

spx recognize --microphone

Nota

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

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

Reconocimiento de voz a partir de un archivo

La CLI de Voz puede reconocer la voz en muchos formatos de archivo y lenguajes naturales. En este ejemplo, puede usar cualquier archivo .wav (16 kHz o 8 kHz, 16 bits y PCM mono) que contenga voz en inglés. O bien, si desea obtener un ejemplo 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 para 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 inglés. Puede elegir un idioma diferente de la tabla de voz a texto. Por ejemplo, agregue --source de-DE para reconocer el habla alemana.

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

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.

Documentación de referencia | Paquete (descargar) | Muestras adicionales en GitHub

En esta guía de instrucciones, aprenderá a utilizar Azure Speech en Foundry Tools para la conversión de voz a texto en tiempo real. El reconocimiento de voz en tiempo real es ideal para aplicaciones que requieren transcripción inmediata, como dictado, asistencia al centro de llamadas y subtítulos para reuniones en directo.

Para obtener información sobre cómo configurar el entorno para una aplicación de ejemplo, consulte Inicio rápido: Reconocimiento y conversión de voz en texto.

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 obtener más información, consulte la referencia del SDK de Voz para Objective-C.

Uso de un punto de conexión personalizado

Con la voz personalizada, puede cargar sus propios datos, probar y entrenar un modelo personalizado, comparar la precisión entre los 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: "YourSpeechResoureKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);

Ejecución y uso de 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, debe cambiar el método de inicialización. Use una dirección URL de host de contenedor en lugar de una clave y una región.

Para obtener más información sobre los contenedores, consulte las direcciones URL de host en Instalar y ejecutar contenedores de voz con Docker.