音声を認識する方法

リファレンス ドキュメント | パッケージ (NuGet) | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

音声構成を作成する

Speech SDK を使用して音声サービスを呼び出すには、SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーとそれに関連付けられた場所またはリージョン、エンドポイント、ホスト、認証トークンなど、サブスクリプションに関する情報が含まれています。

  1. キーと場所またはリージョンを使用して SpeechConfig インスタンスを作成します。
  2. Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    }
}

SpeechConfig は、その他いくつかの方法で初期化できます。

  • エンドポイントを使用します。Speech Service エンドポイントを渡します。 キーまたは認証トークンは省略可能です。
  • ホストを使用します。ホスト アドレスを渡します。 キーまたは認証トークンは省略可能です。
  • リージョン/場所に関連付けられた認可トークンを使用します。

Note

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。

マイクから音声を認識する

デバイス マイクを使用して音声を認識するには、FromDefaultMicrophoneInput() メソッドを使用して AudioConfig インスタンスを作成します。 次に、speechConfigaudioConfig を渡して SpeechRecognizer オブジェクトを初期化します。

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromMic(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        Console.WriteLine("Speak into your microphone.");
        var result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromMic(speechConfig);
    }
}

"特定の" オーディオ入力デバイスを使用したい場合、AudioConfig でデバイス ID を指定する必要があります。 自分のオーディオ入力デバイスのデバイス ID を取得する方法をご覧ください。

ファイルから音声を認識する

マイクではなくオーディオ ファイルから音声を認識する場合でも、AudioConfig インスタンスを作成する必要があります。 ただし、この場合は FromDefaultMicrophoneInput() を呼び出しません。 FromWavFileInput() を呼び出してファイル パスを渡します。

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromFile(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        var result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromFile(speechConfig);
    }
}

インメモリ ストリームから音声を認識する

多くのユース ケースでは、音声データはたいてい Azure Blob Storage から取得されるか、または、あらかじめメモリ内に byte[] インスタンスや同様の生データ構造として存在します。 以下の例では、PushAudioInputStream という、実質的に抽象化されたメモリ ストリームを使用して音声を認識します。 サンプル コードは、次のアクションを実行します。

  • byte[] インスタンスを引数として受け取る Write() 関数を使用して、生の音声データ (PCM) を PushAudioInputStream に書き込みます。
  • デモンストレーションのために、FileReader を使用して .wav ファイルを読み取ります。 既に byte[] インスタンスに音声データが存在する場合は、スキップして、入力ストリームへのコンテンツの書き込みに進んでください。
  • 既定の形式は、16 ビット、16 KHz のモノラル パルス符号変調 (PCM) データです。 この形式をカスタマイズしたい場合は、静的関数 AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels) を使用して、CreatePushStream()AudioStreamFormat オブジェクトを渡してください。
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromStream(SpeechConfig speechConfig)
    {
        var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
        using var audioConfigStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioConfigStream);
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        byte[] readBytes;
        do
        {
            readBytes = reader.ReadBytes(1024);
            audioConfigStream.Write(readBytes, readBytes.Length);
        } while (readBytes.Length > 0);

        var result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromStream(speechConfig);
    }
}

プッシュ ストリームを入力として使用する場合、音声データは生の PCM で、ヘッダーをスキップすることが前提となります。 ヘッダーがスキップされていない場合でも、一部のケースでは、API が機能します。 最良の結果を得るためには、"音声データの開始" 位置から byte[] が始まるよう、ヘッダーを除外して読み取るロジックを実装することを検討してください。

エラーの処理

これまでの例は、認識されたテキストを result.Text プロパティから取得するだけのものでした。 エラーやその他の応答を処理するためには、結果を処理するためのコードを記述する必要があります。 以下のコードでは、result.Reason プロパティを評価したうえで、次の処理を行っています。

  • 認識結果を出力します: ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: ResultReason.NoMatch
  • エラーが検出された場合は、エラー メッセージを出力します: ResultReason.Canceled
switch (result.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(result);
        Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

        if (cancellation.Reason == CancellationReason.Error)
        {
            Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
            Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
            Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
        }
        break;
}

継続的認識を使用する

これまでの例では、1 つの発話を認識する単発の認識を使用してきました。 1 つの発話の終わりは、終了時の無音状態をリッスンするか、最大 15 秒のオーディオが処理されるまで待機することによって決定されます。

一方、認識を停止するタイミングを制御したい場合は、継続的認識を使用します。 この場合は、認識結果を取得するために、RecognizingRecognizedCanceled の各イベントをサブスクライブする必要があります。 認識を停止するには、StopContinuousRecognitionAsync を呼び出す必要があります。 オーディオ入力ファイルに対して継続的認識を実行する方法の例を次に示します。

まず、入力を定義し、SpeechRecognizer を初期化します。

using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

次に、音声認識の状態を管理する TaskCompletionSource<int> インスタンスを作成します。

var stopRecognition = new TaskCompletionSource<int>();

次に、SpeechRecognizer から送信されるイベントをサブスクライブします。

  • Recognizing: 中間的な認識結果を含むイベントのシグナル。
  • Recognized: 認識の試行が成功したことを示す最終的な認識結果を含むイベントのシグナル。
  • SessionStopped: 認識セッション (操作) の終了を示すイベントのシグナル。
  • Canceled: キャンセルされた認識結果を含むイベントのシグナル。 これらの結果は、直接的なキャンセル要求の結果としてキャンセルされた認識試行を示します。 または、転送またはプロトコルのエラーを示します。
speechRecognizer.Recognizing += (s, e) =>
{
    Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};

speechRecognizer.Recognized += (s, e) =>
{
    if (e.Result.Reason == ResultReason.RecognizedSpeech)
    {
        Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
    }
    else if (e.Result.Reason == ResultReason.NoMatch)
    {
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.Canceled += (s, e) =>
{
    Console.WriteLine($"CANCELED: Reason={e.Reason}");

    if (e.Reason == CancellationReason.Error)
    {
        Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
        Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
        Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
    }

    stopRecognition.TrySetResult(0);
};

speechRecognizer.SessionStopped += (s, e) =>
{
    Console.WriteLine("\n    Session stopped event.");
    stopRecognition.TrySetResult(0);
};

すべての設定が完了したら、StartContinuousRecognitionAsync を呼び出して認識を開始します。

await speechRecognizer.StartContinuousRecognitionAsync();

// Waits for completion. Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });

// Make the following call at some point to stop recognition:
// await speechRecognizer.StopContinuousRecognitionAsync();

ソース言語を変更する

音声認識の一般的なタスクは、入力 (またはソース) 言語を指定することです。 次の例では、入力言語をイタリア語に変更する方法を示しています。 コード内で、SpeechConfig インスタンスを見つけて、そのすぐ下にこの行を追加します。

speechConfig.SpeechRecognitionLanguage = "it-IT";

SpeechRecognitionLanguage プロパティには、言語ロケールの書式指定文字列が必要です。 詳細については、サポートされている音声テキスト変換ロケールの一覧を参照してください。

言語識別

オーディオ ソース内の言語を識別し、それをテキストに文字起こしする必要があるときに、音声テキスト変換認識の言語識別を使用できます。

完全なコード サンプルについては、言語識別に関するページを参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

var speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

無音の処理方法を変更する

ユーザーが通常よりも速く、または遅く話すと想定される場合、入力オーディオで話がされていない無音状態に対する既定の動作では、想定した結果が得られない可能性があります。 無音処理に関する一般的な問題には次のものがあります。

  • 複数の文を個別の結果に分割できず、多数の文が 1 つの認識結果に連結されてしまう速い話し方。
  • 1 つの文が複数の結果に分割されてしまう遅い話し方。
  • 発話が始まるのを待っているときに、あまりにも早く終了してしまう 1 つの発話の認識。

これらの問題は、SpeechRecognizer を作成するために使用される SpeechConfig インスタンスの次の 2 つの "タイムアウト プロパティ" のいずれかを設定することで対処できる可能性があります。

  • セグメント化の無音タイムアウトでは、そのフレーズが "完了" と見なされるまでに現在話されているフレーズ内で許可される無音声のオーディオの量を調整します。
    • 一般的に、値が "大きいほど" 結果が長くなり、話者のフレーズ内の一時停止がより長く許容されますが、結果が到着するまでに時間がかかります。 また、設定が大きすぎると、個別のフレーズが 1 つの結果にまとめられる可能性が高くなります。
    • 値を "小さく" すると、一般的に結果が短くなり、フレーズ間でより多くのプロンプトと頻繁な区切りが確保されますが、設定を小さくしすぎると単一のフレーズが複数の結果に分割される可能性もあります。
    • このタイムアウトは、100 から 5000 の整数値 (ミリ秒単位) に設定でき、一般的な既定値は 500 です。
  • 初期無音タイムアウトでは、認識試行が "一致なし" の結果で終了する前に、フレーズの "前に" 許容される無音声のオーディオの量を調整します。
    • 値が "大きいほど"、話者が反応して話し始めるまでの時間が長くなりますが、何も話されないときの応答性が低下する可能性もあります。
    • 値を "小さく" すると、"一致なし" の認識が迅速になって、より高速なユーザー エクスペリエンスとより制御されたオーディオ処理が行われますが、設定を小さくしすぎると発話者を待たないで打ち切ってしまう可能性があります。
    • 継続的な認識では多くの結果が生成されるため、この値によって "一致なし" となる結果が生じる頻度が決定しますが、それ以外の認識結果の内容には影響しません。
    • このタイムアウトは、負でない整数値 (ミリ秒単位) に設定するか、完全に無効にするために 0 に設定できます。 単発認識の一般的な既定値は 5000、継続的認識の一般的な既定値は 15000 です。

これらのタイムアウトを変更する際にはトレードオフがあるため、設定を変更するのは、無音処理に関連する問題が発生した場合にのみにする必要があります。 既定値はほとんどの発話音声を最適に処理します。問題が発生するのは、一般的でないシナリオでのみです。

例: "ABC-123-4567" のようなシリアル番号を話しているユーザーは、シリアル番号が複数の結果に分割されるのに十分な長さの一時停止を文字グループ間に入れることがあります。 この場合、セグメント化の無音タイムアウトを 2,000 ミリ秒のような大きい値にしてみてください。

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "2000");

例: 記録された発表者の話し方が速く、複数の連続した文が結合され、1 分あたり 1 回や 2 回の大きな認識結果のみとなることがあります。 この場合、セグメント化の無音タイムアウトを 300 ミリ秒のような小さい値に設定します。

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "300");

例: シリアル番号を見つけて読み上げるよう話者に求めるような 1 つの発話の認識が、番号を見つけている間に終わってしまう場合があります。 この場合、10,000 ミリ秒のような長い初期無音タイムアウトを設定してみてください。

speechConfig.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "10000");

リファレンス ドキュメント | パッケージ (NuGet) | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

音声構成を作成する

Speech SDK を使用して音声サービスを呼び出すには、SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーとそれに関連付けられた場所またはリージョン、エンドポイント、ホスト、認証トークンなど、サブスクリプションに関する情報が含まれています。

  1. キーとリージョンを使用して SpeechConfig インスタンスを作成します。
  2. Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");

SpeechConfig は、その他いくつかの方法で初期化できます。

  • エンドポイントを使用します。Speech Service エンドポイントを渡します。 キーまたは認証トークンは省略可能です。
  • ホストを使用します。ホスト アドレスを渡します。 キーまたは認証トークンは省略可能です。
  • リージョン/場所に関連付けられた認可トークンを使用します。

Note

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。

マイクから音声を認識する

デバイス マイクを使用して音声を認識するには、FromDefaultMicrophoneInput() メンバー関数を使用して AudioConfig インスタンスを作成します。 次に、audioConfigconfig を渡して SpeechRecognizer オブジェクトを初期化します。

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

cout << "Speak into your microphone." << std::endl;
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

"特定の" オーディオ入力デバイスを使用したい場合、AudioConfig でデバイス ID を指定する必要があります。 オーディオ入力デバイスのデバイス ID を取得する方法の詳細については、「Speech SDK を使用してオーディオ入力デバイスを選択する」を参照してください

ファイルから音声を認識する

マイクを使用するのでなくオーディオ ファイルから音声を認識する場合でも、AudioConfig インスタンスを作成する必要があります。 ただし、この場合は FromDefaultMicrophoneInput() を呼び出しません。 FromWavFileInput() を呼び出してファイル パスを渡します。

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

Recognizer クラスを使用して音声を認識する

Speech SDK for C++ 用の 認識エンジン では、音声認識に使用できるいくつかの手法が公開されています。

単発の認識

単発の認識では、1 つの発話が非同期的に認識されます。 1 つの発話の終わりは、終了時の無音状態をリッスンするか、最大 15 秒のオーディオが処理されるまで待機することによって決定されます。 RecognizeOnceAsync を介した非同期の単発認識の例を次に示します。

auto result = speechRecognizer->RecognizeOnceAsync().get();

結果を処理するコードを記述する必要があります。 このサンプルでは、result->Reason を評価します。

  • 認識結果を出力します: ResultReason::RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: ResultReason::NoMatch
  • エラーが検出された場合は、エラー メッセージを出力します: ResultReason::Canceled
switch (result->Reason)
{
    case ResultReason::RecognizedSpeech:
        cout << "We recognized: " << result->Text << std::endl;
        break;
    case ResultReason::NoMatch:
        cout << "NOMATCH: Speech could not be recognized." << std::endl;
        break;
    case ResultReason::Canceled:
        {
            auto cancellation = CancellationDetails::FromResult(result);
            cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
    
            if (cancellation->Reason == CancellationReason::Error) {
                cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
                cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
                cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
            }
        }
        break;
    default:
        break;
}

継続的認識

継続的認識は、単発の認識よりも少し複雑です。 この場合は、認識結果を取得するために、RecognizingRecognizedCanceled の各イベントをサブスクライブする必要があります。 認識を停止するには、StopContinuousRecognitionAsync を呼び出す必要があります。 オーディオ入力ファイルに対して継続的認識を実行する方法の例を次に示します。

まず、入力を定義し、SpeechRecognizer を初期化します。

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

次に、音声認識の状態を管理する変数を作成します。 認識の開始時は当然、完了していないと考えられるので、promise<void> を宣言します。

promise<void> recognitionEnd;

次に、SpeechRecognizer から送信されるイベントをサブスクライブします。

  • Recognizing: 中間的な認識結果を含むイベントのシグナル。
  • Recognized: 認識の試行が成功したことを示す最終的な認識結果を含むイベントのシグナル。
  • SessionStopped: 認識セッション (操作) の終了を示すイベントのシグナル。
  • Canceled: キャンセルされた認識結果を含むイベントのシグナル。 これらの結果は、直接的なキャンセル要求の結果としてキャンセルされた認識試行を示します。 または、転送またはプロトコルのエラーを示します。
speechRecognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
    {
        cout << "Recognizing:" << e.Result->Text << std::endl;
    });

speechRecognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
    {
        if (e.Result->Reason == ResultReason::RecognizedSpeech)
        {
            cout << "RECOGNIZED: Text=" << e.Result->Text 
                 << " (text could not be translated)" << std::endl;
        }
        else if (e.Result->Reason == ResultReason::NoMatch)
        {
            cout << "NOMATCH: Speech could not be recognized." << std::endl;
        }
    });

speechRecognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
    {
        cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
        if (e.Reason == CancellationReason::Error)
        {
            cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
                 << "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
                 << "CANCELED: Did you set the speech resource key and region values?" << std::endl;

            recognitionEnd.set_value(); // Notify to stop recognition.
        }
    });

speechRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
    {
        cout << "Session stopped.";
        recognitionEnd.set_value(); // Notify to stop recognition.
    });

すべての設定が完了したら、StopContinuousRecognitionAsync を呼び出して認識を開始します。

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer->StartContinuousRecognitionAsync().get();

// Waits for recognition end.
recognitionEnd.get_future().get();

// Stops recognition.
speechRecognizer->StopContinuousRecognitionAsync().get();

ソース言語を変更する

音声認識の一般的なタスクは、入力 (またはソース) 言語を指定することです。 次の例では、入力言語をドイツ語に変更する方法を示しています。 コード内で、SpeechConfig インスタンスを見つけて、そのすぐ下にこの行を追加します。

speechConfig->SetSpeechRecognitionLanguage("de-DE");

SetSpeechRecognitionLanguage は、引数として文字列を取るパラメーターです。 詳細については、サポートされている音声テキスト変換ロケールの一覧を参照してください。

言語識別

オーディオ ソース内の言語を識別し、それをテキストに文字起こしする必要があるときに、音声テキスト変換認識の言語識別を使用できます。

完全なコード サンプルについては、言語識別に関するページを参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

auto speechConfig = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

リファレンス ドキュメント | パッケージ (Go) | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

マイクからの音声を認識してテキストに変換する

既定のデバイスのマイクから音声認識を実行するには、以下のコード サンプルを使用します。 変数 subscriptionregion をそれぞれ音声キーと場所またはリージョンに置き換えます。 Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。 スクリプトを実行すると、既定のマイクで認識セッションが開始されてテキストが出力されます。

package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func sessionStartedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Started (ID=", event.SessionID, ")")
}

func sessionStoppedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}

func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognizing:", event.Result.Text)
}

func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognized:", event.Result.Text)
}

func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
	defer event.Close()
	fmt.Println("Received a cancellation: ", event.ErrorDetails)
	fmt.Println("Did you set the speech resource key and region values?")
}

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"

	audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(sessionStartedHandler)
	speechRecognizer.SessionStopped(sessionStoppedHandler)
	speechRecognizer.Recognizing(recognizingHandler)
	speechRecognizer.Recognized(recognizedHandler)
	speechRecognizer.Canceled(cancelledHandler)
	speechRecognizer.StartContinuousRecognitionAsync()
	defer speechRecognizer.StopContinuousRecognitionAsync()
	bufio.NewReader(os.Stdin).ReadBytes('\n')
}

次のコマンドを実行して、GitHub でホストされているコンポーネントにリンクする go.mod ファイルを作成します。

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

ここでコードをビルドして実行します。

go build
go run quickstart

詳細については、SpeechConfig クラスのリファレンス コンテンツSpeechRecognizer クラスのリファレンス コンテンツを参照してください。

オーディオ ファイルからの音声を認識してテキストに変換する

オーディオ ファイルから音声認識を実行するには、以下のサンプルを使用します。 変数 subscriptionregion をそれぞれ音声キーと場所またはリージョンに置き換えます。 Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。 加えて、変数 file.wav ファイルのパスに置き換えます。 スクリプトを実行すると、ファイルから音声が認識され、テキスト結果が出力されます。

package main

import (
	"fmt"
	"time"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"
    file := "path/to/file.wav"

	audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Started (ID=", event.SessionID, ")")
	})
	speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Stopped (ID=", event.SessionID, ")")
	})

	task := speechRecognizer.RecognizeOnceAsync()
	var outcome speech.SpeechRecognitionOutcome
	select {
	case outcome = <-task:
	case <-time.After(5 * time.Second):
		fmt.Println("Timed out")
		return
	}
	defer outcome.Close()
	if outcome.Error != nil {
		fmt.Println("Got an error: ", outcome.Error)
	}
	fmt.Println("Got a recognition!")
	fmt.Println(outcome.Result.Text)
}

次のコマンドを実行して、GitHub でホストされているコンポーネントにリンクする go.mod ファイルを作成します。

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

ここでコードをビルドして実行します。

go build
go run quickstart

詳細については、SpeechConfig クラスのリファレンス コンテンツSpeechRecognizer クラスのリファレンス コンテンツを参照してください。

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

リファレンス ドキュメント | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

音声構成を作成する

Speech SDK を使用して音声サービスを呼び出すには、SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーとそれに関連付けられた場所またはリージョン、エンドポイント、ホスト、認証トークンなど、サブスクリプションに関する情報が含まれています。

  1. キーと場所またはリージョンを使用して SpeechConfig インスタンスを作成します。
  2. Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
    }
}

SpeechConfig は、その他いくつかの方法で初期化できます。

  • エンドポイントを使用します。Speech Service エンドポイントを渡します。 キーまたは認証トークンは省略可能です。
  • ホストを使用します。ホスト アドレスを渡します。 キーまたは認証トークンは省略可能です。
  • リージョン/場所に関連付けられた認可トークンを使用します。

Note

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。

マイクから音声を認識する

デバイス マイクを使用して音声を認識するには、fromDefaultMicrophoneInput() メソッドを使用して AudioConfig インスタンスを作成します。 次に、audioConfigconfig を渡して SpeechRecognizer オブジェクトを初期化します。

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        fromMic(speechConfig);
    }

    public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        System.out.println("Speak into your microphone.");
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

"特定の" オーディオ入力デバイスを使用したい場合、AudioConfig でデバイス ID を指定する必要があります。 オーディオ入力デバイスのデバイス ID を取得する方法の詳細については、「Speech SDK を使用してオーディオ入力デバイスを選択する」を参照してください。

ファイルから音声を認識する

マイクを使用するのでなくオーディオ ファイルから音声を認識する場合でも、AudioConfig インスタンスを作成する必要があります。 ただし、この場合は FromDefaultMicrophoneInput() を呼び出しません。 fromWavFileInput() を呼び出してファイル パスを渡します。

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        fromFile(speechConfig);
    }

    public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

エラーの処理

これまでの例は、認識されたテキストを result.getText() を使用して取得するだけのものでした。 エラーやその他の応答を処理するためには、結果を処理するためのコードを記述する必要があります。 次の例では、result.getReason() を評価し、

  • 認識結果を出力します: ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: ResultReason.NoMatch
  • エラーが検出された場合は、エラー メッセージを出力します: ResultReason.Canceled
switch (result.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + result.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(result);
            System.out.println("CANCELED: Reason=" + cancellation.getReason());

            if (cancellation.getReason() == CancellationReason.Error) {
                System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                System.out.println("CANCELED: Did you set the speech resource key and region values?");
            }
        }
        break;
}

継続的認識を使用する

これまでの例では、1 つの発話を認識する単発の認識を使用してきました。 1 つの発話の終わりは、終了時の無音状態をリッスンするか、最大 15 秒のオーディオが処理されるまで待機することによって決定されます。

一方、認識を停止するタイミングを制御したい場合は、継続的認識を使用します。 この場合は、認識結果を取得するために、recognizingrecognizedcanceled の各イベントをサブスクライブする必要があります。 認識を停止するには、stopContinuousRecognitionAsync を呼び出す必要があります。 オーディオ入力ファイルに対して継続的認識を実行する方法の例を次に示します。

まず、入力を定義し、SpeechRecognizer を初期化します。

AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(config, audioConfig);

次に、音声認識の状態を管理する変数を作成します。 クラス スコープで Semaphore インスタンスを宣言します。

private static Semaphore stopTranslationWithFileSemaphore;

次に、SpeechRecognizer から送信されるイベントをサブスクライブします。

  • recognizing: 中間的な認識結果を含むイベントのシグナル。
  • recognized: 認識の試行が成功したことを示す最終的な認識結果を含むイベントのシグナル。
  • sessionStopped: 認識セッション (操作) の終了を示すイベントのシグナル。
  • canceled: キャンセルされた認識結果を含むイベントのシグナル。 これらの結果は、直接的なキャンセル要求の結果としてキャンセルされた認識試行を示します。 または、転送またはプロトコルのエラーを示します。
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);

speechRecognizer.recognizing.addEventListener((s, e) -> {
    System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});

speechRecognizer.recognized.addEventListener((s, e) -> {
    if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
        System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
    }
    else if (e.getResult().getReason() == ResultReason.NoMatch) {
        System.out.println("NOMATCH: Speech could not be recognized.");
    }
});

speechRecognizer.canceled.addEventListener((s, e) -> {
    System.out.println("CANCELED: Reason=" + e.getReason());

    if (e.getReason() == CancellationReason.Error) {
        System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
        System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
        System.out.println("CANCELED: Did you set the speech resource key and region values?");
    }

    stopTranslationWithFileSemaphore.release();
});

speechRecognizer.sessionStopped.addEventListener((s, e) -> {
    System.out.println("\n    Session stopped event.");
    stopTranslationWithFileSemaphore.release();
});

すべての設定が完了したら、startContinuousRecognitionAsync を呼び出して認識を開始します。

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer.startContinuousRecognitionAsync().get();

// Waits for completion.
stopTranslationWithFileSemaphore.acquire();

// Stops recognition.
speechRecognizer.stopContinuousRecognitionAsync().get();

ソース言語を変更する

音声認識の一般的なタスクは、入力 (またはソース) 言語を指定することです。 次の例では、入力言語をフランス語に変更する方法を示しています。 コード内で、SpeechConfig インスタンスを見つけて、そのすぐ下にこの行を追加します。

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage は、引数として文字列を取るパラメーターです。 「サポートされている音声テキスト変換ロケールのリスト」を参照してください。

言語識別

オーディオ ソース内の言語を識別し、それをテキストに文字起こしする必要があるときに、音声テキスト変換認識の言語識別を使用できます。

完全なコード サンプルについては、言語識別に関するページを参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

SpeechConfig speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

リファレンスドキュメント | パッケージ (npm) | GitHub のその他のサンプル | ライブラリのソース コード

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

音声構成を作成する

Speech SDK を使用して音声サービスを呼び出すには、SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーとそれに関連付けられた場所またはリージョン、エンドポイント、ホスト、認証トークンなど、サブスクリプションに関する情報が含まれています。

  1. キーと場所またはリージョンを使用して SpeechConfig インスタンスを作成します。
  2. Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

SpeechConfig は、その他いくつかの方法で初期化できます。

  • エンドポイントを使用します。Speech Service エンドポイントを渡します。 キーまたは認証トークンは省略可能です。
  • ホストを使用します。ホスト アドレスを渡します。 キーまたは認証トークンは省略可能です。
  • リージョン/場所に関連付けられた認可トークンを使用します。

Note

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。

マイクから音声を認識する

マイクからの音声認識は、Node.js ではサポートされていません これがサポートされているのは、ブラウザー ベースの JavaScript 環境内のみです。 詳細については、GitHub で、React のサンプルマイクからの音声変換の実装に関するページを参照してください。 React サンプルには、認証トークンの交換と管理のための設計パターンが示されています。 音声テキスト変換のための、マイクまたはファイルからのオーディオのキャプチャについても示されています。

Note

"特定の" オーディオ入力デバイスを使用したい場合、AudioConfig オブジェクトでデバイス ID を指定する必要があります。 詳細については、「Speech SDK を使用してオーディオ入力デバイスを選択する」を参照してください。

ファイルから音声を認識する

オーディオ ファイルから音声を認識するには、Buffer オブジェクトを受け取る fromWavFileInput() メソッドを使用して AudioConfig インスタンスを作成します。 次に、audioConfigspeechConfig を渡して SpeechRecognizer を初期化します。

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

function fromFile() {
    let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromFile();

インメモリ ストリームから音声を認識する

多くのユース ケースでは、音声データはたいてい Azure Blob Storage から取得されます。 または、あらかじめメモリ内に ArrayBuffer や同様の生データ構造として存在します。 コード例を次に示します。

  • createPushStream() を使用してプッシュ ストリームを作成します。
  • デモンストレーションのために、fs.createReadStream を使用して .wav ファイルを読み取ります。 既に ArrayBuffer に音声データが存在する場合は、スキップして、入力ストリームへのコンテンツの書き込みに進んでください。
  • プッシュ ストリームを使用してオーディオ構成を作成します。
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

function fromStream() {
    let pushStream = sdk.AudioInputStream.createPushStream();

    fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
        pushStream.write(arrayBuffer.slice());
    }).on('end', function() {
        pushStream.close();
    });
 
    let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromStream();

プッシュ ストリームを入力として使用する場合、音声データは、ヘッダーをスキップした生のパルス符号変調 (PCM) データであることが前提となります。 ヘッダーがスキップされなかった場合でも、一部のケースでは、API が機能します。 最良の結果を得るためには、"音声データの開始" 位置から fs が始まるよう、ヘッダーを除外して読み取るロジックを実装することを検討してください。

エラーの処理

これまでの例は、認識されたテキストを result.text プロパティから取得するだけのものでした。 エラーやその他の応答を処理するためには、結果を処理するためのコードを記述する必要があります。 以下のコードでは、result.reason プロパティを評価したうえで、次の処理を行っています。

  • 認識結果を出力します: ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: ResultReason.NoMatch
  • エラーが検出された場合は、エラー メッセージを出力します: ResultReason.Canceled
switch (result.reason) {
    case sdk.ResultReason.RecognizedSpeech:
        console.log(`RECOGNIZED: Text=${result.text}`);
        break;
    case sdk.ResultReason.NoMatch:
        console.log("NOMATCH: Speech could not be recognized.");
        break;
    case sdk.ResultReason.Canceled:
        const cancellation = sdk.CancellationDetails.fromResult(result);
        console.log(`CANCELED: Reason=${cancellation.reason}`);

        if (cancellation.reason == sdk.CancellationReason.Error) {
            console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
            console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
            console.log("CANCELED: Did you set the speech resource key and region values?");
        }
        break;
    }

継続的認識を使用する

これまでの例では、1 つの発話を認識する単発の認識を使用してきました。 1 つの発話の終わりは、終了時の無音状態をリッスンするか、最大 15 秒のオーディオが処理されるまで待機することによって決定されます。

一方、認識を停止するタイミングを制御したい場合は、継続的認識を使用できます。 この場合は、認識結果を取得するために、RecognizingRecognizedCanceled の各イベントをサブスクライブする必要があります。 認識を停止するには、stopContinuousRecognitionAsync を呼び出す必要があります。 オーディオ入力ファイルに対して継続的認識を実行する方法の例を次に示します。

まず、入力を定義し、SpeechRecognizer を初期化します。

const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

次に、SpeechRecognizer から送信されたイベントをサブスクライブします。

  • recognizing: 中間的な認識結果を含むイベントのシグナル。
  • recognized: 認識の試行が成功したことを示す最終的な認識結果を含むイベントのシグナル。
  • sessionStopped: 認識セッション (操作) の終了を示すイベントのシグナル。
  • canceled: キャンセルされた認識結果を含むイベントのシグナル。 これらの結果は、直接的なキャンセル要求の結果としてキャンセルされた認識試行を示します。 または、転送またはプロトコルのエラーを示します。
speechRecognizer.recognizing = (s, e) => {
    console.log(`RECOGNIZING: Text=${e.result.text}`);
};

speechRecognizer.recognized = (s, e) => {
    if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
        console.log(`RECOGNIZED: Text=${e.result.text}`);
    }
    else if (e.result.reason == sdk.ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);

    if (e.reason == sdk.CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you set the speech resource key and region values?");
    }

    speechRecognizer.stopContinuousRecognitionAsync();
};

speechRecognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    speechRecognizer.stopContinuousRecognitionAsync();
};

すべての設定が完了したら、startContinuousRecognitionAsync を呼び出して認識を開始します。

speechRecognizer.startContinuousRecognitionAsync();

// Make the following call at some point to stop recognition:
// speechRecognizer.stopContinuousRecognitionAsync();

ソース言語を変更する

音声認識の一般的なタスクは、入力 (またはソース) 言語を指定することです。 次の例では、入力言語をイタリア語に変更する方法を示しています。 コード内で、SpeechConfig インスタンスを見つけて、そのすぐ下にこの行を追加します。

speechConfig.speechRecognitionLanguage = "it-IT";

speechRecognitionLanguage プロパティには、言語ロケールの書式指定文字列が必要です。 詳細については、サポートされている音声テキスト変換ロケールの一覧を参照してください。

言語識別

オーディオ ソース内の言語を識別し、それをテキストに文字起こしする必要があるときに、音声テキスト変換認識の言語識別を使用できます。

完全なコード サンプルについては、言語識別に関するページを参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

var speechConfig = SpeechSDK.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

リファレンス ドキュメント | パッケージ (ダウンロード) | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

Speech SDK とサンプルをインストールする

Azure-Samples/cognitive-services-speech-sdk リポジトリには、iOS および Mac 向けに Objective-C で記述されたサンプルが含まれています。 リンクを選択して、各サンプルのインストール手順を参照してください。

詳細については、「Objective-C 向け Speech SDK リファレンス」を参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:"YourSubscriptionKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

リファレンス ドキュメント | パッケージ (ダウンロード) | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

Speech SDK とサンプルをインストールする

Azure-Samples/cognitive-services-speech-sdk リポジトリには、iOS および Mac 向けに Swift で記述されたサンプルが含まれています。 リンクを選択して、各サンプルのインストール手順を参照してください。

詳細については、「Swift 向け Speech SDK リファレンス」を参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

let speechConfig = SPXSpeechConfiguration(subscription: "YourSubscriptionKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

リファレンス ドキュメント | パッケージ (PyPi) | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

音声構成を作成する

Speech SDK を使用して音声サービスを呼び出すには、SpeechConfig インスタンスを作成する必要があります。 このクラスには、音声キーとそれに関連付けられた場所/リージョン、エンドポイント、ホスト、認証トークンなど、サブスクリプションに関する情報が含まれています。

  1. 音声キーと場所またはリージョンを使用して SpeechConfig インスタンスを作成します。
  2. Azure portal で音声リソースを作成します。 詳細については、「マルチ サービス リソースを作成する」を参照してください。
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")

SpeechConfig は、その他いくつかの方法で初期化できます。

  • エンドポイントを使用します。Speech Service エンドポイントを渡します。 音声キーまたは認証トークンは省略可能です。
  • ホストを使用します。ホスト アドレスを渡します。 音声キーまたは認証トークンは省略可能です。
  • リージョン/場所に関連付けられた認可トークンを使用します。

Note

音声認識、音声合成、翻訳、またはインテント認識のどれを実行するのかに関係なく、必ず構成を作成します。

マイクから音声を認識する

デバイスのマイクを使用して音声を認識するには、AudioConfig を渡さずに SpeechRecognizer インスタンスを作成し、speech_config を渡します。

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

    print("Speak into your microphone.")
    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_mic()

"特定の" オーディオ入力デバイスを使用したい場合、AudioConfig でデバイス ID を指定し、それを SpeechRecognizer コンストラクターの audio_config パラメーターに渡す必要があります。 オーディオ入力デバイスのデバイス ID を取得する方法の詳細については、「Speech SDK を使用してオーディオ入力デバイスを選択する」を参照してください

ファイルから音声を認識する

マイクを使用するのでなくオーディオ ファイルから音声を認識する場合、AudioConfig インスタンスを作成し、filename パラメーターを使用します。

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    audio_config = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_file()

エラーを処理する

これまでの例は、認識されたテキストを result.text プロパティから取得するだけのものでした。 エラーやその他の応答を処理するためには、結果を処理するためのコードを記述する必要があります。 以下のコードでは、result.reason プロパティを評価したうえで、次の処理を行っています。

  • 認識結果を出力します: speechsdk.ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: speechsdk.ResultReason.NoMatch
  • エラーが検出された場合は、エラー メッセージを出力します: speechsdk.ResultReason.Canceled
if result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(result.text))
elif result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(result.no_match_details))
elif result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = result.cancellation_details
    print("Speech Recognition canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        print("Error details: {}".format(cancellation_details.error_details))
        print("Did you set the speech resource key and region values?")

継続的認識を使用する

これまでの例では、1 つの発話を認識する単発の認識を使用してきました。 1 つの発話の終わりは、終了時の無音状態をリッスンするか、最大 15 秒のオーディオが処理されるまで待機することによって決定されます。

一方、認識を停止するタイミングを制御したい場合は、継続的認識を使用します。 その場合、認識結果を取得するには、EventSignal に接続する必要があります。 認識を停止するには、stop_continuous_recognition() または stop_continuous_recognition() を呼び出す必要があります。 オーディオ入力ファイルに対して継続的認識を実行する方法の例を次に示します。

まず、入力を定義し、SpeechRecognizer を初期化します。

audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

次に、音声認識の状態を管理する変数を作成します。 認識の開始時は当然、完了していないと考えられるので、この変数は False に設定します。

done = False

次に、evt が受信されたときに、継続的認識を停止するコールバックを作成します。 次の点に留意してください。

  • evt が受信されると、evt メッセージが出力されます。
  • evt が受信されたら、認識を停止するために evt が呼び出されます。
  • 認識状態が True に変更されます。
def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    nonlocal done
    done = True

以下のコード サンプルでは、SpeechRecognizer から送信されたイベントにコールバックを接続する方法を示します。 イベントは次のとおりです。

  • recognizing: 中間的な認識結果を含むイベントのシグナル。
  • recognized: 認識の試行が成功したことを示す最終的な認識結果を含むイベントのシグナル。
  • session_started: 認識セッション (操作) の開始を示すイベントのシグナル。
  • session_stopped: 認識セッション (操作) の終了を示すイベントのシグナル。
  • canceled: キャンセルされた認識結果を含むイベントのシグナル。 これらの結果は、直接的なキャンセル要求の結果としてキャンセルされた認識試行を示します。 または、転送またはプロトコルのエラーを示します。
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))

speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)

すべてが設定されると、start_continuous_recognition() を呼び出すことができます。

speech_recognizer.start_continuous_recognition()
while not done:
    time.sleep(.5)

ソース言語を変更する

音声認識の一般的なタスクは、入力 (またはソース) 言語を指定することです。 次の例では、入力言語をドイツ語に変更する方法を示しています。 コード内で、SpeechConfig インスタンスを見つけて、そのすぐ下にこの行を追加します。

speech_config.speech_recognition_language="de-DE"

speech_recognition_language は、引数として文字列を取るパラメーターです。 詳細については、サポートされている音声テキスト変換ロケールの一覧を参照してください。

言語識別

オーディオ ソース内の言語を識別し、それをテキストに文字起こしする必要があるときに、音声テキスト変換認識の言語識別を使用できます。

完全なコード サンプルについては、言語識別に関するページを参照してください。

カスタム エンドポイントを使用する

Custom Speech を使用すると、独自データのアップロード、カスタム モデルのテストとトレーニング、モデル間の精度の比較、カスタム エンドポイントへのモデルのデプロイを行うことができます。 次の例は、カスタム エンドポイントを設定する方法を示しています。

speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

Speech to text REST API リファレンス | Speech to text REST API for short audio リファレンス | GitHub のその他のサンプル

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

音声をテキストに変換する

コマンド プロンプトで、次のコマンドを実行します。 コマンドには以下の値を挿入します。

  • Speech サービス用のサブスクリプション キー。
  • Speech Service のリージョン。
  • 入力オーディオ ファイルのパス。 テキスト読み上げを使用してオーディオ ファイルを生成できます。
curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_AUDIO_FILE_PATH_HERE'

次の例のような JSON 本文を持つ応答を受け取ります。

{
    "RecognitionStatus": "Success",
    "DisplayText": "My voice is my passport, verify me.",
    "Offset": 6600000,
    "Duration": 32100000
}

詳細については、「音声テキスト変換 REST API リファレンス」を参照してください。

この攻略ガイドでは、音声を認識し、リアルタイムでテキストに文字起こしする方法について説明します。

マイクから音声を認識する

PC のマイクを接続してオンにします。 マイクを使用する可能性のある他のアプリはすべてオフにしてください。 マイクが内蔵されているコンピューターもあれば、Bluetooth デバイスの構成が必要なコンピューターもあります。

Speech CLI を実行して、マイクからの音声を認識する準備ができました。 コマンド ラインから、Speech CLI バイナリ ファイルが含まれるディレクトリに変更します。 次に、次のコマンドを実行します。

spx recognize --microphone

Note

Speech CLI の既定値は英語です。 「音声テキスト変換」表から別の言語を選択できます。 たとえば、ドイツ語の音声を認識するには、--source de-DE を追加します。

マイクに向かって話すと、自分が発した言葉がテキストに文字起こしされるのを、リアルタイムで確認できます。 Speech CLI は、無音が一定時間続いた後、または Ctrl + C キーを選択したときに停止します。

ファイルから音声を認識する

Speech CLI では、多くのファイル形式と自然言語で音声認識を行うことができます。 この例では、英語の音声が含まれる .wav ファイル (16 KHz、8 KHz、16 ビット、mono PCM) を使用できます。 または、クイック サンプルが必要な場合、whatstheweatherlike.wav ファイルをダウンロードし、それを Speech CLI バイナリ ファイルと同じディレクトリにコピーします。

次のコマンドを使用して Speech CLI を実行すると、オーディオ ファイルで検出された音声が認識されます。

spx recognize --file whatstheweatherlike.wav

Note

Speech CLI の既定値は英語です。 「音声テキスト変換」表から別の言語を選択できます。 たとえば、ドイツ語の音声を認識するには、--source de-DE を追加します。

Speech CLI により音声がテキストに文字起こしされて、画面に表示されます。

コンテナーを実行して使用する

音声コンテナーは、WebSocket ベースのクエリ エンドポイント API シリーズを提供します。これには、Speech SDK および Speech CLI を介してアクセスします。 既定では、Speech SDK と Speech CLI ではパブリック音声サービスが使用されます。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとリージョンではなく、コンテナー ホスト URL を使用します。

音声コンテナーの詳細については、「Docker で音声コンテナーをインストールして実行する」の「ホスト URL」を参照してください。

次のステップ