音声変換の概要

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech SDK を使用し、高品質の音声テキスト変換を実行する方法について説明します。

記事をスキップして GitHub 上のサンプルにアクセスする

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の C# クイックスタート サンプルを参照してください。

前提条件

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

Speech SDK のインストール

このパッケージ名の使用を開始する場合は、NuGet コンソールで Install-Package Microsoft.CognitiveServices.Speech を実行します。

プラットフォームごとのインストール手順については、次のリンクを参照してください。

音声構成を作成する

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。 このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。 キーとリージョンを使用して SpeechConfig を作成します。 キーとリージョンのペアを見つけるには、「キーとリージョンを見つける」ページを参照してください。

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("<paste-your-subscription-key>", "<paste-your-region>");
    }
}

SpeechConfig を初期化するには、他にも次に示すようないくつかの方法があります。

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

注意

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

マイクから認識する

デバイス マイクを使用して音声を認識するには、FromDefaultMicrophoneInput() を使用して AudioConfig を作成します。 次に、audioConfigspeechConfig を渡して 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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        await FromMic(speechConfig);
    }
}

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

ファイルから認識する

マイクではなくオーディオ ファイルから音声を認識する場合でも、AudioConfig を作成する必要があります。 ただし、FromDefaultMicrophoneInput() を呼び出さずに、AudioConfig を作成する場合は、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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        await FromFile(speechConfig);
    }
}

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

対象となる音声データが 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 audioInputStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioInputStream);
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

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

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        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 update the subscription info?");
        }
        break;
}

継続的認識

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

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

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

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

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

var stopRecognition = new TaskCompletionSource<int>();

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

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

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

recognizer.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 update the subscription info?");
    }

    stopRecognition.TrySetResult(0);
};

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

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

await recognizer.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 recognizer.StopContinuousRecognitionAsync();

ディクテーション モード

継続的認識を使用する際、対応する "ディクテーションの有効化" 関数を使用することで、ディクテーション処理を有効にすることができます。 このモードでは、音声構成インスタンスが、句読点など文構造の単語の表現を解釈します。 たとえば、"Do you live in town question mark" という発話なら、"Do you live in town?" というテキストとして解釈されます。

ディクテーション モードを有効にするには、SpeechConfig 上で EnableDictation メソッドを使用します。

speechConfig.EnableDictation();

ソース言語を変更する

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

speechConfig.SpeechRecognitionLanguage = "it-IT";

SpeechRecognitionLanguage プロパティには、言語ロケールの書式指定文字列が必要です。 サポートされている ロケールまたは言語のリストの ロケール 列に任意の値を指定できます。

認識の精度を向上させる

フレーズ リストは、音声データ内で、人物の名前や特定の場所などの既知のフレーズを識別するために使用されます。 フレーズのリストを提供することにより、音声認識の精度を向上させることができます。

例として、"Move to" という指示があり、会話で考えられる目的地として "Ward" がある場合、"Move to Ward" というエントリーを追加できます。 フレーズを追加すると、音声認識の実行時に、"Move toward" ではなく "Move to Ward" が認識される可能性が高くなります。

フレーズ リストには、単一の単語または完全なフレーズを追加できます。 認識中、フレーズのリスト内のエントリは、発話の途中にエントリが現れた場合でも単語またはフレーズの認識を強化するために使用されます。

重要

フレーズのリストの機能は、en-US、de-DE、en-AU、en-CA、en-GB、es-ES、es-MX、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR、zh-CN の言語で使用できます。

フレーズ リストを使用するには、まず PhraseListGrammar オブジェクトを作成します。次に、AddPhrase を使用して特定の単語と語句を追加します。

PhraseListGrammar への変更は、次の認識時、または Speech Service への再接続後に有効になります。

var phraseList = PhraseListGrammar.FromRecognizer(recognizer);
phraseList.AddPhrase("Supercalifragilisticexpialidocious");

ご利用の語句リストをクリアする必要がある場合は、次のようにします。

phraseList.Clear();

認識の精度を向上させるためのその他のオプション

フレーズ リストは、認識の精度を向上させるためのオプションの 1 つにすぎません。 次のこともできます。

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech SDK を使用し、高品質の音声テキスト変換を実行する方法について説明します。

記事をスキップして GitHub 上のサンプルにアクセスする

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の C++ クイックスタート サンプルを参照してください。

前提条件

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

Speech SDK のインストール

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。 ご利用のプラットフォームに応じて、次の手順を行います。

音声構成を作成する

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。 このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。 キーとリージョンを使用して SpeechConfig を作成します。 キーとリージョンのペアを見つけるには、「キーとリージョンを見つける」ページを参照してください。

using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto config = SpeechConfig::FromSubscription("<paste-your-subscription-key>", "<paste-your-region>");

SpeechConfig を初期化するには、他にも次に示すようないくつかの方法があります。

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

注意

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

マイクから認識する

デバイス マイクを使用して音声を認識するには、FromDefaultMicrophoneInput() を使用して AudioConfig を作成します。 次に、audioConfigconfig を渡して SpeechRecognizer を初期化します。

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

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

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

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

ファイルから認識する

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

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

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

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

音声を認識する

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

単発の認識

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

auto result = recognizer->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 update the subscription info?" << std::endl;
            }
        }
        break;
    default:
        break;
}

継続的認識

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

入力を定義し、SpeechRecognizer を初期化することから始めましょう。

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

次に、音声認識の状態を管理する変数を作成してみましょう。 開始するには、promise<void> を宣言します。認識の開始時に、それが間違いなく完了していないと見なすことができるからです。

promise<void> recognitionEnd;

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

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

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

recognizer->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 update the subscription info?" << std::endl;

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

recognizer->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.
recognizer->StartContinuousRecognitionAsync().get();

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

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

ディクテーション モード

継続的認識を使用する際、対応する "ディクテーションの有効化" 関数を使用することで、ディクテーション処理を有効にすることができます。 このモードでは、音声構成インスタンスが、句読点など文構造の単語の表現を解釈します。 たとえば、"Do you live in town question mark" という発話なら、"Do you live in town?" というテキストとして解釈されます。

ディクテーション モードを有効にするには、SpeechConfig 上で EnableDictation メソッドを使用します。

config->EnableDictation();

ソース言語を変更する

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

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

SetSpeechRecognitionLanguage は、引数として文字列を取るパラメーターです。 サポートされているロケールまたは言語のリストに任意の値を指定できます。

認識の精度を向上させる

フレーズ リストは、音声データ内で、人物の名前や特定の場所などの既知のフレーズを識別するために使用されます。 フレーズのリストを提供することにより、音声認識の精度を向上させることができます。

例として、"Move to" という指示があり、会話で考えられる目的地として "Ward" がある場合、"Move to Ward" というエントリーを追加できます。 フレーズを追加すると、音声認識の実行時に、"Move toward" ではなく "Move to Ward" が認識される可能性が高くなります。

フレーズ リストには、単一の単語または完全なフレーズを追加できます。 認識中、フレーズのリスト内のエントリは、発話の途中にエントリが現れた場合でも単語またはフレーズの認識を強化するために使用されます。

重要

フレーズのリストの機能は、en-US、de-DE、en-AU、en-CA、en-GB、es-ES、es-MX、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR、zh-CN の言語で使用できます。

フレーズ リストを使用するには、まず PhraseListGrammar オブジェクトを作成します。次に、AddPhrase を使用して特定の単語と語句を追加します。

PhraseListGrammar への変更は、次の認識時、または Speech Service への再接続後に有効になります。

auto phraseListGrammar = PhraseListGrammar::FromRecognizer(recognizer);
phraseListGrammar->AddPhrase("Supercalifragilisticexpialidocious");

ご利用の語句リストをクリアする必要がある場合は、次のようにします。

phraseListGrammar->Clear();

認識の精度を向上させるためのその他のオプション

フレーズ リストは、認識の精度を向上させるためのオプションの 1 つにすぎません。 次のこともできます。

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech SDK を使用し、高品質の音声テキスト変換を実行する方法について説明します。

記事をスキップして GitHub 上のサンプルにアクセスする

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の Go クイックスタート サンプルを参照してください。

前提条件

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

Speech SDK のインストール

なんらかの操作を行うには、事前に Speech SDK for Go をインストールしておく必要があります。

マイクからの音声テキスト変換

既定のデバイスのマイクから音声認識を実行するには、以下のコード サンプルを使用します。 subscription 変数と region 変数は、ご利用のサブスクリプション キーとリージョン キーに置き換えてください。 スクリプトを実行すると、既定のマイクで認識セッションが開始されてテキストが出力されます。

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

func main() {
    subscription :=  "YOUR_SUBSCRIPTION_KEY"
    region := "YOUR_SUBSCRIPTIONKEY_REGION"

    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 クラスの詳細については、リファレンス ドキュメントを参照してください。

オーディオ ファイルからの音声テキスト変換

オーディオ ファイルから音声認識を実行するには、以下のサンプルを使用します。 subscription 変数と region 変数は、ご利用のサブスクリプション キーとリージョン キーに置き換えてください。 加えて、変数 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 :=  "YOUR_SUBSCRIPTION_KEY"
    region := "YOUR_SUBSCRIPTIONKEY_REGION"
    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 Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech SDK を使用し、高品質の音声テキスト変換を実行する方法について説明します。

記事をスキップして GitHub 上のサンプルにアクセスする

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の Java クイックスタート サンプルを参照してください。

前提条件

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

Speech SDK のインストール

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。 ご利用のプラットフォームに応じて、次の手順を行います。

音声構成を作成する

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。 このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。 キーとリージョンを使用して SpeechConfig を作成します。 キーとリージョンのペアを見つけるには、「キーとリージョンを見つける」ページを参照してください。

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 エンドポイントを渡します。 キーまたは認証トークンは省略可能です。
  • ホストの場合: ホスト アドレスを渡します。 キーまたは認証トークンは省略可能です。
  • 認証トークンの場合: 認証トークンと、それに関連付けられたリージョンを渡します。

注意

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

マイクから認識する

デバイス マイクを使用して音声を認識するには、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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);

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

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

ファイルから認識する

マイクを使用するのでなくオーディオ ファイルから音声を認識する場合でも、AudioConfig を作成する必要があります。 ただし、fromDefaultMicrophoneInput() を呼び出さずに、AudioConfig を作成する場合は、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 recognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = recognizer.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 update the subscription info?");
            }
        }
        break;
}

継続的認識

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

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

入力を定義し、SpeechRecognizer を初期化することから始めましょう。

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

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

private static Semaphore stopTranslationWithFileSemaphore;

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

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

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

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

recognizer.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 update the subscription info?");
    }

    stopTranslationWithFileSemaphore.release();
});

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

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

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

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

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

ディクテーション モード

継続的認識を使用する際、対応する "ディクテーションの有効化" 関数を使用することで、ディクテーション処理を有効にすることができます。 このモードでは、音声構成インスタンスが、句読点など文構造の単語の表現を解釈します。 たとえば、"Do you live in town question mark" という発話なら、"Do you live in town?" というテキストとして解釈されます。

ディクテーション モードを有効にするには、SpeechConfig 上で enableDictation メソッドを使用します。

config.enableDictation();

ソース言語を変更する

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

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage は、引数として文字列を取るパラメーターです。 サポートされているロケールまたは言語のリストに任意の値を指定できます。

認識の精度を向上させる

フレーズ リストは、音声データ内で、人物の名前や特定の場所などの既知のフレーズを識別するために使用されます。 フレーズのリストを提供することにより、音声認識の精度を向上させることができます。

例として、"Move to" という指示があり、会話で考えられる目的地として "Ward" がある場合、"Move to Ward" というエントリーを追加できます。 フレーズを追加すると、音声認識の実行時に、"Move toward" ではなく "Move to Ward" が認識される可能性が高くなります。

フレーズ リストには、単一の単語または完全なフレーズを追加できます。 認識中、フレーズのリスト内のエントリは、発話の途中にエントリが現れた場合でも単語またはフレーズの認識を強化するために使用されます。

重要

フレーズのリストの機能は、en-US、de-DE、en-AU、en-CA、en-GB、es-ES、es-MX、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR、zh-CN の言語で使用できます。

フレーズ リストを使用するには、まず PhraseListGrammar オブジェクトを作成します。次に、AddPhrase を使用して特定の単語と語句を追加します。

PhraseListGrammar への変更は、次の認識時、または Speech Service への再接続後に有効になります。

PhraseListGrammar phraseList = PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Supercalifragilisticexpialidocious");

ご利用の語句リストをクリアする必要がある場合は、次のようにします。

phraseList.clear();

認識の精度を向上させるためのその他のオプション

フレーズ リストは、認識の精度を向上させるためのオプションの 1 つにすぎません。 次のこともできます。

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech SDK を使用し、高品質の音声テキスト変換を実行する方法について説明します。

記事をスキップして GitHub 上のサンプルにアクセスする

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の JavaScript クイックスタート サンプルを参照してください。

または、ブラウザーベースの環境で Speech SDK を使用する方法については、React サンプルを参照してください。

前提条件

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

Speech SDK のインストール

何か実行するには、事前に Node.js 用 Speech SDK をインストールしておく必要があります。 パッケージ名のインストールだけが必要な場合は、npm install microsoft-cognitiveservices-speech-sdk を実行します。 ガイド付きのインストール手順については、作業開始に関する記事を参照してください。

SDK をインポートするには、次の require ステートメントを使用します。

const sdk = require("microsoft-cognitiveservices-speech-sdk");

require の詳細については、require に関するドキュメントを参照してください。

音声構成を作成する

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。 このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。 キーとリージョンを使用して SpeechConfig を作成します。 キーとリージョンのペアを見つけるには、「キーとリージョンを見つける」ページを参照してください。

const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");

SpeechConfig を初期化するには、他にも次に示すようないくつかの方法があります。

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

注意

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

マイクから認識する (ブラウザーのみ)

マイクからの音声認識は、Node.js ではサポートされておらず、ブラウザー ベースの JavaScript 環境でのみサポートされています。 マイクからの音声変換の実装を確認するには、GitHub の React サンプルを参照してください。

注意

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

ファイルから認識する

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

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");

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

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

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

対象となる音声データが Blob Storage に格納されていたり、既存のメモリ内に ArrayBuffer や同様の生データ構造として存在していたりすることは、多くのユースケースで予想されます。 コード例を次に示します。

  • createPushStream() を使用してプッシュ ストリームを作成します。
  • デモンストレーションとして、fs.createReadStream を使用して .wav ファイルを読み取ります。ただし、ArrayBuffer 形式の音声データが既にある場合は、これをスキップして直接そのコンテンツを入力ストリームに書き込むことができます。
  • プッシュ ストリームを使用してオーディオ構成を作成します。
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");

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 recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    recognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        recognizer.close();
    });
}
fromStream();

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

エラー処理

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

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

        if (cancellation.reason == CancellationReason.Error) {
            console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
            console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
            console.log("CANCELED: Did you update the subscription info?");
        }
        break;
    }

継続的認識

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

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

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

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

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

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

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

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

    if (e.reason == CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you update the subscription info?");
    }

    recognizer.stopContinuousRecognitionAsync();
};

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

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

recognizer.startContinuousRecognitionAsync();

// make the following call at some point to stop recognition.
// recognizer.StopContinuousRecognitionAsync();

ディクテーション モード

継続的認識を使用する際、対応する "ディクテーションの有効化" 関数を使用することで、ディクテーション処理を有効にすることができます。 このモードでは、音声構成インスタンスが、句読点など文構造の単語の表現を解釈します。 たとえば、"Do you live in town question mark" という発話なら、"Do you live in town?" というテキストとして解釈されます。

ディクテーション モードを有効にするには、SpeechConfig 上で enableDictation メソッドを使用します。

speechConfig.enableDictation();

ソース言語を変更する

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

speechConfig.speechRecognitionLanguage = "it-IT";

speechRecognitionLanguage プロパティには、言語ロケールの書式指定文字列が必要です。 サポートされている ロケールまたは言語のリストの ロケール 列に任意の値を指定できます。

認識の精度を向上させる

フレーズ リストは、音声データ内で、人物の名前や特定の場所などの既知のフレーズを識別するために使用されます。 フレーズのリストを提供することにより、音声認識の精度を向上させることができます。

例として、"Move to" という指示があり、会話で考えられる目的地として "Ward" がある場合、"Move to Ward" というエントリーを追加できます。 フレーズを追加すると、音声認識の実行時に、"Move toward" ではなく "Move to Ward" が認識される可能性が高くなります。

フレーズ リストには、単一の単語または完全なフレーズを追加できます。 認識中、フレーズのリスト内のエントリは、発話の途中にエントリが現れた場合でも単語またはフレーズの認識を強化するために使用されます。

重要

フレーズのリストの機能は、en-US、de-DE、en-AU、en-CA、en-GB、es-ES、es-MX、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR、zh-CN の言語で使用できます。

フレーズ リストを使用するには、まず PhraseListGrammar オブジェクトを作成します。次に、addPhrase を使用して特定の単語と語句を追加します。

PhraseListGrammar への変更は、次の認識時、または Speech Service への再接続後に有効になります。

const phraseList = sdk.PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Supercalifragilisticexpialidocious");

ご利用の語句リストをクリアする必要がある場合は、次のようにします。

phraseList.clear();

認識の精度を向上させるためのその他のオプション

フレーズ リストは、認識の精度を向上させるためのオプションの 1 つにすぎません。 次のこともできます。

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このサンプルでは、アプリや製品で Speech SDK を使用して、高品質の音声テキスト変換を実行する方法について説明します。

GitHub の React サンプル

ブラウザー ベースの JavaScript 環境で Speech SDK を使用する方法については、GitHub の React サンプルにアクセスしてください。 このサンプルでは、認証トークンの交換と管理を行うための設計パターンの例と、音声変換のためにマイクまたはファイルからオーディオをキャプチャする方法を紹介しています。

また、Node.js クイックスタートで使用されている設計パターンは、ブラウザー環境でも使用できます。

Swift および Objective-C 用の Speech SDK を使用して、音声からテキストへの文字起こしができます。

前提条件

以下のサンプルは、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

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

Cognitive Services Speech SDK には、iOS と Mac 向けに Objective-C と Swift で作成されたサンプルが含まれています。 リンクをクリックして、各サンプルのインストール手順をご覧ください。

オンラインの「Objective-C 向け Speech SDK リファレンス」もご覧いただけます。

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech SDK を使用し、高品質の音声テキスト変換を実行する方法について説明します。

記事をスキップして GitHub 上のサンプルにアクセスする

この記事をスキップしてサンプル コードをご覧になりたい方は、GitHub 上の Python クイックスタート サンプルを参照してください。

前提条件

この記事では、以下のことを前提としています。

Speech SDK をインストールしてインポートする

何らかの操作を行うには、事前に Speech SDK をインストールしておく必要があります。

pip install azure-cognitiveservices-speech

macOS を使用していて、インストールの問題が発生した場合は、まず次のコマンドを実行することが必要な場合があります。

python3 -m pip install --upgrade pip

Speech SDK がインストールされたら、それを Python プロジェクトにインポートします。

import azure.cognitiveservices.speech as speechsdk

音声構成を作成する

Speech SDK を使用して Speech Service を呼び出すには、SpeechConfig を作成する必要があります。 このクラスには、キー、関連付けられたリージョン、エンドポイント、ホスト、または認証トークンなど、ご利用のサブスクリプションに関する情報が含まれています。 キーとリージョンを使用して SpeechConfig を作成します。 キーとリージョンのペアを見つけるには、「キーとリージョンを見つける」ページを参照してください。

speech_config = speechsdk.SpeechConfig(subscription="<paste-your-subscription-key>", region="<paste-your-region>")

SpeechConfig を初期化するには、他にも次に示すようないくつかの方法があります。

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

注意

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

マイクから認識する

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

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="<paste-your-subscription-key>", region="<paste-your-region>")
    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 を取得する方法をご覧ください。

ファイルから認識する

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

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="<paste-your-subscription-key>", region="<paste-your-region>")
    audio_input = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_input)
    
    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))

継続的認識

これまでの例では、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 が受信されたら、認識を停止するために stop_continuous_recognition() が呼び出されます。
  • 認識状態が 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)

ディクテーション モード

継続的認識を使用する際、対応する "ディクテーションの有効化" 関数を使用することで、ディクテーション処理を有効にすることができます。 このモードでは、音声構成インスタンスが、句読点など文構造の単語の表現を解釈します。 たとえば、"Do you live in town question mark" という発話なら、"Do you live in town?" というテキストとして解釈されます。

ディクテーション モードを有効にするには、SpeechConfig 上で enable_dictation() メソッドを使用します。

SpeechConfig.enable_dictation()

ソース言語を変更する

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

speech_config.speech_recognition_language="de-DE"

speech_recognition_language は、引数として文字列を取るパラメーターです。 サポートされているロケールまたは言語のリストに任意の値を指定できます。

認識の精度を向上させる

フレーズ リストは、音声データ内で、人物の名前や特定の場所などの既知のフレーズを識別するために使用されます。 フレーズのリストを提供することにより、音声認識の精度を向上させることができます。

例として、"Move to" という指示があり、会話で考えられる目的地として "Ward" がある場合、"Move to Ward" というエントリーを追加できます。 フレーズを追加すると、音声認識の実行時に、"Move toward" ではなく "Move to Ward" が認識される可能性が高くなります。

フレーズ リストには、単一の単語または完全なフレーズを追加できます。 認識中、フレーズのリスト内のエントリは、発話の途中にエントリが現れた場合でも単語またはフレーズの認識を強化するために使用されます。

重要

フレーズのリストの機能は、en-US、de-DE、en-AU、en-CA、en-GB、es-ES、es-MX、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR、zh-CN の言語で使用できます。

フレーズ リストを使用するには、まず PhraseListGrammar オブジェクトを作成します。次に、addPhrase を使用して特定の単語と語句を追加します。

PhraseListGrammar への変更は、次の認識時、または Speech Service への再接続後に有効になります。

phrase_list_grammar = speechsdk.PhraseListGrammar.from_recognizer(reco)
phrase_list_grammar.addPhrase("Supercalifragilisticexpialidocious")

ご利用の語句リストをクリアする必要がある場合は、次のようにします。

phrase_list_grammar.clear()

認識の精度を向上させるためのその他のオプション

フレーズ リストは、認識の精度を向上させるためのオプションの 1 つにすぎません。 次のこともできます。

このクイックスタートでは、Speech Service と cURL を使用して音声をテキストに変換する方法について学習します。

音声テキスト変換の概念の概要については、概要に関する記事を参照してください。

前提条件

この記事は、Azure アカウントと Speech Service サブスクリプションをお持ちであることを前提としています。 アカウントとサブスクリプションをお持ちでない場合は、Speech Service を無料でお試しください

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

コマンド プロンプトで、次のコマンドを実行します。 次の値をコマンドに挿入する必要があります。

  • 音声サービスのサブスクリプション キー。
  • 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'

次のような応答を受け取ります。

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

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

Speech Service の中核となる機能の 1 つは、人間の音声を認識して文字起こしをする機能です (多くの場合、音声テキスト変換と呼ばれます)。 このクイックスタートでは、アプリや製品で Speech CLI を使用して、高品質の音声テキスト変換を実行する方法について説明します。

ダウンロードしてインストールする

Windows に Speech CLI をインストールするには、次の手順に従います。

  1. Windows では、お使いのプラットフォームに対応した Microsoft Visual Studio 2019 の Visual C++ 再頒布可能パッケージが必要です。 これを初めてインストールする場合、再起動が必要になる場合があります。

  2. .NET Core 3.1 SDK をインストールします。

  3. 次のコマンドを入力して、NuGet を使用して Speech CLI をインストールします。

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    

spx」と入力して、Speech CLI のヘルプを表示します。

注意

NuGet を使用せずに、Speech CLI for Windows を ZIP ファイルとしてダウンロードして展開することもできます。

フォントの制限事項

Windows の Speech CLI では、ローカル コンピューター上のコマンド プロンプトで使用できるフォントのみを表示できます。 Windows ターミナルでは、Speech CLI によって対話的に生成されるすべてのフォントがサポートされます。

ファイルに出力すると、メモ帳などのテキスト エディターや、Microsoft Edge などの Web ブラウザーでも、すべてのフォントを表示できます。

サブスクリプション構成の作成

Speech CLI の使用を開始するには、Speech サブスクリプション キーとリージョン識別子を入力する必要があります。 「Speech Service を無料で試す」の手順に従って、これらの資格情報を取得します。 サブスクリプション キーとリージョン識別子 (たとえば、 eastuswestus) を入手したら、次のコマンドを実行します。

spx config @key --set SUBSCRIPTION-KEY
spx config @region --set REGION

これで、今後の SPX 要求のためのサブスクリプション認証が格納されるようになりました。 これらの格納されている値のいずれかを削除する必要がある場合は、spx config @region --clear または spx config @key --clear を実行します。

マイクからの音声テキスト変換

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 ビット、mono PCM) を使用できます。 または、クイック サンプルが必要な場合、whatstheweatherlike.wav ファイルをダウンロードし、それを Speech CLI バイナリ ファイルと同じディレクトリにコピーします。

これで Speech CLI を実行する準備ができました。次のコマンドを実行すると、音声ファイルで検出された音声が認識されます。

spx recognize --file whatstheweatherlike.wav

注意

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

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

次のステップ