Verwenden des Audioeingabestreams

Das Speech SDK bietet als Alternative zu Mikrofon- oder Dateieingaben eine Möglichkeit, Audio in das Erkennungsmodul zu streamen.

In diesem Leitfaden wird beschrieben, wie Audioeingabestreams verwendet werden. Außerdem werden einige der Anforderungen und Einschränkungen des Audioeingabestreams beschrieben.

Weitere Beispiele für die Spracherkennung mit Audioeingabestream finden Sie auf GitHub.

Ermitteln des Format des Audiodatenstroms

Ermitteln Sie das Format des Audiodatenstroms.

Dies sind unterstützte Sampleformate für Audio:

  • PCM-Format (int-16, signiert)
  • Ein Kanal
  • 16 Bits pro Sample, 8.000 oder 16.000 Samples pro Sekunde (16.000 Bytes oder 32.000 Bytes pro Sekunde)
  • Ausrichtung in zwei Blöcken (16 Bit einschließlich Auffüllung pro Sample)

Der entsprechende Code im SDK zum Erstellen des Audioformats sieht aus wie in diesem Beispiel:

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

Achten Sie darauf, dass Ihr Code die Audiorohdaten entsprechend diesen Spezifikationen bereitstellt. Stellen Sie darüber hinaus sicher, dass 16-Bit-Samples im Little-Endian-Format eingehen. Wenn die Audioquelldaten nicht mit den unterstützten Formaten übereinstimmen, muss das Audiomaterial in das erforderliche Format transcodiert werden.

Erstellen einer eigenen Audioeingabestream-Klasse

Sie können eine eigene Audioeingabestream-Klasse erstellen, die von PullAudioInputStreamCallback abgeleitet ist. Implementieren Sie die Member Read() und Close(). Die genaue Funktionssignatur ist sprachabhängig, der Code entspricht jedoch in etwa dem folgenden Codebeispiel:

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

Erstellen Sie eine Audiokonfiguration basierend auf Ihrem Audioformat und dem benutzerdefinierten Audioeingabestream. Beispiel:

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

So wird der benutzerdefinierte Audioeingabestream im Kontext eines Spracherkennungsmoduls verwendet:

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

Nächste Schritte