Come usare il flusso di input audio

Speech SDK consente di trasmettere l'audio nel sistema di riconoscimento come alternativa all'input del microfono o del file.

Questa guida descrive come usare i flussi di input audio. Descrive anche alcuni requisiti e limitazioni del flusso di input audio.

Vedere altri esempi di riconoscimento vocale con flusso di input audio in GitHub.

Identificare il formato del flusso audio

Identificare il formato del flusso audio.

Gli esempi audio supportati sono:

  • Formato PCM (int-16, firmato)
  • Un canale
  • 16 bit per campione, 8.000 o 16.000 campioni al secondo (16.000 byte o 32.000 byte al secondo)
  • Allineamento a due blocchi (16 bit inclusa la spaziatura interna per un campione)

Il codice corrispondente nell'SDK per creare il formato audio è simile all'esempio seguente:

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

Assicurarsi che il codice fornisca i dati audio RAW in base a queste specifiche. Assicurarsi inoltre che gli esempi a 16 bit arrivino in formato little-endian. Se i dati dell’origine audio non corrispondono ai formati supportati, l'audio deve essere transcodificato nel formato richiesto.

Creare una classe di flusso di input audio personalizzata

È possibile creare una classe di flusso di input audio personalizzata derivata da PullAudioInputStreamCallback. Implementare i membri Read() e Close(). La firma esatta della funzione dipende dal linguaggio, ma il codice è simile a questo esempio di codice:

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

Creare una configurazione audio basata sul formato audio e sul flusso di input audio personalizzato. Ad esempio:

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

Ecco come viene usato il flusso di input audio personalizzato nel contesto di un riconoscimento vocale:

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

Passaggi successivi