Jak używać strumienia wejściowego audio

Zestaw SPEECH SDK umożliwia przesyłanie strumieniowe dźwięku do aparatu rozpoznawania jako alternatywę dla mikrofonu lub danych wejściowych plików.

W tym przewodniku opisano sposób używania strumieni wejściowych audio. Opisuje również niektóre wymagania i ograniczenia strumienia wejściowego audio.

Zobacz więcej przykładów rozpoznawania mowy na tekst ze strumieniem wejściowym audio w usłudze GitHub.

Identyfikowanie formatu strumienia audio

Zidentyfikuj format strumienia audio.

Obsługiwane przykłady audio to:

  • Format PCM (int-16, podpisany)
  • Jeden kanał
  • 16 bitów na próbkę, 8000 lub 16 000 próbek na sekundę (16 000 bajtów lub 32 000 bajtów na sekundę)
  • Wyrównane do dwóch bloków (16 bitów, w tym wypełnienie próbki)

Odpowiedni kod w zestawie SDK do utworzenia formatu audio wygląda następująco:

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

Upewnij się, że kod dostarcza nieprzetworzone dane audio zgodnie z tymi specyfikacjami. Upewnij się również, że 16-bitowe próbki są dostarczane w formacie mało endianu. Jeśli dane źródła audio nie są zgodne z obsługiwanymi formatami, dźwięk musi być transkodowany w wymaganym formacie.

Tworzenie własnej klasy strumienia wejściowego audio

Możesz utworzyć własną klasę strumienia wejściowego audio pochodzącą z PullAudioInputStreamCallbackklasy . Zaimplementuj elementy członkowskie Read() i Close(). Dokładny podpis funkcji jest zależny od języka, ale kod wygląda podobnie do tego przykładowego kodu:

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

Utwórz konfigurację audio na podstawie formatu audio i niestandardowego strumienia wejściowego audio. Na przykład:

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

Poniżej przedstawiono sposób użycia niestandardowego strumienia wejściowego audio w kontekście rozpoznawania mowy:

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

Następne kroki