Como usar o fluxo de entrada de áudio

O SDK de Fala fornece uma maneira de transmitir áudio para o reconhecedor como uma alternativa à entrada de microfone ou arquivo.

Este guia descreve como usar fluxos de entrada de áudio. Ele também descreve alguns dos requisitos e limitações do fluxo de entrada de áudio.

Veja mais exemplos de reconhecimento de conversão de fala em texto com fluxo de entrada de áudio no GitHub.

Identificar o formato do fluxo de áudio.

Identificar o formato do fluxo de áudio.

Os exemplos de áudio com suporte são:

  • Formato PCM (int-16, assinado)
  • Um canal
  • 16 bits por amostra, 8 mil ou 16 mil amostras por segundo (16 mil bytes ou 32 mil bytes por segundo)
  • Dois blocos alinhados (16 bits, incluindo o preenchimento de uma amostra)

O código correspondente no SDK para criar o formato de áudio é parecido com este exemplo:

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

Confira se o código fornece os dados de áudio brutos de acordo com estas especificações. Além disso, verifique se as amostras de 16 bits chegam no formato little endian. Se os dados de origem do áudio não corresponderem aos formatos com suporte, o áudio deverá ser transcodificado no formato exigido.

Crie sua própria classe de fluxo de entrada de áudio

Crie sua própria classe de fluxo de entrada de áudio derivada de PullAudioInputStreamCallback. Implemente os membros Read() e Close(). A assinatura de função exata é dependente de idioma, mas o código é semelhante a este exemplo de código:

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.
    }
}

Crie uma configuração de áudio com base em seu formato e fluxo de entrada de áudio personalizado. Por exemplo:

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

Veja como o fluxo de entrada de áudio personalizado é usado no contexto de um reconhecedor de fala:

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

Próximas etapas