Como usar o fluxo de entrada de áudio

O SDK de fala fornece uma maneira de transmitir áudio para o reconhecedor como uma alternativa ao microfone ou entrada de 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 fala para texto com fluxo de entrada de áudio no GitHub.

Identificar o formato do fluxo de áudio

Identifique o formato do fluxo de áudio.

As amostras de áudio suportadas são:

  • Formato PCM (int-16, assinado)
  • Um canal
  • 16 bits por amostra, 8.000 ou 16.000 amostras por segundo (16.000 bytes ou 32.000 bytes por segundo)
  • Dois blocos alinhados (16 bits, incluindo preenchimento para uma amostra)

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

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

Certifique-se de que seu código fornece os dados de áudio RAW de acordo com essas especificações. Além disso, certifique-se de que as amostras de 16 bits cheguem no formato little-endian. Se os dados da fonte de áudio não corresponderem aos formatos suportados, o áudio deverá ser transcodificado para o formato necessário.

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

Você pode criar sua própria classe de fluxo de entrada de áudio derivada de PullAudioInputStreamCallback. Implementar o Read() e Close() membros. A assinatura da função exata depende do 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 no seu formato de áudio 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óximos passos