このトピックでは、AICallKit SDK を使用して、ユーザー入力とインテリジェントエージェントの応答の両方でライブ字幕を取得する方法について説明します。
始める前に
次の例は、UI を使用せずに API を使用してこの機能を実装する方法を示しています。
事前に AICallKit SDK を統合する必要があります。 詳細については、「Android 向け AICallKit SDK の統合」、「iOS 向け AICallKit SDK の統合」、および「Web 向け AICallKit SDK の統合」をご参照ください。
概要
ユーザー側のライブ字幕 ユーザー入力は AI エージェントによって認識され、UI にリアルタイムで表示されます。
| エージェント側のライブ字幕 LLM によって生成されたコンテンツは、UI にリアルタイムで表示されます。
|
この機能は、UI を使用した統合ソリューションに含まれています。
仕組み
通話中、ユーザーの質問がインテリジェントエージェントによって認識されると、onUserSubtitleNotify コールバックがトリガーされます。インテリジェントエージェントが応答を生成すると、onVoiceAgentSubtitleNotify コールバックがトリガーされます。
onUserSubtitleNotify の詳細
ユーザーが話している間、エージェントの認識結果は通知を介して複数回返されます。 ライブ字幕シナリオでは、テキストコンテンツを直接レンダリングして UI に表示できます。 会話型チャットシナリオでは、isSentenceEnd=true が返されると、最終的なテキストコンテンツがレンダリングされ、UI に表示されます。
パラメーター | 説明 |
text | AI エージェントによって認識されたテキスト。 |
isSentenceEnd | 現在のテキストが文の終わりかどうかを示します。 このパラメーターが true に設定されている場合、AI エージェントは質問への回答を開始します。 |
sentenceId | 現在のテキストが属する文の ID。 ID は、質問が行われるたびに累積されます。 |
voiceprintResult | 音声区間検出(VAD)の結果。有効な値: 0:VAD ベースのノイズリダクションと AIVad は無効になっています。 1:VAD ベースのノイズリダクションは有効になっていますが、ボイスプリントは登録されていません。 2:VAD ベースのノイズリダクションが有効になっており、話者が認識されています。 3:VAD ベースのノイズリダクションは有効になっていますが、話者は認識されていません。 この場合、AI エージェントは質問に答えません。 4:AIVad が有効になっており、メインの話者が認識されています。 5:AIVad は有効になっていますが、メインの話者は認識されていません。 この場合、AI エージェントは質問に答えません。 説明 AICallKit SDK for Web は、ボイスプリントベースのノイズリダクションをサポートしていません。 |
たとえば、ユーザーが「今日の天気は?」と質問した場合、次のようなコールバック結果が返される可能性があります。
たとえば、ユーザーが「今日の天気はどうですか?」と質問すると、次のコールバック結果が返される場合があります。
text="今日の天気は" isSentenceEnd=false sentenceId=1
text="どうですか?" isSentenceEnd=true sentenceId=1
onVoiceAgentSubtitleNotify の詳細
AI エージェントの応答は、複数の通知で返されます。 クライアントはこれらのテキストフラグメントをマージし、結合されたテキストを UI に表示するために段階的にレンダリングする必要があります。
パラメーター | 説明 |
text | AI エージェントによって提供された回答のテキスト。 |
isSentenceEnd | 現在のテキストが回答の最後の文かどうかを示します。 このパラメーターが true に設定されている場合、AI エージェントは質問への回答を終了し、リスニング状態に入ります。 |
userAsrSentenceId | AI エージェントによって認識されたユーザーの質問が属する文の ID。 |
たとえば、ユーザーの質問に対して、エージェントは「今日の天気は晴れで、気温は穏やかなので、外出するには良い日です。」と回答しました。 次のコールバック結果が返される場合があります。
text="今日の天気は晴れで、" isSentenceEnd=false userAsrSentenceId=1
text="気温は穏やかで、外出するには良い日です。" isSentenceEnd=false userAsrSentenceId=1
text="" isSentenceEnd=true userAsrSentenceId=1
サンプルコード
Android
// コールエンジンのコールバックを登録します。
mARTCAICallEngine.setEngineCallback(mCallEngineCallbackWrapper);
// コールバックイベントを処理します。
ARTCAICallEngine.IARTCAICallEngineCallback mCallEngineCallbackWrapper = new ARTCAICallEngine.IARTCAICallEngineCallback() {
@Override
public void onUserAsrSubtitleNotify(String text, boolean isSentenceEnd, int sentenceId, VoicePrintStatusCode voicePrintStatusCode) {
// ASR によって認識されたテキストを同期します。
}
@Override
public void onAIAgentSubtitleNotify(String text, boolean end, int userAsrSentenceId) {
// AI エージェントの応答を同期します。
}
}iOS
// コールエンジンのコールバックを登録します。
self.engine.delegate = self
func onUserSubtitleNotify(text: String, isSentenceEnd: Bool, sentenceId: Int, voiceprintResult: ARTCAICallVoiceprintResult) {
// ユーザーの質問が AI エージェントによって認識されたときにトリガーされます。
}
func onVoiceAgentSubtitleNotify(text: String, isSentenceEnd: Bool, userAsrSentenceId: Int) {
// AI エージェントが応答を生成したときにトリガーされます。
}Web
// コールエンジンのコールバックを登録します。
engine.on('userSubtitleNotify', (subtitle, voiceprintResult) => {
// ユーザーの質問が AI エージェントによって認識されたときにトリガーされます。
console.log('AICallUserSubtitleNotify', subtitle.text, subtitle.end, subtitle.sentenceId, voiceprintResult);
});
engine.on('agentSubtitleNotify', (subtitle) => {
// AI エージェントが応答を生成したときにトリガーされます。
console.log('AICallAgentSubtitleNotify', subtitle.text, subtitle.end, subtitle.sentenceId);
});
