Upgrade to Pro — share decks privately, control downloads, hide ads and more …

米国カンファレンスで活躍したAzure AI Speech

米国カンファレンスで活躍したAzure AI Speech

Fukuoka.NET Conf 2023 での登壇資料です
https://fukuten.connpass.com/event/303390/

Yuta Matsumura

February 03, 2024
Tweet

More Decks by Yuta Matsumura

Other Decks in Technology

Transcript

  1. #fukuten 松村 優大 (MLBお兄さん) Currently working for © 2023 Yuta

    Matsumura. 株式会社オルターブース Chief Technical Architect Microsoft MVP for Developer Technologies Microsoft Top Partner Engineer Award C#, PHP, Azure, GitHub が好き #fukuten #devblogradio の中の人 @tsubakimoto_s
  2. #fukuten 翻訳アプリを探す旅が始まる 要件 • 英語を日本語に翻訳 • 音声でのリアルタイム翻訳 • 文字起こし •

    翻訳結果の保存 • 長時間の翻訳 • PC で使いたい • なるべく安く © 2023 Yuta Matsumura.
  3. #fukuten Azure AI Speech とは © 2023 Yuta Matsumura. テキスト読み上げ

    リアルタイム翻訳 話者の認識 カスタムキーワード 音声コマンド 音声テキスト変換 Azure AI 音声 | Microsoft Azure
  4. #fukuten Azure AI Speech とは © 2023 Yuta Matsumura. 音声テキスト変換

    テキスト読み上げ リアルタイム翻訳 話者の認識 カスタムキーワード 音声コマンド
  5. #fukuten 候補言語 • Azure AI Speech でオーディオから検出する言語の指定 • 最大10個の候補を指定可能 •

    “ja-JP”, “en-US” などを BCP-47 形式で指定 (言語+ロケール) • 同一言語で複数ロケールは指定不可 (例:“en-US”, “en-GB”) © 2023 Yuta Matsumura. 言語サポート - 音声サービス - Azure AI services | Microsoft Learn
  6. #fukuten 言語識別 (Language identification / LID) 開始時識別 (1回識別) オーディオの最初の数秒間で言語の識別を1回行う 継続的識別

    オーディオが再生している間は言語の識別を継続的に行う © 2023 Yuta Matsumura. 言語識別 - Speech サービス - Azure AI services | Microsoft Learn
  7. #fukuten 翻訳エンジンのイベント イベント 内容 Canceled 音声からテキスト/合成への翻訳が取り消されたことを通知します。 Recognized 最終的な認識結果が受信されたことを通知します。 Recognizing 中間認識結果が受信されたことを通知します。

    SessionStarted セッション開始イベントのイベント ハンドラーを定義します。 SessionStopped セッション停止イベントのイベント ハンドラーを定義します。 SpeechEndDetected 音声終了検出イベントのイベント ハンドラーを定義します。 SpeechStartDetected 音声開始検出イベントのイベント ハンドラーを定義します。 Synthesizing 変換合成結果が受信されたことを通知します。 © 2023 Yuta Matsumura. TranslationRecognizer クラス (Microsoft.CognitiveServices.Speech.Translation) - Azure for .NET Developers | Microsoft Learn
  8. #fukuten TranslationRecognizer.Recognized イベント TranslationRecognitionEventArgs クラス (イベント引数) Result プロパティ (TranslationRecognitionResult クラス)

    Reason プロパティ:音声認識結果 Text プロパティ:識別されたテキスト Translations プロパティ:翻訳結果 © 2023 Yuta Matsumura.
  9. #fukuten // 音声翻訳の構成 var config = SpeechTranslationConfig.FromEndpoint( endpointUrl, subscriptionKey); config.SpeechRecognitionLanguage

    = "en-US"; config.AddTargetLanguage("ja-JP"); var detectConfig = AutoDetectSourceLanguageConfig.FromLanguages( [config.SpeechRecognitionLanguage]); var stopTranslation = new TaskCompletionSource<int>(); © 2023 Yuta Matsumura.
  10. #fukuten // 既定の音声入力デバイスから識別 using (var audioInput = AudioConfig.FromDefaultMicrophoneInput()) using (var

    recognizer = new TranslationRecognizer( config, detectConfig, audioInput)) { // 識別結果受信時のイベント処理 recognizer.Recognized += (s, e) => { 次のスライド }; // 継続的識別の開始 await recognizer.StartContinuousRecognitionAsync() .ConfigureAwait(false); // 継続的識別の停止 Task.WaitAny(new[] { stopTranslation.Task }); await recognizer.StopContinuousRecognitionAsync() .ConfigureAwait(false); } © 2023 Yuta Matsumura.
  11. #fukuten // 識別結果受信時のイベント処理 recognizer.Recognized += (s, e) => { var

    result = e.Result; if (result.Reason == ResultReason.TranslatedSpeech) { using (var sw = new StreamWriter(_filePath, true, Encoding.UTF8)) { Console.WriteLine($"{result.Text}"); // 識別テキストの標準出力 sw.WriteLine($"{result.Text}"); // 識別テキストのファイル出力 foreach (var element in result.Translations) { Console.WriteLine($"{element.Value}");// 翻訳テキストの標準出力 sw.WriteLine($"{element.Value}"); // 翻訳テキストのファイル出力 } } } }; © 2023 Yuta Matsumura.