次の方法で共有


発音評価を使用する

この記事では、Speech SDK でユーザーの音声の発音を音声テキストに評価する方法について説明します。 発音評価では、話し言葉の精度と流暢さに関するフィードバックがスピーカーに提供されます。

注意

発音評価では、一貫性のある正確な発音評価を保証するために、標準の音声テキスト変換モデルとは異なる特定のバージョンの音声テキスト変換モデルが使用されます。

可用性と料金

発音評価の可用性の詳細については、 サポートされている言語利用可能なリージョンを参照してください。

ベースラインとして、発音評価の使用には、Standard とコミットメント レベルのどちらの価格設定でも、音声テキスト変換と同じ料金がかかります。 音声テキスト変換のコミットメント レベルを購入した場合、発音評価の支出はコミットメントを満たす方向に向けられます。 詳細については、価格に関するページをご覧ください。

ストリーミングモードと連続モード

発音評価では、中断のないストリーミング モードがサポートされています。 録音時間は Speech SDK を介して無制限にできます。 録音を停止しない限り、評価プロセスは終了しません。評価は簡単に一時停止して再開できます。

ストリーミング モードでの発音評価を独自のアプリケーションで使用する方法については、サンプル コードを参照してください。

ストリーミング モードでの発音評価を独自のアプリケーションで使用する方法については、サンプル コードを参照してください。

ストリーミング モードでの発音評価を独自のアプリケーションで使用する方法については、サンプル コードを参照してください。

独自のアプリケーションでストリーミング モードで発音評価を使用する方法については、 サンプル コードを参照するか、 Foundry Tools Toolkit で Azure Speech を試してください。

ストリーミング モードでの発音評価を独自のアプリケーションで使用する方法については、サンプル コードを参照してください。

ストリーミング モードでの発音評価を独自のアプリケーションで使用する方法については、サンプル コードを参照してください。

ストリーミング モードでの発音評価を独自のアプリケーションで使用する方法については、サンプル コードを参照してください。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。 継続的モードのサンプル実装は、 GitHub の関数 PronunciationAssessmentContinuousWithFileにあります。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。 継続的モードのサンプル実装は、 GitHub の関数 pronunciationAssessmentContinuousWithFileにあります。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。 GitHub の関数pronunciation_assessment_continuous_from_fileで継続的モードの実装例を見つけたり、Azure Speech Toolkit を試したりできます。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。 GitHub で継続的モードのサンプル実装を見つけることができます。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。 継続的モードのサンプル実装は、 GitHub の関数 pronunciationAssessFromFileにあります。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 連続モードでは、 EnableMiscue オプションはサポートされていません。 OmissionタグとInsertionタグを取得するには、認識された結果を参照テキストと比較する必要があります。 継続的モードのサンプル実装は、 GitHub の関数 continuousPronunciationAssessmentにあります。

オーディオ ファイルが 30 秒を超える場合は、処理に連続モードを使います。 Speech SDK for Go では発音評価がサポートされていないことに注意してください。 この機能を有効にするには、ソリューションに別のプログラミング言語を選択します。

構成パラメーターを設定する

注意

Speech SDK for Go では発音評価を使用できません。 このガイドでは、概念について説明します。 ソリューション向けに別のプログラミング言語を選択します。

SpeechRecognizer で、発音の向上を学習したり練習したりしている言語を指定できます。 既定のロケールは en-US です。 独自のアプリケーションで発音評価の学習言語を指定する方法を確認するには、次のサンプル コードを使用できます。

var recognizer = new SpeechRecognizer(speechConfig, "en-US", audioConfig);
auto recognizer = SpeechRecognizer::FromConfig(speechConfig, "en-US", audioConfig);
SpeechRecognizer recognizer = new SpeechRecognizer(speechConfig, "en-US", audioConfig);
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, language="en-US", audio_config=audio_config)
speechConfig.speechRecognitionLanguage = "en-US";
SPXSpeechRecognizer* recognizer = [[SPXSpeechRecognizer alloc] initWithSpeechConfiguration:speechConfig language:@"en-US" audioConfiguration:audioConfig];
let recognizer = try! SPXSpeechRecognizer(speechConfiguration: speechConfig, language: "en-US", audioConfiguration: audioConfig)

ヒント

言語に複数のロケールがある場合に設定するロケールがわからない場合は、各ロケールを個別に試してください。 たとえば、スペイン語の場合は、es-ESes-MX を試します。 シナリオについて、どのロケールでスコアがより高くなるかを判定します。

PronunciationAssessmentConfig オブジェクトを作成する必要があります。 EnableProsodyAssessmentを設定して、プロソディ評価を有効にすることができます。 詳細については、「構成のメソッド」を参照してください。

var pronunciationAssessmentConfig = new PronunciationAssessmentConfig(
    referenceText: "",
    gradingSystem: GradingSystem.HundredMark,
    granularity: Granularity.Phoneme,
    enableMiscue: false);
pronunciationAssessmentConfig.EnableProsodyAssessment();
auto pronunciationConfig = PronunciationAssessmentConfig::Create("", PronunciationAssessmentGradingSystem::HundredMark, PronunciationAssessmentGranularity::Phoneme, false);
pronunciationConfig->EnableProsodyAssessment();
PronunciationAssessmentConfig pronunciationConfig = new PronunciationAssessmentConfig("",
    PronunciationAssessmentGradingSystem.HundredMark, PronunciationAssessmentGranularity.Phoneme, false);
pronunciationConfig.enableProsodyAssessment();
pronunciation_config = speechsdk.PronunciationAssessmentConfig(
    reference_text="",
    grading_system=speechsdk.PronunciationAssessmentGradingSystem.HundredMark,
    granularity=speechsdk.PronunciationAssessmentGranularity.Phoneme,
    enable_miscue=False)
pronunciation_config.enable_prosody_assessment()
var pronunciationAssessmentConfig = new sdk.PronunciationAssessmentConfig(
    referenceText: "",
    gradingSystem: sdk.PronunciationAssessmentGradingSystem.HundredMark,
    granularity: sdk.PronunciationAssessmentGranularity.Phoneme,
    enableMiscue: false);
pronunciationAssessmentConfig.enableProsodyAssessment();
SPXPronunciationAssessmentConfiguration *pronunicationConfig =
[[SPXPronunciationAssessmentConfiguration alloc] init:@"" gradingSystem:SPXPronunciationAssessmentGradingSystem_HundredMark granularity:SPXPronunciationAssessmentGranularity_Phoneme enableMiscue:false];
[pronunicationConfig enableProsodyAssessment];
let pronAssessmentConfig = try! SPXPronunciationAssessmentConfiguration("",
    gradingSystem: .hundredMark,
    granularity: .phoneme,
    enableMiscue: false)
pronAssessmentConfig.enableProsodyAssessment()

発音評価のいくつかの主要な構成パラメーターを次の表に示します。

パラメーター 説明
ReferenceText 発音が評価されるテキスト。

ReferenceText パラメーターは省略可能です。 書き言葉学習シナリオに対してスクリプトあり評価を実行する場合は、参照テキストを設定します。 スクリプトなし評価を実行する場合は、参照テキストを設定しないでください。

スクリプトあり評価とスクリプトなし評価の価格の違いについては、「価格」のセクションを参照してください。
GradingSystem スコア調整用のポイント システム。 FivePoint では、0 ~ 5 の浮動小数点スコアが付けられます。 HundredMark では、0 ~ 100 の浮動小数点スコアが付けられます。 既定値: FivePoint
Granularity 評価粒度の最も低いレベルを決定します。 最小値以上のレベルのスコアが返されます。 指定できる値は、全文、単語、音節、音素レベルのスコアを示す Phoneme、全文と単語レベルのスコアを示す Word、全文レベルのみのスコアを示す FullText です。 指定された完全な参照テキストには、単語、文、または段落を指定できます。 これは入力参照テキストによって異なります。 既定値: Phoneme
EnableMiscue 参照テキストと比較した際に、発音の誤り計算を可能にします。 miscue の有効化は省略可能です。 この値がTrueの場合、 ErrorType結果の値は、比較に基づいてOmissionまたはInsertionに設定できます。 値は FalseTrue です。 既定値: False。 誤りの計算を有効にするには、EnableMiscueTrue に設定します。 表の上にあるコード スニペットを参照できます。
ScenarioId カスタマイズされたポイント システムの GUID。

構成方法

次の表に、PronunciationAssessmentConfig オブジェクトに設定できるオプションのメソッドの一部を示します。

注意

韻律評価は en-US ロケールでのみ利用可能です。

プロソディ評価を調べるには、SDK バージョン 1.35.0 以降にアップグレードします。

方法 説明
EnableProsodyAssessment 発音評価の韻律評価を有効にします。 この機能では、アクセント、イントネーション、話す速度、リズムなどの面が評価されます。 この機能は、音声の自然さと表現力に関する分析情報を提供します。

プロソディ評価の有効化はオプションです。 このメソッドが呼び出されると、ProsodyScore 結果の値が返されます。

発音評価の結果を取得する

スピーチが認識されたら、発音評価の結果を SDK オブジェクトまたは JSON 文字列として要求できます。

using (var speechRecognizer = new SpeechRecognizer(
    speechConfig,
    audioConfig))
{
    // (Optional) get the session ID
    speechRecognizer.SessionStarted += (s, e) => {
        Console.WriteLine($"SESSION ID: {e.SessionId}");
    };
    pronunciationAssessmentConfig.ApplyTo(speechRecognizer);
    var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();

    // The pronunciation assessment result as a Speech SDK object
    var pronunciationAssessmentResult =
        PronunciationAssessmentResult.FromResult(speechRecognitionResult);

    // The pronunciation assessment result as a JSON string
    var pronunciationAssessmentResultJson = speechRecognitionResult.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult);
}

Speech SDK for C++ を使用する場合、単語、音節、音素の結果を SDK オブジェクト経由で使用することはできません。 単語、音節、音素の結果は、JSON 文字列でのみ使用できます。

auto speechRecognizer = SpeechRecognizer::FromConfig(
    speechConfig,
    audioConfig);
// (Optional) get the session ID
speechRecognizer->SessionStarted.Connect([](const SessionEventArgs& e) {
    std::cout << "SESSION ID: " << e.SessionId << std::endl;
});
pronunciationAssessmentConfig->ApplyTo(speechRecognizer);
speechRecognitionResult = speechRecognizer->RecognizeOnceAsync().get();

// The pronunciation assessment result as a Speech SDK object
auto pronunciationAssessmentResult =
    PronunciationAssessmentResult::FromResult(speechRecognitionResult);

// The pronunciation assessment result as a JSON string
auto pronunciationAssessmentResultJson = speechRecognitionResult->Properties.GetProperty(PropertyId::SpeechServiceResponse_JsonResult);

独自のアプリケーションで発音評価の学習言語を指定する方法については、サンプル コードに関するページを参照してください。

Android アプリケーション開発の場合、Speech SDK for Java を使用し、単語、音節、音素の結果を SDK オブジェクト経由で使用できます。 結果は JSON 文字列でも使用できます。 Java ランタイム (JRE) アプリケーション開発の場合、単語、音節、音素の結果は JSON 文字列でのみ使用できます。

SpeechRecognizer speechRecognizer = new SpeechRecognizer(
    speechConfig,
    audioConfig);
// (Optional) get the session ID
speechRecognizer.sessionStarted.addEventListener((s, e) -> {
    System.out.println("SESSION ID: " + e.getSessionId());
});
pronunciationAssessmentConfig.applyTo(speechRecognizer);
Future<SpeechRecognitionResult> future = speechRecognizer.recognizeOnceAsync();
SpeechRecognitionResult speechRecognitionResult = future.get(30, TimeUnit.SECONDS);

// The pronunciation assessment result as a Speech SDK object
PronunciationAssessmentResult pronunciationAssessmentResult =
    PronunciationAssessmentResult.fromResult(speechRecognitionResult);

// The pronunciation assessment result as a JSON string
String pronunciationAssessmentResultJson = speechRecognitionResult.getProperties().getProperty(PropertyId.SpeechServiceResponse_JsonResult);

recognizer.close();
speechConfig.close();
audioConfig.close();
pronunciationAssessmentConfig.close();
speechRecognitionResult.close();
var speechRecognizer = SpeechSDK.SpeechRecognizer.FromConfig(speechConfig, audioConfig);
// (Optional) get the session ID
speechRecognizer.sessionStarted = (s, e) => {
    console.log(`SESSION ID: ${e.sessionId}`);
};
pronunciationAssessmentConfig.applyTo(speechRecognizer);

speechRecognizer.recognizeOnceAsync((speechRecognitionResult: SpeechSDK.SpeechRecognitionResult) => {
    // The pronunciation assessment result as a Speech SDK object
    var pronunciationAssessmentResult = SpeechSDK.PronunciationAssessmentResult.fromResult(speechRecognitionResult);

    // The pronunciation assessment result as a JSON string
    var pronunciationAssessmentResultJson = speechRecognitionResult.properties.getProperty(SpeechSDK.PropertyId.SpeechServiceResponse_JsonResult);
},
{});

独自のアプリケーションで発音評価の学習言語を指定する方法については、サンプル コードに関するページを参照してください。

speech_recognizer = speechsdk.SpeechRecognizer(
        speech_config=speech_config, \
        audio_config=audio_config)
# (Optional) get the session ID
speech_recognizer.session_started.connect(lambda evt: print(f"SESSION ID: {evt.session_id}"))
pronunciation_assessment_config.apply_to(speech_recognizer)
speech_recognition_result = speech_recognizer.recognize_once()
# The pronunciation assessment result as a Speech SDK object
pronunciation_assessment_result = speechsdk.PronunciationAssessmentResult(speech_recognition_result)

# The pronunciation assessment result as a JSON string
pronunciation_assessment_result_json = speech_recognition_result.properties.get(speechsdk.PropertyId.SpeechServiceResponse_JsonResult)

独自のアプリケーションで発音評価の学習言語を指定する方法については、サンプル コードに関するページを参照してください。

SPXSpeechRecognizer* speechRecognizer = \
        [[SPXSpeechRecognizer alloc] initWithSpeechConfiguration:speechConfig
                                              audioConfiguration:audioConfig];
// (Optional) get the session ID
[speechRecognizer addSessionStartedEventHandler: ^ (SPXRecognizer *sender, SPXSessionEventArgs *eventArgs) {
    NSLog(@"SESSION ID: %@", eventArgs.sessionId);
}];
[pronunciationAssessmentConfig applyToRecognizer:speechRecognizer];

SPXSpeechRecognitionResult *speechRecognitionResult = [speechRecognizer recognizeOnce];

// The pronunciation assessment result as a Speech SDK object
SPXPronunciationAssessmentResult* pronunciationAssessmentResult = [[SPXPronunciationAssessmentResult alloc] init:speechRecognitionResult];

// The pronunciation assessment result as a JSON string
NSString* pronunciationAssessmentResultJson = [speechRecognitionResult.properties getPropertyByName:SPXSpeechServiceResponseJsonResult];

独自のアプリケーションで発音評価の学習言語を指定する方法については、サンプル コードに関するページを参照してください。

let speechRecognizer = try! SPXSpeechRecognizer(speechConfiguration: speechConfig, audioConfiguration: audioConfig)
// (Optional) get the session ID
speechRecognizer.addSessionStartedEventHandler { (sender, evt) in
	print("SESSION ID: \(evt.sessionId)")
try! pronConfig.apply(to: speechRecognizer)

let speechRecognitionResult = try? speechRecognizer.recognizeOnce()

// The pronunciation assessment result as a Speech SDK object
let pronunciationAssessmentResult = SPXPronunciationAssessmentResult(speechRecognitionResult!)

// The pronunciation assessment result as a JSON string
let pronunciationAssessmentResultJson = speechRecognitionResult!.properties?.getPropertyBy(SPXPropertyId.speechServiceResponseJsonResult)

結果のパラメーター

使っている評価がスクリプトありスクリプトなしかに応じて、異なる発音評価結果が得られます。 スクリプトありの評価は、リーディング言語学習シナリオ用です。 スクリプトなしの評価は、スピーキング言語学習シナリオ用です。

注意

スクリプトあり評価とスクリプトなし評価の価格の違いについては、「価格」のセクションを参照してください。

スクリプトベース評価の結果

この表は、スクリプトあり評価、またはリーディング シナリオの主要な発音評価結果の一部を示しています。

パラメーター 説明 粒度
AccuracyScore 音声の発音精度。 精度は、音素がネイティブ スピーカーの発音とどれだけ厳密に一致しているかを示します。 音節、単語、全文の正確性スコアは、音素レベルの正確性スコアから集計され、評価の目標で調整されます。 音素レベル、
音節レベル (en-US のみ)
単語レベル、
全文レベル
FluencyScore 指定された音声の流暢性。 流暢性は、音声がネイティブ スピーカーによる単語間の間の取り方にどれだけ厳密に一致しているかを示します。 全文レベル
CompletenessScore 音声の完成度。入力参照テキストに対する発音された単語の比率によって計算されます。 全文レベル
ProsodyScore 指定された音声の韻律。 韻律は、アクセント、イントネーション、話す速度、リズムなど、指定された音声がどの程度自然であるかを示します。 全文レベル
PronScore 特定の音声の発音品質の全体的なスコア。 PronScore は、AccuracyScoreFluencyScore が使用可能な場合に、重み付けを使用して CompletenessScoreProsodyScoreProsodyScoreCompletenessScore から計算されます。 どちらかが使用できない場合、PronScore はそのスコアを考慮しません。 全文レベル
ErrorType この値は、参照テキストと比較したエラーの種類を示しています。 単語が省略される、挿入される、または区切りを伴って不適切に挿入されるかどうかのオプションがあります。 また、句読点による区切りが足りないことも示しています。 また、単語の発音が悪いか、発話が単調に上昇、下降、または平坦になっているかを示します。 指定できる値は、この単語にエラーがない場合の NoneOmissionInsertionMispronunciationUnexpectedBreakMissingBreakMonotone. です。 単語の発音の Mispronunciation が 60 未満の場合、エラーの種類は AccuracyScore です。 単語レベル

スクリプトなし評価の結果

この表は、スクリプトなし評価、またはスピーキング シナリオの主要な発音評価結果の一部を示しています。

注意

韻律評価は en-US ロケールでのみ利用可能です。 スクリプトなしの評価では、使用される音声テキスト変換 (STT) モデルは Azure STT とは異なります。 非常に正確に認識されたテキストに基づく評価が必要な場合は、最初に Azure STT を呼び出して参照テキストを取得してから、スクリプト化された評価を実行することをお勧めします。

応答パラメーター 説明 粒度
AccuracyScore 音声の発音精度。 精度は、音素がネイティブ スピーカーの発音とどれだけ厳密に一致しているかを示します。 音節、単語、全文の正確性スコアは、音素レベルの正確性スコアから集計され、評価の目標で調整されます。 音素レベル、
音節レベル (en-US のみ)
単語レベル、
全文レベル
FluencyScore 指定された音声の流暢性。 流暢性は、音声がネイティブ スピーカーによる単語間の間の取り方にどれだけ厳密に一致しているかを示します。 全文レベル
ProsodyScore 指定された音声の韻律。 韻律は、アクセント、イントネーション、話す速度、リズムなど、指定された音声がどの程度自然であるかを示します。 全文レベル
PronScore 特定の音声の発音品質の全体的なスコア。 PronScore は、AccuracyScore が使用可能な場合に、重み付けを使用して FluencyScoreProsodyScoreProsodyScore から計算されます。 ProsodyScore が使用できない場合、PronScore はそのスコアを考慮しません。 全文レベル
ErrorType 単語が不適切に発音されたり、不適切に区切りが挿入されたり、句読点による区切りが足りなかったりしています。 また、発話において、発音が単調に上昇、下降、または平坦になっているかを示します。 指定できる値は、この単語にエラーがない場合の NoneMispronunciationUnexpectedBreakMissingBreakMonotone です。 単語レベル

次の表は、韻律評価の結果について詳しく説明したものです。

フィールド 説明
ProsodyScore 発話全体の韻律スコア。
Feedback BreakIntonation など、単語レベルに関するフィードバック。
Break
ErrorTypes 区切りに関連するエラーの種類 (UnexpectedBreakMissingBreak など)。 現在のバージョンでは、区切りエラーの種類は提供されていません。 単語の前に想定外の区切りがある、または区切りが欠落しているかどうかを判定するには、フィールド UnexpectedBreak – Confidence とフィールド MissingBreak – confidence にしきい値を設定する必要があります。
UnexpectedBreak 単語の前に予期しない区切りがあることを示します。
MissingBreak 単語の前に区切りが欠落していることを示します。
Thresholds 両方の信頼度スコアの推奨しきい値は 0.75 です。 つまり、UnexpectedBreak – Confidence の値が 0.75 より大きい場合は、想定外の区切りがあるということです。 MissingBreak – confidence の値が 0.75 より大きい場合は、区切りが欠落しています。 0.75 は推奨される値ですが、お客様のシナリオに基づいてしきい値を調整することをお勧めします。 これら 2 つの区切りについて検出感度を可変にする場合は、UnexpectedBreak - Confidence フィールドと MissingBreak - Confidence フィールドに異なるしきい値を割り当てることができます。
Intonation 音声のイントネーションを示します。
ErrorTypes イントネーションに関連するエラーの種類。現在は Monotone のみをサポートしています。 Monotone フィールドに ErrorTypes が存在する場合、発話は単調であると検出されます。 Monotone は発話全体で検出されますが、タグはすべての単語に割り当てられます。 同じ発話内のすべての単語は、同じ単調検出情報を共有します。
Monotone 単調な音声を示します。
Thresholds (Monotone Confidence) フィールド Monotone - SyllablePitchDeltaConfidence は、ユーザー カスタマイズによる単調性検出用に予約されています。 提供された単調判定に不満がある場合は、これらのフィールドのしきい値を調整して、好みに応じて検出をカスタマイズします。

JSON の結果の例

次の例では、発音された単語 "hello" のスクリプトあり発音評価結果が JSON 文字列として表示されます。

  • 音素のアルファベットは IPA です。
  • 音節は、同じ単語の音素と共に返されます。
  • この OffsetDuration の値を使用して、音節を対応する音素に合わせることができます。 たとえば、2 番目の音節 loʊ の開始オフセット (11700000) は、3 番目の音素 l と合わせられます。 オフセットは、認識された音声がオーディオ ストリーム内で開始する時間を表しています。 値は 100 ナノ秒単位で測定されます。 OffsetDuration の詳細については、応答プロパティに関するページを参照してください。
  • 要求されたNBestPhonemesの数に対応する 5 つの があります。
  • Phonemes 内では、最も可能性の高い音声音素は、予想される音素 ə ではなく ɛ です。 予想された音素 ɛ は、信頼度スコアが47しか得られませんでした。 その他の可能な一致は、52、17、2 の信頼度スコアを受け取ります。
{
    "Id": "bbb42ea51bdb46d19a1d685e635fe173",
    "RecognitionStatus": 0,
    "Offset": 7500000,
    "Duration": 13800000,
    "DisplayText": "Hello.",
    "NBest": [
        {
            "Confidence": 0.975003,
            "Lexical": "hello",
            "ITN": "hello",
            "MaskedITN": "hello",
            "Display": "Hello.",
            "PronunciationAssessment": {
                "AccuracyScore": 100,
                "FluencyScore": 100,
                "CompletenessScore": 100,
                "PronScore": 100
            },
            "Words": [
                {
                    "Word": "hello",
                    "Offset": 7500000,
                    "Duration": 13800000,
                    "PronunciationAssessment": {
                        "AccuracyScore": 99.0,
                        "ErrorType": "None"
                    },
                    "Syllables": [
                        {
                            "Syllable": "hɛ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 91.0
                            },
                            "Offset": 7500000,
                            "Duration": 4100000
                        },
                        {
                            "Syllable": "loʊ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 100.0
                            },
                            "Offset": 11700000,
                            "Duration": 9600000
                        }
                    ],
                    "Phonemes": [
                        {
                            "Phoneme": "h",
                            "PronunciationAssessment": {
                                "AccuracyScore": 98.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "h",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "oʊ",
                                        "Score": 52.0
                                    },
                                    {
                                        "Phoneme": "ə",
                                        "Score": 35.0
                                    },
                                    {
                                        "Phoneme": "k",
                                        "Score": 23.0
                                    },
                                    {
                                        "Phoneme": "æ",
                                        "Score": 20.0
                                    }
                                ]
                            },
                            "Offset": 7500000,
                            "Duration": 3500000
                        },
                        {
                            "Phoneme": "ɛ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 47.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "ə",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "l",
                                        "Score": 52.0
                                    },
                                    {
                                        "Phoneme": "ɛ",
                                        "Score": 47.0
                                    },
                                    {
                                        "Phoneme": "h",
                                        "Score": 17.0
                                    },
                                    {
                                        "Phoneme": "æ",
                                        "Score": 2.0
                                    }
                                ]
                            },
                            "Offset": 11100000,
                            "Duration": 500000
                        },
                        {
                            "Phoneme": "l",
                            "PronunciationAssessment": {
                                "AccuracyScore": 100.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "l",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "oʊ",
                                        "Score": 46.0
                                    },
                                    {
                                        "Phoneme": "ə",
                                        "Score": 5.0
                                    },
                                    {
                                        "Phoneme": "ɛ",
                                        "Score": 3.0
                                    },
                                    {
                                        "Phoneme": "u",
                                        "Score": 1.0
                                    }
                                ]
                            },
                            "Offset": 11700000,
                            "Duration": 1100000
                        },
                        {
                            "Phoneme": "oʊ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 100.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "oʊ",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "d",
                                        "Score": 29.0
                                    },
                                    {
                                        "Phoneme": "t",
                                        "Score": 24.0
                                    },
                                    {
                                        "Phoneme": "n",
                                        "Score": 22.0
                                    },
                                    {
                                        "Phoneme": "l",
                                        "Score": 18.0
                                    }
                                ]
                            },
                            "Offset": 12900000,
                            "Duration": 8400000
                        }
                    ]
                }
            ]
        }
    ]
}

次の発音評価スコアを取得できます。

  • 全文
  • 単語
  • 音節グループ
  • SAPI または IPA 形式の音素

ロケールごとにサポートされている機能

次の表は、ロケールでサポートされている機能をまとめたものです。 詳細については、以降のセクションを参照してください。 サポートされている機能について、必要なロケールが次の表に表示されていない場合は、この取り込みフォームに記入してさらに支援を受けてください。

音素アルファベット IPA SAPI
音素名 en-US en-USzh-CN
音節グループ en-US en-US
音声音素 en-US en-US

音節グループ

発音評価では、音節レベルの評価結果を提供できます。 通常、単語は音素ごとではなく音節ごとで発音されます。 音節のグループ化は判別性を高め、話す際の習慣に合致しています。

発音評価では、IPA と SAPI を使用した en-US でのみ音節グループがサポートされます。

次の表は、音素の例を対応する音節と比較したものです。

サンプルの単語 音素 音節
technological teknələdʒɪkl テクノロジカル
こんにちは ハロー hɛ·loʊ
luck lʌk lʌk
光合成 フォトシンセシス foʊ·tə·sɪn·θə·sɪs

音素と共に音節レベルの結果を要求するには、粒度構成パラメーターPhoneme に設定します。

音素アルファベット形式

発音評価では、IPA を使用した en-US と、SAPI を使用した en-US および zh-CN の音素名がサポートされます。

音素名をサポートするロケールでは、音素名がスコアと共に提供されます。 音素名は、正確に、または不正確に発音された音素を識別するのに役立ちます。 他のロケールでは、音素スコアのみを取得できます。

次の表は、SAPI 音素の例を対応する IPA 音素と比較したものです。

サンプルの単語 SAPI 音素 IPA 音素
こんにちは ヘーイ ロー ヘロウ
luck ラアック l ʌ k
光合成 f ow t ax s ih n th ax s ih s f oʊ t ə s ɪ n θ ə s ɪ s

IPA 音素を要求するには、音素アルファベットを IPA に設定します。 アルファベットを指定しない場合、音素は既定で SAPI 形式になります。

pronunciationAssessmentConfig.PhonemeAlphabet = "IPA";
auto pronunciationAssessmentConfig = PronunciationAssessmentConfig::CreateFromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}");
PronunciationAssessmentConfig pronunciationAssessmentConfig = PronunciationAssessmentConfig.fromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}");
pronunciation_assessment_config = speechsdk.PronunciationAssessmentConfig(json_string="{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}")
var pronunciationAssessmentConfig = SpeechSDK.PronunciationAssessmentConfig.fromJSON("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\"}");
pronunciationAssessmentConfig.phonemeAlphabet = @"IPA";
pronunciationAssessmentConfig?.phonemeAlphabet = "IPA"

音声音素を評価する

音声音素を使用すると、音声音素が想定される音素と一致した可能性を示す信頼度スコアが得られます。

発音評価では、IPA と SAPI を使用した en-US での音声音素がサポートされます。

たとえば、Hello という単語の完全な音声を取得するには、想定される音素ごとに最初の音声音素を最も高い信頼度スコアと連結します。 次の評価結果では、hello という単語を話すと、想定される IPA 音素は h ɛ l oʊ になります。 ただし、実際の音声音素は h ə l oʊ です。 この例では、期待される音素ごとに 5 つの候補があります。 評価結果では、最も可能性の高い音声音素は、予想された音素 ə ではなく ɛ であることを示しています。 予想された音素 ɛ は、信頼度スコアが47しか得られませんでした。 その他の可能な一致は、52、17、2 の信頼度スコアを受け取ります。

{
    "Id": "bbb42ea51bdb46d19a1d685e635fe173",
    "RecognitionStatus": 0,
    "Offset": 7500000,
    "Duration": 13800000,
    "DisplayText": "Hello.",
    "NBest": [
        {
            "Confidence": 0.975003,
            "Lexical": "hello",
            "ITN": "hello",
            "MaskedITN": "hello",
            "Display": "Hello.",
            "PronunciationAssessment": {
                "AccuracyScore": 100,
                "FluencyScore": 100,
                "CompletenessScore": 100,
                "PronScore": 100
            },
            "Words": [
                {
                    "Word": "hello",
                    "Offset": 7500000,
                    "Duration": 13800000,
                    "PronunciationAssessment": {
                        "AccuracyScore": 99.0,
                        "ErrorType": "None"
                    },
                    "Syllables": [
                        {
                            "Syllable": "hɛ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 91.0
                            },
                            "Offset": 7500000,
                            "Duration": 4100000
                        },
                        {
                            "Syllable": "loʊ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 100.0
                            },
                            "Offset": 11700000,
                            "Duration": 9600000
                        }
                    ],
                    "Phonemes": [
                        {
                            "Phoneme": "h",
                            "PronunciationAssessment": {
                                "AccuracyScore": 98.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "h",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "oʊ",
                                        "Score": 52.0
                                    },
                                    {
                                        "Phoneme": "ə",
                                        "Score": 35.0
                                    },
                                    {
                                        "Phoneme": "k",
                                        "Score": 23.0
                                    },
                                    {
                                        "Phoneme": "æ",
                                        "Score": 20.0
                                    }
                                ]
                            },
                            "Offset": 7500000,
                            "Duration": 3500000
                        },
                        {
                            "Phoneme": "ɛ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 47.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "ə",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "l",
                                        "Score": 52.0
                                    },
                                    {
                                        "Phoneme": "ɛ",
                                        "Score": 47.0
                                    },
                                    {
                                        "Phoneme": "h",
                                        "Score": 17.0
                                    },
                                    {
                                        "Phoneme": "æ",
                                        "Score": 2.0
                                    }
                                ]
                            },
                            "Offset": 11100000,
                            "Duration": 500000
                        },
                        {
                            "Phoneme": "l",
                            "PronunciationAssessment": {
                                "AccuracyScore": 100.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "l",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "oʊ",
                                        "Score": 46.0
                                    },
                                    {
                                        "Phoneme": "ə",
                                        "Score": 5.0
                                    },
                                    {
                                        "Phoneme": "ɛ",
                                        "Score": 3.0
                                    },
                                    {
                                        "Phoneme": "u",
                                        "Score": 1.0
                                    }
                                ]
                            },
                            "Offset": 11700000,
                            "Duration": 1100000
                        },
                        {
                            "Phoneme": "oʊ",
                            "PronunciationAssessment": {
                                "AccuracyScore": 100.0,
                                "NBestPhonemes": [
                                    {
                                        "Phoneme": "oʊ",
                                        "Score": 100.0
                                    },
                                    {
                                        "Phoneme": "d",
                                        "Score": 29.0
                                    },
                                    {
                                        "Phoneme": "t",
                                        "Score": 24.0
                                    },
                                    {
                                        "Phoneme": "n",
                                        "Score": 22.0
                                    },
                                    {
                                        "Phoneme": "l",
                                        "Score": 18.0
                                    }
                                ]
                            },
                            "Offset": 12900000,
                            "Duration": 8400000
                        }
                    ]
                }
            ]
        }
    ]
}

信頼度スコアを取得する可能性のある音声音素の有無とその数を示すには、NBestPhonemeCount パラメーターを 5 のような整数値に設定します。

pronunciationAssessmentConfig.NBestPhonemeCount = 5;
auto pronunciationAssessmentConfig = PronunciationAssessmentConfig::CreateFromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}");
PronunciationAssessmentConfig pronunciationAssessmentConfig = PronunciationAssessmentConfig.fromJson("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}");
pronunciation_assessment_config = speechsdk.PronunciationAssessmentConfig(json_string="{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}")
var pronunciationAssessmentConfig = SpeechSDK.PronunciationAssessmentConfig.fromJSON("{\"referenceText\":\"good morning\",\"gradingSystem\":\"HundredMark\",\"granularity\":\"Phoneme\",\"phonemeAlphabet\":\"IPA\",\"nBestPhonemeCount\":5}");
pronunciationAssessmentConfig.nbestPhonemeCount = 5;
pronunciationAssessmentConfig?.nbestPhonemeCount = 5

発音スコアの計算

発音スコアは、読み取りと読み上げのシナリオに関する特定の数式に基づいて、正確性、韻律、流暢さ、完全性のスコアに重みを付けることで、計算されます。

正確性、韻律、流暢さ、完全性のスコアを低から高の順に並べ替え (各スコアが使用可能な場合)、最低スコアから最高スコアを s0 から s3 と表すと、発音スコアは次のように計算されます。

読み取りシナリオの場合:

  • 韻律スコアあり: プロンスコア = 0.4 * s0 + 0.2 * s1 + 0.2 * s2 + 0.2 * s3
  • 韻律スコアなし: PronScore = 0.6 * s0 + 0.2 * s1 + 0.2 * s2

読み上げシナリオの場合 (完全性スコアは適用されません):

  • 韻律スコアあり: PronScore = 0.6 * s0 + 0.2 * s1 + 0.2 * s2
  • 韻律スコアなし: PronScore = 0.6 * s0 + 0.4 * s1

この数式により、各スコアの重要度に基づく加重計算が提供されて、発音の包括的な評価が保証されます。

コンテンツ評価

重要

コンテンツ評価 (プレビュー) は、Speech SDK バージョン 1.46.0 以降から廃止されます。 代わりに、Microsoft Foundry Models で Azure OpenAI を使用して、このセクションの説明に従ってコンテンツ評価の結果を取得することもできます。

認識された音声によっては、ボキャブラリ、文法、トピックの関連性に関するコンテンツ評価の結果を取得することもできます。 Azure OpenAI gpt-4o などのチャット モデルを使用して、コンテンツ評価の結果を取得できます。 チャット モデルの使用の詳細については、 Azure OpenAI モデルと Azure AI モデル推論 API のチャット補完のリファレンス ドキュメントを参照してください

ユーザー メッセージとシステム メッセージは、チャット モデルのコンテキストを設定するために使用されます。 次の例では、評価するエッセイがユーザー メッセージに含まれており、システム メッセージにはエッセイを評価する方法が示されています。

{
  "messages": [
    {
      "role": "system",
      "content": "You are an English teacher and please help to grade a student's essay from vocabulary and grammar and topic relevance on how well the essay aligns with the title, and output format as: {\"vocabulary\": *.*(0-100), \"grammar\": *.*(0-100), \"topic\": *.*(0-100)}."
    },
    {
      "role": "user",
      "content": "Example1: this essay: \"sampleSentence1\" has vocabulary and grammar scores of ** and **, respectively. Example2: this essay: \"sampleSentence2\" has vocabulary and grammar scores of ** and **, respectively. Example3: this essay: \"sampleSentence3\" has vocabulary and grammar scores of ** and **, respectively. The essay for you to score is \"sendText\", and the title is \"topic\". The transcript is from speech recognition so that please first add punctuations when needed, remove duplicates and unnecessary un uh from oral speech, then find all the misuse of words and grammar errors in this essay, find advanced words and grammar usages, and finally give scores based on this information. Please only respond as this format {\"vocabulary\": *.*(0-100), \"grammar\": *.*(0-100)}, \"topic\": *.*(0-100)}. [THE TRANSCRIPT FROM SPEECH RECOGNITION IS REDACTED FOR BREVITY]"
    }
  ]
}