音声入力ストリームの使用方法

Speech SDK は、マイクまたはファイル入力の代わりに、認識エンジンにオーディオをストリーミングする方法を提供します。

このガイドでは、オーディオ入力ストリームを使用する方法について説明します。 また、オーディオ入力ストリームのいくつかの要件と制限事項についても説明します。

オーディオ入力ストリームを使用した音声テキスト変換認識のその他の例については、GitHub を参照してください。

オーディオ ストリームの形式を識別する

オーディオ ストリームの形式を識別します。

サポートされているオーディオのサンプルは次のとおりです。

  • PCM 形式 (int-16、署名済み)
  • 1 つのチャネル
  • 16 ビット/サンプル、8,000 または 16,000 サンプル/秒 (16,000 バイトまたは 32,000 バイト/秒)
  • 2 ブロック配列 (サンプルのパディングを含む 16 ビット)

オーディオ形式を作成するための SDK の対応するコードは次の例のようになります。

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

コードがこれらの仕様に従って RAW オーディオ データを提供していることを確認します。 また、16 ビットのサンプルは、リトル エンディアン形式で到達するようにしてください。 オーディオ ソース データが、サポートされている形式と一致しない場合、オーディオは、必要な形式にトランスコードする必要があります。

独自のオーディオ入力ストリーム クラスを作成する

PullAudioInputStreamCallback から派生された独自のオーディオ入力ストリーム クラスを作成できます。 Read() メンバーと Close() メンバーを実装します。 正確な関数シグネチャは言語に依存しますが、そのコードは以下のサンプル コードのようになります。

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

オーディオ形式とカスタム オーディオ入力ストリームに基づいて、オーディオ構成を作成します。 次に例を示します。

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

音声認識エンジンのコンテキストでカスタム オーディオ入力ストリームを使用する方法を次に示します。

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

次の手順