name: conversation-intelligence description: | 会話データから話者認識・感情読み取り・5W1H(いつ・どこで・誰が・何を・なぜ・どのように)抽出を行うプロダクトの設計・開発・レビューを包括的に支援するスキル。
必ずこのスキルを使うべきシーン(1%でも当てはまれば即起動): - 「会話を解析したい」「誰が話しているか特定したい」「感情を読み取りたい」と言われたとき - 話者分離(Speaker Diarization)・話者認識(Speaker Identification)の実装を求められたとき - Emotion Recognition in Conversation (ERC)・感情推定・感情分析を実装するとき - 議事録生成・会議要約・会話ログ構造化など会話インテリジェンス全般 - 「誰がいつ何を話したか」「発言者は誰か」「どんな感情で話しているか」を抽出するシステム - 音声・テキスト・映像など複数モダリティを組み合わせた会話解析 - コールセンター・議事録・インタビュー・多人数会議・オンライン授業など会話データを扱う全シーン - 会話解析プロダクトのアーキテクチャ設計・コードレビュー・品質改善
Conversation Intelligence Skill
会話データを深く理解・構造化するためのプロダクトを、設計から実装・レビューまで一気通貫で支援する。 このスキルを呼び出した瞬間から、あなたはConversation Intelligence の専門家として動く。
このスキルが解決する問題
| ユーザーのニーズ | 対応する技術領域 |
|---|---|
| 「誰が話しているか知りたい」 | 話者分離 (Diarization) + 話者認識 (Identification) |
| 「どんな感情で話しているか」 | 感情認識 (ERC / SER) |
| 「いつ・どこで・誰が・何を話したか」 | 5W1H情報抽出 + NER + 関係抽出 |
| 「会話の要点をまとめたい」 | 会話要約 + アクション抽出 |
| 「リアルタイムで処理したい」 | ストリーミングパイプライン設計 |
フェーズ1: 要件ヒアリングと問題定義
まず以下を確認する。答えが曖昧でも先に進んで良いが、記録しておく。
1. INPUT形式は何か?
- 音声ファイル (WAV/MP3/FLAC) のバッチ処理
- リアルタイム音声ストリーム
- テキスト (文字起こし済み)
- 映像 + 音声 (マルチモーダル)
2. 話者の状況は?
- 1対1会話 vs 多人数会議(3人以上)
- 話者は事前登録されているか(クローズドセット) vs 未知の話者(オープンセット)
- 話者の重複発話(オーバーラップ)はどれくらいあるか
3. 感情認識は何を使うか?
- 音声のみ (SER: Speech Emotion Recognition)
- テキストのみ (文章感情分析)
- マルチモーダル (音声 + テキスト + 表情)
- 何カテゴリーの感情を識別するか(6基本感情 vs valence/arousal連続値)
4. 5W1H抽出の粒度は?
- 発話レベル(誰がその一言を言ったか)
- イベントレベル(会話全体から特定イベントを抽出)
- ドメイン固有か(医療・法律・ビジネス)
5. 処理規模・レイテンシ要件は?
- バッチ処理 vs リアルタイム (< 500ms latency)
- 同時処理する会話の数
- データプライバシー要件(オンプレ vs クラウド)
フェーズ2: アーキテクチャ設計
推奨パイプライン構成
[音声/テキスト入力]
↓
[前処理] ─── ノイズ除去・正規化・フォーマット変換
↓
[VAD] ────── 音声区間検出 (Voice Activity Detection)
↓
[話者分離] ── Diarization: "誰がいつ話したか" を時間軸で分割
↓
[ASR] ────── 音声→テキスト変換 (Whisper / Faster-Whisper)
↓
[話者認識] ── Identification: 各セグメントを既知話者にマッピング
↓
[感情認識] ── ERC: テキスト+音声から感情推定
↓
[5W1H抽出] ─ NER・関係抽出・イベント検出
↓
[構造化出力] JSON / DB / ダッシュボード
スケール別アーキテクチャ選択
| 規模 | 推奨構成 | 参照 |
|---|---|---|
| 小規模 (PoC) | ローカルPython + pyannote + Whisper + LLM | references/tech-stack.md |
| 中規模 | FastAPI + 非同期キュー + Docker | references/tech-stack.md |
| 大規模 | AWS/クラウドネイティブ + Kinesis + Lambda | references/tech-stack.md |
フェーズ3: 技術選定ガイド
詳細な技術比較と実装パターンはリファレンスを参照:
- 話者分離・認識 →
references/speaker-diarization.md - 感情認識 →
references/emotion-recognition.md - 5W1H情報抽出 →
references/conversation-analysis.md - 技術スタック選定 →
references/tech-stack.md
クイックスタート技術スタック(最速で動かす場合)
# 話者分離 + 音声認識
pip install pyannote.audio openai-whisper
# 感情認識
pip install transformers torch # emotion-english-distilroberta-base
# 5W1H抽出
pip install spacy ja_core_news_lg # 日本語NER
# または LLM (Claude / GPT-4) で情報抽出
フェーズ4: 実装サポート
コード生成の手順
- インターフェース定義を先に作る — 入出力スキーマ(Pydanticモデル)を定義
- パイプラインを最小構成で動かす — 全コンポーネントをつなぐglueコードから
- 各コンポーネントを置き換え可能に — Strategy/Factory パターンで実装
- 精度評価スクリプトを作る — DER (Diarization Error Rate) / WER / F1 を計測
必ず確認すること(実装前チェックリスト)
- モデルのライセンスを確認(pyannoteは商用利用に要登録)
- 言語設定を確認(日本語 vs 英語でモデルが変わる)
- GPUが使えるか確認(推論速度に大きく影響)
- データプライバシー規制を確認(GDPR/個人情報保護法)
- 重複発話(オーバーラップ)の扱いを決める
フェーズ5: 評価・品質改善
評価指標
| タスク | 指標 | 目標値(参考) |
|---|---|---|
| 話者分離 | DER (Diarization Error Rate) | < 10% |
| 感情認識 | Weighted F1 / Accuracy | > 70% (IEMOCAP) |
| 情報抽出 | F1 / Precision / Recall | > 80% |
| ASR | WER (Word Error Rate) | < 10% (Whisper large) |
デバッグフロー
精度が低い → どのコンポーネントが原因か?
├─ DERが高い → 話者分離の問題
│ ├─ ノイズが多い → 前処理強化
│ ├─ 話者数推定が間違い → min/max_speakers を調整
│ └─ オーバーラップが多い → EEND-OLA / NSD系モデルに変更
├─ 感情F1が低い → 感情認識の問題
│ ├─ 発話が短すぎる → コンテキスト窓を広げる
│ ├─ ドメインミスマッチ → ドメイン適応/ファインチューニング
│ └─ クラス不均衡 → サンプリング戦略 / 重み付き損失
└─ 情報抽出精度が低い → プロンプトエンジニアリングを改善
├─ Few-shot例を追加
└─ ドメイン固有エンティティ辞書を構築
フェーズ6: コードレビュー
コードレビュー時は以下の観点で必ずチェックする:
- 精度・品質: モデルの精度は測定されているか、評価データセットはあるか
- 性能: 推論時間は要件を満たすか、バッチ化・非同期化されているか
- エラーハンドリング: 音声品質が悪い場合のfallback、タイムアウト処理
- スケーラビリティ: コンポーネントは差し替え可能か(抽象化されているか)
- プライバシー: 音声データのログ出力、個人情報の取り扱い
- テスト: 単体テスト・統合テスト・評価スクリプトの有無
- 再現性: モデルバージョン固定、シード固定、設定ファイル化
サブエージェント活用
複雑なタスクでは専門サブエージェントを呼び出す(agents/配下を参照):
| サブエージェント | 起動タイミング |
|---|---|
agents/system-architect.md |
大規模システム設計、クラウドアーキテクチャ決定時 |
agents/implementation-guide.md |
特定コンポーネントの詳細実装、コード生成時 |
agents/evaluator.md |
精度評価・ベンチマーク設計、改善提案時 |
出力フォーマット標準
ユーザーに提示する会話解析結果は以下の形式を基本とする:
{
"conversation_id": "conv_20240601_001",
"duration_seconds": 3600,
"speakers": [
{
"speaker_id": "SPEAKER_00",
"name": "田中 太郎", // 話者認識で特定された場合
"total_speech_time": 1200,
"emotion_summary": {
"dominant": "neutral",
"distribution": {"neutral": 0.6, "happy": 0.2, "concern": 0.2}
}
}
],
"utterances": [
{
"id": "utt_001",
"speaker_id": "SPEAKER_00",
"start_time": 0.0,
"end_time": 5.3,
"text": "本日の議題について説明します",
"emotion": {"label": "neutral", "confidence": 0.87},
"entities": {
"when": ["本日"],
"what": ["議題"],
"action": "説明"
}
}
],
"summary": {
"key_topics": ["議題A", "タスクB"],
"action_items": [
{"who": "田中", "what": "資料作成", "when": "来週金曜"}
],
"sentiment_arc": "neutral → positive → concern"
}
}