😽

Azure AI Speechで音声発話を評価する

に公開

英語の発音を評価するとかそういうやつをAzure AI SpeechのSpeech to Textで実現するみたいなのを調べたのでメモ的に残しておきます。

音声評価系のAPIは色々ありそうですが、今回Azure AI Speechを使った理由は、特に無くアカウントが既にあり調べやすかっただけです。

実装としては、わりとドキュメントそのまま。

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/how-to-pronunciation-assessment?pivots=programming-language-javascript

準備

Azureアカウントを用意して認証情報を払い出す

実装

今回はWebAudioのマイクから録音してwavに変換し、wavバイナリを渡して結果を取得する方法を取りました。

WebAudioのマイクから録音してwavに変換する等は割愛(調べれば出てきますがこのあたりを参考にしました)

AzureAI

認証

sdk.SpeechConfig.fromSubscriptionでspeechConfigを生成しSpeechRecognizerに渡すだけ

const speechConfig = sdk.SpeechConfig.fromSubscription(
  API_KEY, 
  REGION
);

https://learn.microsoft.com/ja-jp/javascript/api/microsoft-cognitiveservices-speech-sdk/speechconfig?view=azure-node-latest#microsoft-cognitiveservices-speech-sdk-speechconfig-fromsubscription

基本的な音声認識

先程のspeechConfigでspeechRecognizerを生成し、アップロードされたファイルを渡してリクエスト

const language = req.body.language || 'ja-JP';
speechConfig.speechRecognitionLanguage = language;

const audioConfig = sdk.AudioConfig.fromWavFileInput(req.file.buffer);
const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

const result = await new Promise((resolve, reject) => {
  speechRecognizer.recognizeOnceAsync(
    result => {
      speechRecognizer.close();
      resolve(result);
    },
    error => {
      speechRecognizer.close();
      reject(error);
    }
  );
});

https://learn.microsoft.com/ja-jp/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer?view=azure-node-latest

発音評価

上記の基本形にPronunciationAssessmentConfigを追加

// 発音評価の設定
const pronunciationAssessmentConfig = new sdk.PronunciationAssessmentConfig(
  referenceText,
  sdk.PronunciationAssessmentGradingSystem.HundredMark,
  sdk.PronunciationAssessmentGranularity.Phoneme,
  false
);
pronunciationAssessmentConfig.enableProsodyAssessment = true;

const audioConfig = sdk.AudioConfig.fromWavFileInput(req.file.buffer);
const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
pronunciationAssessmentConfig.applyTo(speechRecognizer);

//以降は同じ

https://learn.microsoft.com/ja-jp/javascript/api/microsoft-cognitiveservices-speech-sdk/pronunciationassessmentconfig?view=azure-node-latest

レスポンスの処理

下記で取得

const pronunciationResult = sdk.PronunciationAssessmentResult.fromResult(result);

とりあえず検証なのでLLMに投げ込んだら適当にパースして結果を分析してくれる。
精度みたいな部分の検証は不十分だが、自分が発音した内容に関してはそれっぽい結果は得られた。

※実運用を考えるなら、分割するか不要なものを削るなり文字数のかさまないフォーマットにするなりした方が良い。

その他のAPI

Azure AI Speech以外

Elsa
https://api-external-doc.elsanow.co/

SpeechAce
https://api-docs.speechace.com/

SpeechSuper
https://docs.speechsuper.com/#/

Language Confidence
https://docs.languageconfidence.ai/docs/guides/speech-assessment-api/overview

株式会社ソニックムーブ

Discussion