>100 Views
June 05, 25
スライド概要
機械学習・音声認識・プログラミングに関する書籍を執筆しています。
イラストで学ぶ音声認識 改訂第2版 12. 音声対話システム 12.1 モジュール型音声対話システム 12.2 リアルタイム型音声対話システム 12.3 双方向型音声対話システム 音声認識 VAD 明日の京都の天気 ユーザ 一日中晴れて よい天気でしょう 音声合成 function calling / MCP LLM 画面表示 1
12.1 モジュール型音声対話システム
従来の音声対話システム
音声入出力に対して発話理解・対話管理・応答生成モジュールを直列に結合
それぞれが独立に,小規模なデータで学習していたので性能が低かった
明日の京都の天気
音声認識
{
"task": "weather",
"date" : "2025-2-1",
"location" : "京都"
発話理解
}
対話管理
ユーザ
アプリ
ケーション
{
"weather": "晴れ"
音声合成
応答生成
晴です
}
2
12.1 モジュール型音声対話システム 大規模言語モデルを用いた音声対話システム 言語を処理する部分をまとめて大規模言語モデル(LLM)で実現 VAD(音声区間検出)の高度化やLLMとバックエンドの連携が容易になった ことで,より自然で柔軟な対話が可能になった 音声認識 VAD 明日の京都の天気 ユーザ 一日中晴れて よい天気でしょう 音声合成 function calling / MCP LLM 画面表示 3
12.1 モジュール型音声対話システム 音声対話システムの分類 タスク指向対話システム レストラン予約や交通案内など,特定のタスクを遂行することを目的と した対話システム ロールプレイング対話システム 特定の役割を持つキャラクターと対話するシステム 雑談対話システム 特定の目的を持たず,日常的な会話を行うシステム いずれのタイプのシステムも,LLM のプロンプトや外部リソースとの接続方 法を工夫することで実現可能 4
12.1 モジュール型音声対話システム タスク指向対話システム 対話フローを定義し,LLMに指示することで安定したタスク進行が可能 例:レストラン予約システムの対話フロー flowchart TD start([start]) --> ask_date ask_date --> ask_number_of_person ask_number_of_person --> ask_cuisine[和食,洋食] ask_cuisine --> confirmation{confirm} confirmation --> |yes| thank([thank]) confirmation --> |no| modify modify --> confirmation 5
12.1 モジュール型音声対話システム タスク指向対話システムのためのプロンプトの例 以下の指示に従い,対話フローに応じて [タスクの特定] の対話システムを演じてください. ## 指示 * ひとつのシステムからの質問の後,ユーザの入力を待って,次の質問に移ってください * 確認が終了したら,[想定する出力] を JSON で出力してください * [例外事項への対処法の指示] ## 対話フロー [mermaidで記述] 6
12.1 モジュール型音声対話システム ロールプレイング対話システム ユーザとシステムが特定の役割を演じて対話を行うシステム 主として対話による問題解決を行うための練習として,コールセンターのオ ペレータの訓練や一般の教育目的で用いられる 7
12.1 モジュール型音声対話システム ロールプレイング対話システムのプロンプトの構造 ロールプレイの指示 キャラクタの設定 対話場面の設定 ・ロールプレイ対話であることを明確に ・システムの役割 ・ユーザの役割 ・タスク システムが演じるキャラクタ ・年齢、性別、性格など ・発話の口調や長さなど ・(必要に応じて)過去の経験 ・対話の場所、時刻など ・背景情報 USER : ユーザの開始発話 ASSISTANT : 8
12.1 モジュール型音声対話システム 雑談対話システム 特定の目的を持たず,日常的な会話を行うシステム LLM を用いることによって,システムはかなり広範囲な話題に対応できるよ うになった 過去の対話履歴を保存・活用することが重要 LangChain や LangGraph などのフレームワークで「メモリ」機能が実 装可能 9
12.1 モジュール型音声対話システム 雑談対話システムのためのメモリ機能 対話履歴を単純に追加 プロンプト に追加 LLM ユーザ 対話履歴を要約 過去の対話履歴から 関係する部分を検索 して抽出 10
12.1 モジュール型音声対話システム
音声入力のコーディング (HTML内部でJavaScriptを使う例)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
</head>
<body>
<h2>SpeechRecognition APIのデモ</h2>
<button type="button" class="start">音声認識開始</butto
<div class="output"></div>
<script>
音声認識を利用
const recognition = new webkitSpeechRecognition();
recognition.lang = "ja";
日本語を指定
recognition.continuous = true;
recognition.onresult = ({ results }) => {
認識終了時の
const output = document.querySelector(".output");
処理
output.textContent = results[0][0].transcript;
};
「音声認識開始」
ボタンが押された
時の処理
const startButton = document.querySelector(".start"
startButton.addEventListener("click", () => {
recognition.start();
});
</script>
</body>
</html>
11
12.1 モジュール型音声対話システム 音声入力のコーディング (Python のライブラリを使う例) import speech_recognition as sr r = sr.Recognizer() with sr.Microphone(sample_rate=16000) as source: print("なにか話してください") audio = r.listen(source) print("音声を取得しました") try: print(f"認識結果 {r.recognize_openai(audio)}") except sr.RequestError as e: print(f"失敗!{e}") 12
12.1 モジュール型音声対話システム
音声出力のコーディング (HTML内部でJavaScriptを使う例)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>Web Speech API TTSのデモ</h1>
<textarea id="text" rows="4" cols="50"
placeholder="ここにテキストを入力してください"></textarea><b
<button onclick="speak()">音声合成開始</button>
「音声合成開始」
<script>
ボタンが押され
function speak() {
た時の処理
const text = document.getElementById('text').value;
音声合成を利用
const utterance = new SpeechSynthesisUtterance(text)
speechSynthesis.speak(utterance);
音声合成開始
}
</script>
</body>
</html>
13
12.1 モジュール型音声対話システム 音声出力のコーディング (Python のライブラリを使う例) import pyttsx3 as pytts engine = pytts.init() engine.setProperty('rate', 170) engine.setProperty('voice', 'ja') engine.say("このライブラリはOSのTTSエンジンをラップしています.") engine.runAndWait() 14
12.2 リアルタイム型音声対話システム リアルタイム型音声対話システムとは ストリーミングで音声入出力を行う ユーザ発話に対して遅延なく応答を返せる システム発話に対する割り込みが生じても,適切に対応できる リアルタイム型音声対話システムの実装 WebSocket 等で音声信号の送受信を行い,認識・合成はサーバで行う 認識では音声入力と並行して逐次的にトークン化を行い,LLM に入力する LLMが発話終了と判断した時点で応答文の生成を始める 生成されるトークンを逐次的に音声合成器に送って音声出力を行う 15
12.2 リアルタイム型音声対話システム リアルタイム型音声対話システムの構成 初期リクエスト 非同期に実行 入力音声 Python 処理系 リアルタイム API サーバ WebSocket JapaScript 処理系 応答音声 終了処理 16
12.3 双方向型音声対話システム 双方向型音声対話システムとは 一定以上の長さの無音区間を音声終了としたターンの存在を前提としない 音声入出力を大規模言語モデルで同時に処理する 自然な割り込み・オーバーラップ・感情認識や感情表現も可能 Moshi:音声・テキストのマルチストリームを自己回帰的に処理 RVQ(Residual Vector Quantization)と事前学習モデルを用いて音声をトー クン化 RQ Transformerで文脈を保持しつつ応答テキストと音声を生成 システムの応答テキストは Inner Monologue としてトークン化されて自己回 帰的な入力となる 17
12.3 双方向型音声対話システム Moshi アーキテクチャ トークン列を埋め込みでベクトルに 変換したものを結合して LLM の入 力とします.LLM の出力はベクトル で,そこから出力単語と音声合成用 のトークンを作ります. RQ Transformer Depth Transformer 文脈情報 意味・音響 トークン テキス ト トーク ン Helium (LLM) ... ユーザ 音声入力 Mimi (codec) Moshi 音声出力 ... + Mimi はトークン と音声信号の変換 を行っているので すね. Mimi Inner Monologue ユーザ システム音声出力 18
12.3 双方向型音声対話システム 音声 codec Mimi 音声信号とトークンとの相互変換を行う 敵対損失に よる学習 WavLM コサイン類似度 に基づく蒸留 Lin+VQ Lin ... ... Lin + + Lin デコーダ ... エンコーダ ... 事前学習モデル から知識蒸留を 行ったトークン も持つことで, 意図や感情を反 映した音声が合 成されると考え られます. Lin+RVQ 入力 意味トークン 1 音声トークン 7 12.5Hz 出力 19
12.3 双方向型音声対話システム RQ Transformer 音声とテキストの両方の情報を同時に処理し,応答を生成する + 埋め込み LLM Temporal Transformer はテキストトークンと同等の情報 を持っていると考えられるので,そ こから音響トークンを生成するのは 自然な考えですね. 文脈 + テキスト トークン + + + Depth Transformer トークン 20