🧪 開発・試作メモ

第9回|感情分析④:発話のバランスから見えてくること(比率分析編)

第9回|感情分析④:発話のバランスから見えてくること(比率分析編)

🎯 今回のゴール

コーチと生徒、どっちがどれだけおしゃべりしてたか…ズバッと数字とグラフで暴きます!

今回は👇

誰が何回しゃべったかをカウント

  • 「コーチばっか話してない?」「生徒が黙りすぎてない?」をパーセンテージで丸裸
  • ついでにGPT先生に「今回はコーチ主導だったね!」みたいな一言コメントを書いてもらう
  • まとめて report.json にドン!して、ポータルでパッと見れる

これさえあれば、一方通行セッション撲滅!

毎回の話しすぎ・話さなすぎ問題も一発解決です🎉

🧰 準備するもの

今回の発話比率チェックで使うのは、この2つだけ!

1. セッション文字起こしテキスト

手元にある session_transcript.txt を使います。

内容は、コーチと生徒の会話が改行ごとに並んでいる状態です。

2. speaker 情報を付ける準備

このテキストにはまだ「誰が話したか」が付いていません。

でも大丈夫!

発言が交互になっているので、ルールで自動付与できます

3. Colab を開ける環境

テキストを分割して speaker を付ける作業は、Google Colab を使ってサクッとやります。

コピペだけで完成するスクリプトをこの記事で用意してるので安心です!

🗝️ ポイント

  • speaker 付きのJSONができれば、比率分析はすぐできる!
  • わざわざ手入力しなくても、Colabで自動化しちゃおう!

🗂️ ステップ0:speakerタグを自動で付けよう

まずは文字起こしテキストからコーチと生徒、どっちが話したかを自動で付けていきます!

発言は交互になっているので、0, 2, 4, ... はコーチ、1, 3, 5, ... は生徒…というルールで一気に付けちゃいます。

Colabサンプルコード👇

# ✅ 必要なモジュールをインポート
import json

# ✅ テキストファイル(session_transcript.txt)をアップロード(Colabの場合)
from google.colab import files

uploaded = files.upload()
# 例: session_transcript.txt を選んでアップロードする

# ✅ テキストを読み込んで分割
filename = list(uploaded.keys())[0]

with open(filename, "r") as f:
    lines = f.read().strip().split("\n\n")

# ✅ speakerを交互に付ける
segments = []
for i, line in enumerate(lines):
    speaker = "coach" if i % 2 == 0 else "student"
    segments.append({
        "speaker": speaker,
        "text": line.strip()
    })

# ✅ 先頭5件だけ確認
for s in segments[:5]:
    print(s)

# ✅ JSONで保存
with open("session_with_speaker.json", "w") as f:
    json.dump({"segments": segments}, f, ensure_ascii=False, indent=2)

# ✅ Colabからダウンロード
files.download("session_with_speaker.json")

print("✅ 完了!speaker付きJSONがダウンロードされます!")

📂 ポイント

  • files.upload() でsession_transcript.txtをColabにアップ
  • 自動で speaker を付与
  • JSONを作って自動でダウンロード

これで次の工程に進む前に、「speaker付きJSON」が確実に手に入ります!

🗂️ ステップ1:発話数をカウントしよう

speaker 付きのJSONができたら、いよいよ「誰が何回しゃべったか」を数えていきます!

Colab用コード

まずは session_with_speaker.json を Colab にアップロードしてから👇

# =====================================
# ステップ0: Colab にファイルをアップロード
# =====================================

from google.colab import files
uploaded = files.upload()

# =====================================
# ステップ1: JSONファイルを読み込み & 発話数をカウント
# =====================================

import json
from collections import Counter

# ファイル名(アップロードした名前に合わせて)
filename = "session_with_speaker.json"

# JSON読み込み
with open(filename, "r") as f:
    data = json.load(f)

# "segments" の中身を取り出す
segments = data["segments"]

# speaker ごとにカウント
speaker_counts = Counter()
for item in segments:
    speaker = item.get("speaker", "unknown")
    speaker_counts[speaker] += 1

print("発話数:", speaker_counts)

📌 ポイント

  • files.upload() で JSON をアップロード
  • "segments" の中の "speaker" を一個ずつ数えるだけ!
  • 出力結果は {'coach': X, 'student': Y} の形で表示されます

🗝️ これでわかること

  • 誰がどれだけ話してたのかが 数字 で一目瞭然!
  • ここから比率(%)を出すのもラクラク!

📊 ステップ2:比率(%)を計算しよう

発話数がわかったら、次は 「全体の中で何%しゃべったのか」 を計算します!

Colab用コード

ステップ1の続きで、そのまま書いてOK👇

# ステップ1で作った speaker_counts を使う

# 合計を出す
total = sum(speaker_counts.values())

# speakerごとに比率を計算(小数第1位まで)
speaker_ratio = {k: round(v/total * 100, 1) for k, v in speaker_counts.items()}

print("発話比率(%):", speaker_ratio)

📌 ポイント

  • sum() で総発話数を算出
  • 各 speaker の数を全体で割って、パーセンテージにするだけ!
  • round() で小数点を揃えるとキレイに見える!

🗝️ これでわかること

  • コーチがどのくらい話してた?
  • 生徒がどのくらい話してた?
  • これが数値化されると、「一方的すぎない?」を後で確認できる!

📈 ステップ3:円グラフを作ってみよう

発話比率が数字でわかったら、今度は 円グラフ にしてパッと見でわかるようにしましょう!

色がつくだけで、比率の印象が全然違います✨

Colab用コード

ステップ2の speaker_ratio を使って、そのまま👇

import matplotlib.pyplot as plt
from google.colab import files

# ラベルと値
labels = speaker_ratio.keys()
sizes = speaker_ratio.values()

# 色指定
colors = ["#66c2a5", "#fc8d62"]

# 円グラフ作成
plt.figure(figsize=(6, 6))
plt.pie(
    sizes,
    labels=labels,
    autopct="%1.1f%%",
    startangle=90,
    colors=colors
)
plt.axis("equal")
plt.title("発話比率(コーチ vs 生徒)")

# ✅ 先に保存!
filename = "speaker_ratio_pie.png"
plt.savefig(filename)

# ✅ その後に表示
plt.show()

# ✅ そしてダウンロード
files.download(filename)

📌 ポイント

  • matplotlib を使えば一瞬でカラフル円グラフ!
  • autopct で%表示をオンに
  • startangle=90 で切り口を12時の方向に揃えると見やすい!

🗝️ これでわかること

  • 誰がどれだけ話してたかが 一目瞭然!
  • 見た目でバランスを確認できるから、フィードバックにも便利!

次のステップでは、この比率をもとに「今回のセッションの傾向」をAIに書かせちゃいます🚀

💬 ステップ4:GPTにコメントを作ってもらおう

数字とグラフだけでも便利だけど、どうせなら 「今回のセッションはどっち主導だった?」 をGPTに一言でまとめてもらいましょう!

これがあると、後から見返すときに一瞬で雰囲気がわかる! ので超便利です✨

Colab用コード

前のステップで作った speaker_ratio を使って👇

from openai import OpenAI

# OpenAIのクライアントを作成
client = OpenAI()

# GPTに投げるプロンプト
prompt = f"""
あなたはコーチングセッションの分析アシスタントです。
以下の発話比率をもとに、セッションの特徴を一言コメントでまとめてください。

発話比率: {speaker_ratio}
"""

# GPTにお願いする
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "あなたは優秀な分析アシスタントです。"},
        {"role": "user", "content": prompt}
    ]
)

# コメントを取り出す
speaker_comment = response.choices[0].message.content
print("GPTのコメント:", speaker_comment)

📌 ポイント

  • prompt に発話比率を渡して、「一言コメント」をお願いするだけ!
  • 例:「今回はコーチ主導で進行したセッションでした」 みたいな一言が自動で出てくる!

🗝️ これでできること

  • 数字だけじゃなく、AIが「状況」を要約してくれる
  • 後から見返したときに「おお、このときは生徒が頑張って話してたな〜」が一瞬でわかる

💾 ステップ5:report.json に保存しよう

発話数 ✅
比率 ✅
コメント ✅

…と全部揃ったので、あとは report.json にまとめて保存 しちゃいましょう!

これでポータルでも自動で確認できる状態になります🚀

Colab用コード

下記のコードを実行しreport.jsonをアップロードしてください👇

import json

# report.json をアップロード
from google.colab import files

uploaded = files.upload()
filename = list(uploaded.keys())[0]

# 読み込み
with open(filename, "r") as f:
    report = json.load(f)

# speaker_ratio と speaker_comment を追加
report["speaker_ratio"] = speaker_ratio
report["speaker_comment"] = speaker_comment

# 上書き保存
with open("report.json", "w") as f:
    json.dump(report, f, ensure_ascii=False, indent=2)

# ダウンロード
files.download("report.json")

print("✅ report.json に追加して保存しました!")

📌 ポイント

  • 既存の report.json に新しい情報をマージ!
  • speaker_ratio は数値データ、speaker_comment はGPTの一言まとめ
  • 保存したら、そのままポータルに置くだけでOK!

🎉 これでできること

  • 「感情の波」+「気づき」+「発話比率」 が全部 report.json に集結!
  • セッションの振り返りが超スマートになる!

これで今回の比率分析編はミッションコンプリートです✨

📝 おさらいと次回

これで、コーチと生徒の発話バランスを「数字・グラフ・AIコメント」で丸わかり!なデータが report.json に全部まとまりました✨

これで後から振り返って

  • 「一方的すぎた?」
  • 「次はもっと生徒に話してもらおう!」

がサクッと確認できます。

次回は、第7回で作った「ポジ/ネガ/ニュートラルだけの感情グラフじゃ物足りない!」という課題をアップデート!

スコア型にして感情のゆらぎをもっと詳しく拾い、

“どこで心が動いたか” をAIにまとめさせてみます。

🔗 関連リンク|AI秘書ツール制作シリーズ

💡 迷ったらこちらも

  • この記事を書いた人

SHIRAN

「コードは知らない。でも作れる。」AIとツールで便利を生む非エンジニア。挫折も経験しながら、今は作る楽しさを発信中。詳しくはこちら

-🧪 開発・試作メモ
-, ,