冷笑エンジン

https://github.com/Kan-O435/hack-s-2026-08

Next.js

Docker

PostgreSQL

Rails

音声認識による文字起こしをして冷笑を指摘

buridaikon

ky

推しアイデア

無自覚な冷笑を指摘することで日頃の発言を顧みること →相手の気持ちを考える(妄想)だけでは足りない批判的思考を得られる

作った背景

近頃ネットミームと化している「冷笑」や「冷笑界隈」に対するアンチテーゼ

推し技術

・音声認識 ・本人の声を再現して文字列を読み上げ

プロジェクト詳細

複数人がスマホ/PCを持ち寄って会話すると、AIがリアルタイムで「冷笑」を検出してスコア化し、 会話終了後には上位の冷笑者を本人そっくりの声で読み上げて煽る装置。

概要

  1. ニックネームだけでログイン(パスワード不要)
  2. パスコードでルームを作成 / 参加(1人1台の端末で参加する想定。各自のマイクが自分の声だけを拾うので、話者分離をタダで実現している)
  3. ルームに入っている間、マイクは自動でON。無音を検知すると発話を自動で区切って送信する(無音0.6秒・最短発話120msで区切る簡易VAD)
  4. 送られた音声はOpenAIで文字起こしされ、Claudeが「冷笑(相手を鼻で笑う・茶化す・痛いポエム的発言等)」かどうかを判定してスコアを付ける
  5. 冷笑判定された発言は会話画面でリアルタイムに色付きハイライト表示される
  6. 会話終了後、参加者ごとの合計スコア・辛口フィードバックが表示され、上位3名の冷笑者だけ、会話中の声を学習した音声クローンで「その声そっくりに」煽りセリフが読み上げられる

技術スタック

image

変更点、採用した理由

  • gpt-4o-transcribe → gpt-transcribe に変更

    • 変更した理由:gpt-transcribeシリーズがopenaiが出している文字起こし専門のモデル
    • 使用量は増えるが文字起こしの精度が悪いためgpt-transcribeに変更
    • sttを使用しない理由:whisperを使用していて精度は悪くなかったが、処理が遅すぎて次の会話で詰まる事象が起きたため諦めていた
  • なぜHaiku4.5を使用したのか

    • 一番使用量が重なってしまうので一番コストが低かったため
    • sonnetを使用したら精度も良かったが使用量がとても高くついてしまったためHaikuを使用している
  • なぜrails、next.jsを使用したのか

    • 早く作成するために慣れているこの二つのフレームワークを使用した
  • デプロイ先

    • rails → railsway
    • next.js → vercel

機能概要

1. 会話中の発言を自動で記録

まずはニックネームを設定して、ログインします

image

ログインするとダッシュボードが開くので、「チャットに参加する」、「チャットを作る」、「冷笑図鑑を見る」の中から選びます。

image

試しに「チャットを作る」を選択して、「妄言垂れ流し恥さらしチャンネル」という名前でチャンネルを作成してみます。

image

会話画面を開くと、アプリが参加者の発言を聞き取り、発言内容をリアルタイムで画面に表示します。

image

誰の発言なのかを区別して表示し、発言ごとに冷笑度の判定が行われます。マイクを利用できない場合は、テキスト入力で会話へ参加できます。

2. 会話中は内カメラを起動

会話を始めると、自分の端末の内カメラが起動します。画面には自分の映像と、現在のカメラ状態が表示されます。

image

カメラ映像が常に保存されるわけではありません。写真が保存されるのは、自分の発言から冷笑が検知された場合だけです。

3. 冷笑発言を自動で判定

発言内容から、次のような冷笑的な表現を判定します。

  • 相手の努力や熱意を茶化す発言
  • 相手や物事を見下すような発言
  • 皮肉を使って言葉や考え方を否定する発言
  • 鼻で笑うような短い反応
  • 「うわ」「えっ」など、引いた態度を含む反応

単に表現が大げさだったり、少し恥ずかしい発言だったりするだけでは、必ずしも写真撮影の対象にはなりません。

4. 冷笑を検知したら自動撮影

自分の発言が冷笑と判定されると、内カメラの現在の映像が自動で撮影されます。

撮影した写真は、その原因になった発言とセットで保存されます。誰か別の参加者が冷笑した場合に、自分のカメラが撮影されることはありません。

写真の保存中や保存完了時には、画面上に状態が表示されます。

5. 写真保存に失敗した場合の再試行

通信状態などの理由で写真を保存できなかった場合は、自動的に最大3回まで再試行します。

それでも失敗した場合は「写真保存を再試行」ボタンが表示され、ユーザーが手動でもう一度保存できます。

6. カメラを利用できない場合も会話を継続

カメラの利用を拒否した場合や、端末にカメラがない場合でも、会話機能自体は利用できます。

その場合は次の情報が表示されます。

  • カメラが停止していること
  • 冷笑写真が保存されないこと
  • カメラを再度起動するためのボタン

マイクとカメラは別々に動作するため、マイクをミュートしてもカメラは停止しません。

7. 冷笑図鑑でカードを閲覧

ホーム画面の「冷笑図鑑を見る」から、保存された冷笑写真を一覧で確認できます。

各カードには次の情報が表示されます。

  • 冷笑した人の写真
  • ニックネーム
  • 冷笑が発生したルーム名
  • 冷笑度
  • 冷笑と判定された発言
  • 判定理由
  • 撮影日時

新しく撮影されたカードから順番に表示されます。カードが多い場合はページを切り替えて閲覧できます。

自分が参加していない会話のカードは表示されません。同じ会話に参加していた人のカードは閲覧できます。

8. 自分の写真を削除

自分が写っているカードには「写真を削除」ボタンが表示されます。

削除前には確認画面が表示され、削除を確定すると写真と撮影日時が冷笑図鑑から削除されます。

他の参加者が自分の写真を削除したり、本人以外が他人の写真を削除したりすることはできません。

9. 会話終了直前の写真を保護

会話を終了した直後に画面を移動すると、最後の発言の判定や写真保存が間に合わない可能性があります。

そのため、最後の発言が判定中または写真保存中の場合は、処理の完了を少し待ってから結果画面へ移動します。待機中は「最後の冷笑判定と写真保存を待っています」と表示されます。

10. 写真の取り扱い

写真は、冷笑を検知した発言と紐づけて保存されます。

  • 会話中の映像全体は保存されません
  • 冷笑が検知された場合だけ写真を保存します
  • 自分が参加した会話の参加者だけが閲覧できます
  • 写真を削除できるのは写っている本人です
  • 本人が削除するまで写真は冷笑図鑑に保持されます

image

追加機能:顔による追加ポイント

  • ちゃんと冷笑している顔をしていると冷笑度が加点されます
  • これにより言葉による誤判定を緩和する目的
  • 顔により割と担保されていてより面白い

buridaikon

@da31ec4985bfd0f0