Uso del flujo de entrada de audio

El SDK de Voz proporciona una manera de transmitir audio al reconocedor como alternativa a la entrada del micrófono o el archivo.

En esta guía se describe cómo usar flujos de entrada de audio. También describe algunos de los requisitos y limitaciones del flujo de entrada de audio.

Consulte más ejemplos de reconocimiento con conversión de voz a texto con flujo de entrada de audio en GitHub.

Identificar el formato del flujo de audio

Identificar el formato de la secuencia de audio.

Las muestras de audio admitidas son:

  • Formato PCM (int-16, firmado)
  • Un canal
  • 16 bits por muestra, 8000 o 16 000 muestras por segundo (16 000 o 32 000bytes por segundo)
  • Alineación en dos bloques (16 bits, incluido el relleno de una muestra)

El código correspondiente en el SDK para crear el formato de audio es similar al ejemplo siguiente:

byte channels = 1;
byte bitsPerSample = 16;
int samplesPerSecond = 16000; // or 8000
var audioFormat = AudioStreamFormat.GetWaveFormatPCM(samplesPerSecond, bitsPerSample, channels);

Asegúrese de que el código incluya los datos de audio RAW de acuerdo con estas especificaciones. Asegúrese también de que las muestras de 16 bits tengan el formato Little-Endian. Si los datos del origen de audio no coinciden con los formatos admitidos, el audio se debe transcodificar al formato requerido.

Cree su propia clase de flujo de entrada de audio

Puede crear su propia clase de flujo de entrada de audio derivada de PullAudioInputStreamCallback. Implemente los miembros Read() y Close(). La signatura de función exacta depende del lenguaje, pero el código tendrá un aspecto similar al de este ejemplo:

public class ContosoAudioStream : PullAudioInputStreamCallback 
{
    public ContosoAudioStream() {}

    public override int Read(byte[] buffer, uint size) 
    {
        // Returns audio data to the caller.
        // E.g., return read(config.YYY, buffer, size);
        return 0;
    }

    public override void Close() 
    {
        // Close and clean up resources.
    }
}

Cree una configuración de audio según el formato y el flujo de entrada de audio personalizado. Por ejemplo:

var audioConfig = AudioConfig.FromStreamInput(new ContosoAudioStream(), audioFormat);

Aquí se muestra cómo se usa el flujo de entrada de audio personalizado en el contexto de un reconocedor de voz:

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

public class ContosoAudioStream : PullAudioInputStreamCallback 
{
    public ContosoAudioStream() {}

    public override int Read(byte[] buffer, uint size) 
    {
        // Returns audio data to the caller.
        // E.g., return read(config.YYY, buffer, size);
        return 0;
    }

    public override void Close() 
    {
        // Close and clean up resources.
    }
}

class Program 
{
    static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY");
    static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION");

    async static Task Main(string[] args)
    {
        byte channels = 1;
        byte bitsPerSample = 16;
        uint samplesPerSecond = 16000; // or 8000
        var audioFormat = AudioStreamFormat.GetWaveFormatPCM(samplesPerSecond, bitsPerSample, channels);
        var audioConfig = AudioConfig.FromStreamInput(new ContosoAudioStream(), audioFormat);

        var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion); 
        speechConfig.SpeechRecognitionLanguage = "en-US";
        var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

Pasos siguientes