Twilio Conversational Intelligenceで電話の文字起こし＆メール自動送信：リアルタイム活用デモ

## 概要

今回紹介するのは、AIによる電話での自動対応を、Twilioの新機能「Conversational Intelligence」を使って通話の自動文字起こしとデータ保存、文字起こしデータ内容を**数秒後にメール送信**するデモを作りました。

営業やサポートなど、通話後にすぐ内容を確認したい場面で役立つソリューションとなります。

---

## Twilio Conversational Intelligenceとは？
Twilio Conversational Intelligence（会話インテリジェンス）は、Twilioの音声通話機能に対して**高度な音声認識・解析機能を追加**できる新しいサービスです。具体的には、以下のような機能を提供しています：

* **発話者の識別（スピーカータグ）**
* **通話の内容をセンテンス単位で構造化**
* **通話データをTwilio側で保存・取得可能**
* **会話に対するインサイトの抽出（例：感情・トピック分析など）※将来的に拡張予定**

従来のTwilio Programmable Voiceでは、通話音声を録音した後に音声ファイルを別の音声認識エンジン（Google Cloud Speech-to-Textなど）で処理する必要がありました。一方、**Conversational IntelligenceはTwilioの中で完結**できるため、**構成がシンプルかつリアルタイム性の高い**実装が可能です。

特に大きな特徴は、**ConversationRelayと組み合わせて利用できる点**です。これにより、音声通話中にTwilioから直接WebSocket経由で音声を送信しながら、同時に会話の文字起こしデータをConversational Intelligenceサービスに保存できます。

ただし、今日時点(2025年5月22日時点)で、日本語での利用は限定的です。
現時点ではIntelligence Serviceの言語設定が日本語を設定できません。
そのため、今回の利用方法では、Conversational Intelligenceをリアルタイム文字起こしの**データの保管場所**としてのみ利用しています。

---


### サポート状況(2025年5月22日時点)
現時点では英語などの10言語では完全な機能を利用できますが、日本語では一部の機能のみ利用となります。

| チャネル  |  機能          |  日本語可否  |　説明　|
| ------- | ---------------| -----------| ---------|
| Voice | Twilio Recordings	| NG        | 録音ファイルから日本語の文字起こしができない。 |
| Voice | 外部 Recordings	| NG        | 録音ファイルから日本語の文字起こしができない。 |
| Voice | Call              | OK        | 文字起こし・要約・感情分析はできるが、文字起こし以外は全て英語で表示される |
| Voice | ConversationRelay	| OK        | 文字起こしのみ対応可能 |



### ConversationRelay × Conversational Intelligence のメリット

| 従来の方法         | Conversational Intelligence         |
| ------------- | ----------------------------------- |
| 音声録音後に外部処理が必要 | 通話中にTwilio内で文字起こし・保存                |
| 構成が複雑になりがち    | Functions & ConversationRelayで簡潔に実装 |
| 外部APIへの接続が必須  | Twilio内で完結可能                        |
| スピーカータグは自前で構築 | 発話者識別が自動で付与される                      |

---
## デモの作成

### 構成図

```
[User]
  ↓ 通話
[Twilio Voice]
  ↓
[ConversationRelay]
  ↓ transcribe & store
[Conversational Intelligence]
  ↓
[通話終了イベント (StatusCallback)]
  ↓
[Twilio Function]
  ↓
[メール送信 (SendGrid)]
```

### 事前準備

- Twilioのアカウント
- SendGridアカウント
- [AIボットと電話を繋ぐ - Twilio Voice - ConversationRelay](https://qiita.com/halapolo/items/063691955cbaa1400de8) が完了していること

---
## ステップ 1：Conversational IntelligenceのService作成

まずTwilio Consoleから `Intelligence Service` を作成します。
このServiceが、通話中の発話を解析・保存してくれる基盤になります。

### 作成手順

1. ConsoleでConversationa Intelligenceにアクセス

    ![SCR-20250523-ighd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/5966ae6b-a3f7-4392-bed7-2d2d62f3834c.png)

2.  Intelligence Servicesにアクセスし"Create new Service"ボタンを押す

    ![SCR-20250523-igzc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/406afd10-8457-48e8-a049-f23d6eb14337.png)


3.  任意の名前をつけ、言語選択を行う

    ![SCR-20250523-ihpb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/3a832b74-375b-44cd-81d1-57639b438ff2.png)

4. Language Operatorsで任意のOperatorを選択します
今回のデモコードを動かすためには選択する必要はないですが、Conversation SummaryやSentiment Analysisなどは、Callの機能での利用であれば限定的に利用可能です。

    ![SCR-20250523-iilt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/1668cb8f-6d99-440c-83d2-95a540d2b182.png)

5. 後ほど、デモコード内でService SIDを使うので、控えておきます
    ![SCR-20250523-ikpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/5f6fce39-971d-4349-95f2-a9854c88dde8.png)


---

## ステップ 2：ConversationRelayにパラメーター追加

次にTwiMLで `ConversationRelay` を使って通話を接続する際、以下のように `intelligenceService` パラメータを追加します。

```xml
<ConversationRelay
  url="wss://halapolo.jp.ngrok.io"
  intelligenceService="GAxxxxxxxxxxx"
  language="ja-JP"
  welcomeGreeting="もしもし。こちらは。保険アシスタントです。ご要件をお話ください。"
  ttsProvider="Google"
  voice="ja-JP-Chirp3-HD-Aoede" />
```

---

## ステップ 3：通話終了イベントをトリガーに処理を開始

通話終了時に自動的に処理を走らせるには `StatusCallback` を活用します。
今回は、電話番号の設定で指定できる、Call Status Changeを利用してステップ４で作成するFunctionsのURLにデータを送信することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/8c6b3210-1194-4945-bc2c-4eb11aebdd9d.png)

このイベントを受けたTwilio Functionでは、以下のような処理を実行します：

* 該当するTranscriptを検索
* 数秒待機（Transcriptの生成を待つため）
* 発話データ（Sentences）を取得
* フォーマットしてメール送信（SendGrid利用）

---

## ステップ 4：Functionのコード例

```javascript
const sgMail = require('@sendgrid/mail');

exports.handler = async function(context, event, callback) {
  const twilioClient = require('twilio')(context.ACCOUNT_SID, context.AUTH_TOKEN);
  const callSid = event.CallSid;

  if (!callSid) return callback(null, "No CallSid provided.");

  sgMail.setApiKey(context.SENDGRID_API_KEY);

  try {
    const transcripts = await twilioClient.intelligence.v2.transcripts.list({ limit: 20 });
    const matched = transcripts.find(t => t.channel?.media_properties?.reference_sids?.call_sid === callSid);
    if (!matched) return callback(null, 'Transcript not found.');

    await new Promise(resolve => setTimeout(resolve, 2000)); // 2秒待機

    const sentences = await twilioClient.intelligence.v2
      .transcripts(matched.sid)
      .sentences
      .list({ limit: 100 });

    const sentenceText = sentences
      .filter(s => s.transcript)
      .map(s => `[${s.mediaChannel === 1 ? 'Agent' : 'Customer'}] ${s.transcript}`)
      .join('\n');

    const msg = {
      to: context.TO_EMAIL,
      from: context.FROM_EMAIL,
      subject: `Transcript for CallSid: ${callSid}`,
      text: sentenceText,
    };
    await sgMail.send(msg);
    return callback(null, "ok");

  } catch (err) {
    console.error(err);
    return callback(null, "error");
  }
};
```

## 実行結果
電話をかけてAIと会話し通話を切ると指定したメールアドレスに下記のような結果が送られてきます。

![SCR-20250523-noxp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/80a2dd9b-2182-4a36-98bc-d006bd06efc2.png)


---

## 応用例・今後の展開

この仕組みを応用すれば、下記のようなユースケースにも対応できます：

* 通話内容の自動要約（OpenAI APIなどと連携）
* CRMとの自動連携
* 会話のトピックや感情分析
* 通話品質の評価

---

## まとめ

Twilio Conversational Intelligenceは、単なる録音ではなく\*\*「構造化された会話データ」\*\*として活用できる点が大きな魅力です。

今回のように、**リアルタイムに通話内容を取得・分析・活用**できる環境を簡単に構築できるのは、Twilioならではの強みです。