音声を認識する方法

Speech to text REST API reference | 短い音声用の音声からテキストへの REST API リファレンス | GitHub の追加サンプル

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

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

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

  • Speech リソースの API キー
  • 音声サービス リージョン
  • 入力オーディオ ファイルのパス
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'

次の例のような応答を受け取る必要があります。

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

詳細については、 Speech to Text REST API リファレンスを参照してください

参考文書 | パッケージ (PyPi) | GitHubでの追加サンプル

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

音声構成インスタンスを作成する

Speech SDK を使用して Speech サービスを呼び出すには、 SpeechConfig インスタンスを作成する必要があります。 このクラスには、音声キーや関連するリージョン、エンドポイント、ホスト、または承認トークンなど、Speech リソースに関する情報が含まれます。

  1. Azure ポータルで Speech 用の Foundry リソースを作成します。 Speech リソース キーとリージョンを取得します。
  2. 次のコードを使用して、 SpeechConfig インスタンスを作成します。 YourSpeechKeyYourSpeechRegionを Speech リソース キーとリージョンに置き換えます。
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")

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

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

メモ

音声認識、音声合成、翻訳、意図認識のいずれを実行する場合でも、常に構成を作成します。

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

デバイス マイクを使用して音声を認識するには、SpeechRecognizerを渡さずにAudioConfig インスタンスを作成し、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.")
    speech_recognition_result = speech_recognizer.recognize_once_async().get()
    print(speech_recognition_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)

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

from_file()

エラーの処理

前の例では、 speech_recognition_result.text プロパティから認識されたテキストのみを取得します。 エラーやその他の応答を処理するには、結果を処理するためのコードを記述する必要があります。 次のコードは speech_recognition_result.reason プロパティを評価します。

  • 認識結果を出力します: speechsdk.ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: speechsdk.ResultReason.NoMatch
  • エラーが発生した場合は、エラー メッセージ " speechsdk.ResultReason.Canceled" が出力されます。
if speech_recognition_result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(speech_recognition_result.text))
elif speech_recognition_result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(speech_recognition_result.no_match_details))
elif speech_recognition_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_recognition_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 つの発話を認識する単一ショット認識を使用しています。 発話の終了は、最後の部分で無音を確認するか、音声が最大15秒間処理されるまで待つことで決定されます。

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

まず、入力を定義し、 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を受信すると、認識を停止するために stop_continuous_recognition() が呼び出されます。
  • 認識状態が Trueに変更されます。
def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    global 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 は、引数として文字列を受け取るパラメーターです。 サポートされているロケールの一覧については、 Speech サービスの言語と音声のサポートに関するページを参照してください。

言語識別

オーディオ ソースで言語を識別し、テキストに文字起こしする必要がある場合は、音声テキスト認識で言語識別を使用できます。

完全なコード サンプルについては、「 言語の識別」を参照してください。

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

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

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

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

セマンティック セグメント化

セマンティック セグメント化は、無音ベースのセグメント化に関連する問題を軽減するために設計された音声認識セグメント化戦略です。

  • セグメント化の不足: ユーザーが一時停止せずに長時間話すと、中断せずに長いテキスト シーケンス ("テキストの壁") が表示され、読みやすさのエクスペリエンスが大幅に低下します。
  • 過剰セグメント化: ユーザーが短時間一時停止すると、無音検出メカニズムが誤ってセグメント化される可能性があります。

セマンティック セグメント化は、無音タイムアウトのみに依存するのではなく、主にセグメント化され、文末句読点 ('.' や '?' など) を検出すると最終的な結果が返されます。 これにより、より高品質で意味的に完全なセグメントのユーザー エクスペリエンスが向上し、中間結果が長くなるのを防ぐことができます。

セマンティック セグメント化を使用するには、SpeechConfigの作成に使用するSpeechRecognizer インスタンスに次のプロパティを設定する必要があります。

speech_config.set_property(speechsdk.PropertyId.Speech_SegmentationStrategy, "Semantic") 

セマンティック セグメント化の制限事項の一部を次に示します。

  • セマンティック セグメント化を使用するには、Speech SDK バージョン 1.41 以降が必要です。
  • セマンティック セグメント化は、 継続的な認識でのみ使用することを目的としています。 これには、ディクテーションやキャプションなどのシナリオが含まれます。 単一認識モードまたは対話型のシナリオでは使用しないでください。
  • セマンティック セグメント化は、すべての言語とロケールで使用できるわけではありません。
  • セマンティック セグメント化では、信頼度スコアと NBest リストはまだサポートされていません。 そのため、信頼度スコアまたは NBest リストを使用している場合は、セマンティック セグメント化はお勧めしません。

ストリーミング後の改善 (プレビュー)

ストリーム後の絞り込みでは、リアルタイム ストリーミングと並行して 2 番目の認識パスを実行することで、最終的なトランスクリプトの精度が向上します。 中間結果と部分的な結果のレイテンシーは依然として低いです。 最終的な結果のみが、より広範なオーディオ コンテキストを使用するより正確なバージョンに置き換えられます。

ストリーム後の絞り込みを有効にするには、SpeechServiceResponse_PostProcessingOption インスタンスで SpeechConfig プロパティを設定します。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

ストリーム後の絞り込みの重要な考慮事項を次に示します。

  • ストリーム後の絞り込みは、会話、会議、ディクテーションなどの長い発話に最適です。 非常に短い語句の場合、絞り込まれた結果は標準の結果と同じになる可能性があります。
  • ストリーム後の絞り込みとセマンティック セグメント化は一緒に使用できません。
  • ストリーム後絞り込みと TrueText は、同じ SpeechServiceResponse_PostProcessingOption プロパティの個別の値です。 一度に設定できる値は 1 つだけです。
  • ポストストリームの精緻化は、パブリック プレビュー中選択されたAzureリージョンでのみ使用できます。

後処理オプションの詳細については、後 処理の使用方法を参照してください。

重要

ストリーム後の絞り込みは現在パブリック プレビュー段階です。 精度の向上は、言語とロケールによって異なります。 一部のロケールでは、品質が大幅に向上しないことがあり、結果は標準認識で観察した結果と異なる場合があります。 プレビュー期間中は、モノリンガル認識のみがサポートされます。 多言語および自動言語識別は、ストリーム後の絞り込みでは使用できません。

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

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

音声構成インスタンスを作成する

Speech SDK を使用して Speech サービスを呼び出すには、 SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーや関連するリージョン、エンドポイント、ホスト、承認トークンなど、Speech リソースに関する情報が含まれます。

  1. Azure ポータルで Speech 用の Foundry リソースを作成します。 Speech リソース キーとエンドポイントを取得します。
  2. 次のコードを使用して、 SpeechConfig インスタンスを作成します。 YourSpeechKeyYourSpeechEndpointを Speech リソース キーとエンドポイントに置き換えます。
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.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
    }
}

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

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

メモ

音声認識、音声合成、翻訳、意図認識のいずれを実行する場合でも、常に構成を作成します。

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

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

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 speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromMic(speechConfig);
    }
}

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

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

マイクの代わりにオーディオ ファイルから音声を認識する場合は、 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 speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromFile(speechConfig);
    }
}

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

多くのユース ケースでは、オーディオ データがAzure Blob Storageから取得されているか、byte[] インスタンスまたは同様の生データ構造として既にメモリ内にある可能性があります。 次の例では、 PushAudioInputStream を使用して音声を認識します。これは基本的に抽象化されたメモリ ストリームです。 サンプル コードでは、次のアクションを実行します。

  • PushAudioInputStream インスタンスを受け入れるWrite()関数を使用して、byte[]に生のオーディオ データを書き込みます。
  • デモンストレーションのためにFileReaderを使用して、.wav ファイルを読み取ります。 byte[] インスタンスに既にオーディオ データがある場合は、直接スキップして入力ストリームにコンテンツを書き込むことができます。
  • 既定の形式は、16 ビット、16 kHz のモノラル パルス コード変調 (PCM) データです。 形式をカスタマイズするには、静的関数AudioStreamFormatを使用して、CreatePushStream() オブジェクトをAudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels)に渡します。
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 speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromStream(speechConfig);
    }
}

入力としてプッシュ ストリームを使用すると、オーディオ データが生の PCM であり、ヘッダーがスキップされることを前提としています。 ヘッダーがスキップされない場合でも、API は引き続き機能します。 最適な結果を得るには、byte[]からが開始されるように、ヘッダーを読み取るロジックを実装することを検討してください。

エラーの処理

前の例では、 speechRecognitionResult.Text プロパティから認識されたテキストのみを取得します。 エラーやその他の応答を処理するには、結果を処理するためのコードを記述する必要があります。 次のコードは speechRecognitionResult.Reason プロパティを評価します。

  • 認識結果を出力します: ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: ResultReason.NoMatch
  • エラーが発生した場合は、エラー メッセージ " ResultReason.Canceled" が出力されます。
switch (speechRecognitionResult.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(speechRecognitionResult);
        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 endpoint values?");
        }
        break;
}

継続的な認識を使用する

前の例では、1 つの発話を認識する単一ショット認識を使用しています。 発話の終了は、最後の部分で無音を確認するか、音声が最大15秒間処理されるまで待つことで決定されます。

一方、認識を停止するタイミングを制御する場合は、継続的な認識を使用します。 認識結果を取得するには、 RecognizingRecognized、および Canceled イベントをサブスクライブする必要があります。 認識を停止するには、 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 endpoint 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 プロパティには、言語ロケールの書式指定文字列が必要です。 サポートされているロケールの一覧については、 Speech サービスの言語と音声のサポートに関するページを参照してください。

言語識別

オーディオ ソースで言語を識別し、テキストに文字起こしする必要がある場合は、音声からテキストへの認識で言語識別を使用できます。

完全なコード サンプルについては、「 言語の識別」を参照してください。

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

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

var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

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

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

  • 文を個々の結果に分割するのではなく、多数の文を 1 つの認識結果に連結する高速音声。
  • 1 つの文の一部を複数の結果に分割するスロー音声。
  • 音声が始まるのを待っている間に、予想以上に早く終了するシングルショット認識。

これらの問題は、の作成に使用する SpeechConfig インスタンスに次の 2 つのSpeechRecognizerのいずれかを設定することで解決できます。

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

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

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

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

例: 記録された発表者の音声は、1 行に複数の文が結合され、大きな認識結果が 1 分に 1 回または 2 回しか届かないほど速い場合があります。 この場合、セグメント化の無音タイムアウトを 300 ミリ秒のような低い値に設定します。

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

例: シリアル番号の検索と読み取りを話者に求めるシングルショット認識は、番号が見つかる間に終わるのが早すぎます。 この場合は、10,000 ミリ秒のような長い初期無音タイムアウトを試してください。

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

セマンティック セグメント化

セマンティック セグメント化は、 無音ベースのセグメント化に関連する問題を軽減するために設計された音声認識セグメント化戦略です。

  • セグメント化の不足: ユーザーが一時停止せずに長時間話すと、中断せずに長いテキスト シーケンス ("テキストの壁") が表示され、読みやすさのエクスペリエンスが大幅に低下します。
  • 過剰セグメント化: ユーザーが短時間一時停止すると、無音検出メカニズムが誤ってセグメント化される可能性があります。

セマンティック セグメント化は、無音タイムアウトのみに依存するのではなく、主にセグメント化され、文末句読点 ('.' や '?' など) を検出すると最終的な結果が返されます。 これにより、より高品質で意味的に完全なセグメントのユーザー エクスペリエンスが向上し、中間結果が長くなるのを防ぐことができます。

セマンティック セグメント化を使用するには、SpeechConfigの作成に使用するSpeechRecognizer インスタンスに次のプロパティを設定する必要があります。

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

セマンティック セグメント化の制限事項の一部を次に示します。

  • セマンティック セグメント化を使用するには、Speech SDK バージョン 1.41 以降が必要です。
  • セマンティック セグメント化は、 継続的な認識でのみ使用することを目的としています。 これには、ディクテーションやキャプションなどのシナリオが含まれます。 単一認識モードまたは対話型のシナリオでは使用しないでください。
  • セマンティック セグメント化は、すべての言語とロケールで使用できるわけではありません。
  • セマンティック セグメント化では、信頼度スコアと NBest リストはまだサポートされていません。 そのため、信頼度スコアまたは NBest リストを使用している場合は、セマンティック セグメント化はお勧めしません。

ストリーミング後の改善 (プレビュー)

ストリーム後の絞り込みでは、リアルタイム ストリーミングと並行して 2 番目の認識パスを実行することで、最終的なトランスクリプトの精度が向上します。 中間結果と部分的な結果のレイテンシーは依然として低いです。 最終的な結果のみが、より広範なオーディオ コンテキストを使用するより正確なバージョンに置き換えられます。

ストリーム後の絞り込みを有効にするには、SpeechServiceResponse_PostProcessingOption インスタンスで SpeechConfig プロパティを設定します。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

ストリーム後の絞り込みの重要な考慮事項を次に示します。

  • ストリーム後の絞り込みは、会話、会議、ディクテーションなどの長い発話に最適です。 非常に短い語句の場合、絞り込まれた結果は標準の結果と同じになる可能性があります。
  • ストリーム後の絞り込みとセマンティック セグメント化は一緒に使用できません。
  • ストリーム後絞り込みと TrueText は、同じ SpeechServiceResponse_PostProcessingOption プロパティの個別の値です。 一度に設定できる値は 1 つだけです。
  • ポストストリームの精緻化は、パブリック プレビュー中選択されたAzureリージョンでのみ使用できます。

後処理オプションの詳細については、後 処理の使用方法を参照してください。

重要

ストリーム後の絞り込みは現在パブリック プレビュー段階です。 精度の向上は、言語とロケールによって異なります。 一部のロケールでは、品質が大幅に向上しないことがあり、結果は標準認識で観察した結果と異なる場合があります。 プレビュー期間中は、モノリンガル認識のみがサポートされます。 多言語および自動言語識別は、ストリーム後の絞り込みでは使用できません。

Reference documentation | Package (npm) | 追加サンプルはGitHubで | ライブラリのソースコード

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

音声構成インスタンスを作成する

Speech SDK を使用して Speech サービスを呼び出すには、 SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーや関連するリージョン、エンドポイント、ホスト、承認トークンなど、Speech リソースに関する情報が含まれます。

  1. Azure ポータルで Speech 用の Foundry リソースを作成します。 Speech リソース キーとエンドポイントを取得します。
  2. 次のコードを使用して、 SpeechConfig インスタンスを作成します。 YourSpeechEndpointYourSpeechKeyを Speech リソース エンドポイントとキーに置き換えます。
const speechConfig = sdk.SpeechConfig.fromEndpoint(new URL("YourSpeechEndpoint"), "YourSpeechKey");

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

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

メモ

音声認識、音声合成、翻訳、意図認識のいずれを実行する場合でも、常に構成を作成します。

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

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

メモ

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

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

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

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

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.fromEndpoint("YourSpeechEndpoint", "YourSpeechKey");

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 endpoint values?");
        }
        break;
    }

継続的な認識を使用する

前の例では、1 つの発話を認識する単一ショット認識を使用しています。 発話の終了は、最後の部分で無音を確認するか、音声が最大15秒間処理されるまで待つことで決定されます。

一方、認識を停止するタイミングを制御する場合は、継続的認識を使用できます。 認識結果を取得するには、 RecognizingRecognized、および Canceled イベントをサブスクライブする必要があります。 認識を停止するには、[stopContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-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 endpoint values?");
    }

    speechRecognizer.stopContinuousRecognitionAsync();
};

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

すべてが設定された状態で、[startContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-startkeywordrecognitionasync) を呼び出して認識を開始します。

speechRecognizer.startContinuousRecognitionAsync();

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

ソース言語を変更する

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

speechConfig.speechRecognitionLanguage = "it-IT";

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

言語識別

オーディオ ソースで言語を識別し、テキストに文字起こしする必要がある場合は、音声からテキストへの認識で言語識別を使用できます。

完全なコード サンプルについては、「 言語の識別」を参照してください。

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

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

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

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

参考文書 | 追加サンプルはGitHubにあります

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

音声構成インスタンスを作成する

Speech SDK を使用して Speech サービスを呼び出すには、 SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーや関連するリージョン、エンドポイント、ホスト、承認トークンなど、Speech リソースに関する情報が含まれます。

  1. Azure ポータルで Speech 用の Foundry リソースを作成します。 Speech リソース キーとリージョンを取得します。
  2. Speech キーとリージョンを使用して SpeechConfig インスタンスを作成します。
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
    }
}

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

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

メモ

音声認識、音声合成、翻訳、意図認識のいずれを実行する場合でも、常に構成を作成します。

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

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

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

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
        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 speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

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

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

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

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

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
        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 speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

エラーの処理

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

  • 認識結果を出力します: ResultReason.RecognizedSpeech
  • 認識が一致しない場合は、ユーザーに通知します: ResultReason.NoMatch
  • エラーが発生した場合は、エラー メッセージ " ResultReason.Canceled" が出力されます。
switch (speechRecognitionResult.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + speechRecognitionResult.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(speechRecognitionResult);
            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 つの発話を認識する単一ショット認識を使用しています。 発話の終了は、最後の部分で無音を確認するか、音声が最大15秒間処理されるまで待つことで決定されます。

一方、認識を停止するタイミングを制御する場合は、継続的な認識を使用します。 認識結果を取得するには、 recognizingrecognized、および canceled イベントをサブスクライブする必要があります。 認識を停止するには、 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 は、引数として文字列を受け取るパラメーターです。 サポートされている音声テキストロケールの一覧を参照してください。

言語識別

オーディオ ソースで言語を識別し、テキストに文字起こしする必要がある場合は、音声からテキストへの認識で言語識別を使用できます。

完全なコード サンプルについては、「 言語の識別」を参照してください。

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

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

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

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

セマンティック セグメント化

セマンティック セグメント化は、無音ベースのセグメント化に関連する問題を軽減するために設計された音声認識セグメント化戦略です。

  • セグメント化の不足: ユーザーが一時停止せずに長時間話すと、中断せずに長いテキスト シーケンス ("テキストの壁") が表示され、読みやすさのエクスペリエンスが大幅に低下します。
  • 過剰セグメント化: ユーザーが短時間一時停止すると、無音検出メカニズムが誤ってセグメント化される可能性があります。

セマンティック セグメント化は、無音タイムアウトのみに依存するのではなく、主にセグメント化され、文末句読点 ('.' や '?' など) を検出すると最終的な結果が返されます。 これにより、より高品質で意味的に完全なセグメントのユーザー エクスペリエンスが向上し、中間結果が長くなるのを防ぐことができます。

セマンティック セグメント化を使用するには、SpeechConfigの作成に使用するSpeechRecognizer インスタンスに次のプロパティを設定する必要があります。

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

セマンティック セグメント化の制限事項の一部を次に示します。

  • セマンティック セグメント化を使用するには、Speech SDK バージョン 1.41 以降が必要です。
  • セマンティック セグメント化は、 継続的な認識でのみ使用することを目的としています。 これには、ディクテーションやキャプションなどのシナリオが含まれます。 単一認識モードまたは対話型のシナリオでは使用しないでください。
  • セマンティック セグメント化は、すべての言語とロケールで使用できるわけではありません。
  • セマンティック セグメント化では、信頼度スコアと NBest リストはまだサポートされていません。 そのため、信頼度スコアまたは NBest リストを使用している場合は、セマンティック セグメント化はお勧めしません。

ストリーミング後の改善 (プレビュー)

ストリーム後の絞り込みでは、リアルタイム ストリーミングと並行して 2 番目の認識パスを実行することで、最終的なトランスクリプトの精度が向上します。 中間結果と部分的な結果のレイテンシーは依然として低いです。 最終的な結果のみが、より広範なオーディオ コンテキストを使用するより正確なバージョンに置き換えられます。

ストリーム後の絞り込みを有効にするには、SpeechServiceResponse_PostProcessingOption インスタンスで SpeechConfig プロパティを設定します。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

ストリーム後の絞り込みの重要な考慮事項を次に示します。

  • ストリーム後の絞り込みは、会話、会議、ディクテーションなどの長い発話に最適です。 非常に短い語句の場合、絞り込まれた結果は標準の結果と同じになる可能性があります。
  • ストリーム後の絞り込みとセマンティック セグメント化は一緒に使用できません。
  • ストリーム後絞り込みと TrueText は、同じ SpeechServiceResponse_PostProcessingOption プロパティの個別の値です。 一度に設定できる値は 1 つだけです。
  • ポストストリームの精緻化は、パブリック プレビュー中選択されたAzureリージョンでのみ使用できます。

後処理オプションの詳細については、後 処理の使用方法を参照してください。

重要

ストリーム後の絞り込みは現在パブリック プレビュー段階です。 精度の向上は、言語とロケールによって異なります。 一部のロケールでは、品質が大幅に向上しないことがあり、結果は標準認識で観察した結果と異なる場合があります。 プレビュー期間中は、モノリンガル認識のみがサポートされます。 多言語および自動言語識別は、ストリーム後の絞り込みでは使用できません。

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

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

音声構成インスタンスを作成する

Speech SDK を使用して Speech サービスを呼び出すには、 SpeechConfig インスタンスを作成する必要があります。 このクラスには、キーや関連するリージョン、エンドポイント、ホスト、承認トークンなど、Speech リソースに関する情報が含まれます。

  1. Azure ポータルで Speech 用の Foundry リソースを作成します。 Speech リソース キーとエンドポイントを取得します。
  2. 次のコードを使用して、 SpeechConfig インスタンスを作成します。 YourSpeechKeyYourSpeechEndpointを Speech リソース キーとエンドポイントに置き換えます。
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSpeechResourceKey");

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

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

メモ

音声認識、音声合成、翻訳のいずれを実行する場合でも、常に構成を作成します。

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

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

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++ の Recognizer クラス には、音声認識に使用できるいくつかのメソッドが公開されています。

シングルショット認識

シングルショット認識は、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 endpoint values?" << std::endl;
            }
        }
        break;
    default:
        break;
}

継続的認識

継続的な認識は、シングルショット認識よりも少し複雑です。 認識結果を取得するには、 RecognizingRecognized、および Canceled イベントをサブスクライブする必要があります。 認識を停止するには、 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 endpoint 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.
    });

すべてが設定された状態で、 StartContinuousRecognitionAsync を呼び出して認識を開始します。

// 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 は、引数として文字列を受け取るパラメーターです。 サポートされているロケールの一覧については、 Speech サービスの言語と音声のサポートに関するページを参照してください。

言語識別

オーディオ ソースで言語を識別し、テキストに文字起こしする必要がある場合は、音声からテキストへの認識で言語識別を使用できます。

完全なコード サンプルについては、「 言語の識別」を参照してください。

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

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

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSpeechResourceKey");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

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

Speech コンテナーは、Speech SDK と Speech CLI を介してアクセスされる Websocket ベースのクエリ エンドポイント API を提供します。 既定では、Speech SDK と Speech CLI はパブリック Speech サービスを使用します。 コンテナーを使用するには、初期化方法を変更する必要があります。 キーとエンドポイントの代わりにコンテナー ホスト URL を使用します。

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

セマンティック セグメント化

セマンティック セグメント化は、無音ベースのセグメント化に関連する問題を軽減するために設計された音声認識セグメント化戦略です。

  • セグメント化の不足: ユーザーが一時停止せずに長時間話すと、中断せずに長いテキスト シーケンス ("テキストの壁") が表示され、読みやすさのエクスペリエンスが大幅に低下します。
  • 過剰セグメント化: ユーザーが短時間一時停止すると、無音検出メカニズムが誤ってセグメント化される可能性があります。

セマンティック セグメント化は、無音タイムアウトのみに依存するのではなく、主にセグメント化され、文末句読点 ('.' や '?' など) を検出すると最終的な結果が返されます。 これにより、より高品質で意味的に完全なセグメントのユーザー エクスペリエンスが向上し、中間結果が長くなるのを防ぐことができます。

セマンティック セグメント化を使用するには、SpeechConfigの作成に使用するSpeechRecognizer インスタンスに次のプロパティを設定する必要があります。

speechConfig->SetProperty(PropertyId::Speech_SegmentationStrategy, "Semantic");

セマンティック セグメント化の制限事項の一部を次に示します。

  • セマンティック セグメント化を使用するには、Speech SDK バージョン 1.41 以降が必要です。
  • セマンティック セグメント化は、 継続的な認識でのみ使用することを目的としています。 これには、ディクテーションやキャプションなどのシナリオが含まれます。 単一認識モードまたは対話型のシナリオでは使用しないでください。
  • セマンティック セグメント化は、すべての言語とロケールで使用できるわけではありません。
  • セマンティック セグメント化では、信頼度スコアと NBest リストはまだサポートされていません。 そのため、信頼度スコアまたは NBest リストを使用している場合は、セマンティック セグメント化はお勧めしません。

ストリーム後の絞り込み (プレビュー)

ストリーム後の絞り込みでは、リアルタイム ストリーミングと並行して 2 番目の認識パスを実行することで、最終的なトランスクリプトの精度が向上します。 中間結果と部分的な結果のレイテンシーは依然として低いです。 最終的な結果のみが、より広範なオーディオ コンテキストを使用するより正確なバージョンに置き換えられます。

ストリーム後の絞り込みを有効にするには、SpeechServiceResponse_PostProcessingOption インスタンスで SpeechConfig プロパティを設定します。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

ストリーム後の絞り込みの重要な考慮事項を次に示します。

  • ストリーム後の絞り込みは、会話、会議、ディクテーションなどの長い発話に最適です。 非常に短い語句の場合、絞り込まれた結果は標準の結果と同じになる可能性があります。
  • ストリーム後の絞り込みとセマンティック セグメント化は一緒に使用できません。
  • ストリーム後絞り込みと TrueText は、同じ SpeechServiceResponse_PostProcessingOption プロパティの個別の値です。 一度に設定できる値は 1 つだけです。
  • ポストストリームの精緻化は、パブリック プレビュー中選択されたAzureリージョンでのみ使用できます。

後処理オプションの詳細については、後 処理の使用方法を参照してください。

重要

ストリーム後の絞り込みは現在パブリック プレビュー段階です。 精度の向上は、言語とロケールによって異なります。 一部のロケールでは、品質が大幅に向上しないことがあり、結果は標準認識で観察した結果と異なる場合があります。 プレビュー期間中は、モノリンガル認識のみがサポートされます。 多言語および自動言語識別は、ストリーム後の絞り込みでは使用できません。

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

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

マイクから音声テキストを認識する

  1. Azure ポータルで Speech 用の Foundry リソースを作成します。 Speech リソース キーとリージョンを取得します。
  2. 次のコード サンプルを使用して、既定のデバイス マイクから音声認識を実行します。 YourSpeechKeyYourSpeechRegionを Speech リソース キーとリージョンに置き換えます。 スクリプトを実行すると、既定のマイクと出力テキストで認識セッションが開始されます。
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 クラスのリファレンス コンテンツを参照してください。

オーディオ ファイルから音声テキストを認識する

次のサンプルを使用して、オーディオ ファイルから音声認識を実行します。 YourSpeechKeyYourSpeechRegionを Speech リソース キーとリージョンに置き換えます。 さらに、変数 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 クラスのリファレンス コンテンツを参照してください。

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

リファレンスドキュメント | パッケージ(ダウンロード) | 追加サンプルはGitHubで

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

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

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

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

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

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

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

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

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

PC マイクを接続して電源を入れます。 マイクを使用する可能性があるアプリをオフにします。 一部のコンピューターにはマイクが組み込まれているのに対し、Bluetooth デバイスの構成が必要なコンピューターもあります。

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

spx recognize --microphone

メモ

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

マイクで話すと、単語の文字起こしがテキストにリアルタイムで表示されます。 Speech CLI は、一定の無音状態の後、または Ctrl + C キーを押すと停止します。

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

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

次のコマンドを使用して Speech CLI を実行し、オーディオ ファイルで見つかった音声を認識します。

spx recognize --file whatstheweatherlike.wav

メモ

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

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

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。

リファレンスドキュメント | パッケージ(ダウンロード) | 追加サンプルはGitHubで

このハウツー ガイドでは、Foundry Tools で Azure Speech を使用して、リアルタイムの音声からテキストへの変換を行う方法について説明します。 リアルタイム音声認識は、ディクテーション、コール センターの支援、ライブ会議のキャプションなど、即時の文字起こしを必要とするアプリケーションに最適です。

サンプル アプリケーションの環境を設定する方法については、「 クイック スタート: 音声を認識してテキストに変換する」を参照してください。

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

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

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

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

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

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

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

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

コンテナーの詳細については、「Docker を使用した Speech コンテナーのインストールと実行」の「ホスト URL」を参照してください。