すべてのプロダクト
Search
ドキュメントセンター

Intelligent Media Services:ライブ字幕

最終更新日:May 30, 2025

このトピックでは、AICallKit SDK を使用して、ユーザー入力とインテリジェントエージェントの応答の両方でライブ字幕を取得する方法について説明します。

始める前に

概要

ユーザー側のライブ字幕

ユーザー入力は AI エージェントによって認識され、UI にリアルタイムで表示されます。

lQDPKeLM6OXzFGHNCMjNBDiwmvXWuI7zQ84HVy-x3Np4AA_1080_2248

エージェント側のライブ字幕

LLM によって生成されたコンテンツは、UI にリアルタイムで表示されます。

lQDPJyB9LXbMhGHNCMjNBDiw5kh8C3S6jikHVy-y6E6YAA_1080_2248

説明

この機能は、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);
});