CG関係の備忘録ブログ

主にZBRUSH、blender

「プレイヤーの声にNPCが応答するゲーム」のミニプロトタイプ #2 文字起こし

このページの最終結

youtu.be

🎯 次の選択肢(どれでもOK!)

ここから先は、やりたい方向によって進み方が変わります:

  1. マイクから音声入力して送る(Whisperなどで文字起こし)

  2. NPCが返答を喋る(Text-to-Speech連携)

  3. NPCの表情や口パクを返答に合わせて変える

  4. GPTベースの返答生成に切り替える(LLMと連携)

  5. ゲームプレイと統合する(会話クエストや反応変化)


「これやってみたい!」があれば、何でもOKです。
ガッツリ一緒に構築していけますよ💪🔥

どこいきますか!?

 

マイクから音声入力して送る(Whisperなどで文字起こし)おねがいします!

 

了解です!🎤🧠
それでは「マイクから音声を録音 → Whisperで文字起こし → サーバーで返答 → Unrealに戻す」という流れを構築していきましょう!


🎯 全体の流れ(ざっくり)

[マイクで録音] → [音声ファイル保存] → [Whisperで文字起こし] → [replyを生成] → [UEに返す]

✅ 必要なもの(前提)

  1. Pythonが使えるPC

  2. マイク入力ができる環境

  3. Pythonライブラリ

    • whisper(OpenAI公式 or whisper.cpp系)

    • sounddevice(録音用)

    • scipy(wav形式で保存する用)

    • すでにある Flask サーバーと統合可能!


🔧 Step 1:Pythonに必要なライブラリをインストール

コマンドプロンプトで以下を実行:

pip install openai-whisper sounddevice scipy

⚠️ whisperのインストールには ffmpeg も必要です。ない場合は:

pip install ffmpeg-python

Windows用の ffmpeg.exe 本体は以下からダウンロードして、Pathを通す必要があります。
https://www.gyan.dev/ffmpeg/builds/


🎙️ Step 2:マイクから録音して文字起こし(単体テスト

まず単体テストとして以下のコードを作ってください:

import sounddevice as sd
from scipy.io.wavfile import write
import whisper

def record_and_transcribe():
    fs = 44100  # サンプリングレート
    duration = 5  # 録音時間(秒)
    print("録音開始!話してください...")
    audio = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
    sd.wait()
    write("input.wav", fs, audio)
    print("録音完了、文字起こし中...")

    model = whisper.load_model("base")
    result = model.transcribe("input.wav", language="ja")
    print("認識結果:", result["text"])
    return result["text"]

# テスト実行
if __name__ == "__main__":
    record_and_transcribe()

実行すると:

録音開始!話してください...
録音完了、文字起こし中...
認識結果: こんにちは、今日はいい天気ですね。

のように文字起こしされます☀️


✅ Step 3:Flaskサーバーに組み込む(/speechエンドポイントなど)

ここまでうまくいったら、今の Flask サーバーに /speech というルートを追加して、
録音→認識→reply生成をまとめられます。


👇 次やりたいことあったら教えて!

  • このコードをFlaskに統合して /speech エンドポイント化したい

  • UEから録音開始/停止の指示を出したい

  • Whisper.cppのローカル高速版を使いたい(GPU不要)

なども対応できます!
ひとまずここまで試してみて、録音&文字起こしうまくいったか教えてください!🔥

 

ffmpeg はインストール済みですが、パスを通すのはどうすればいいですか?

 

ナイスです!ffmpeg をインストール済みなら、「パスを通す」(=どこからでも ffmpeg コマンドを使えるようにする)作業をすれば、Whisperがちゃんと動いてくれます!


ffmpeg のパスを通す方法(Windows編)

ffmpeg.exe の場所を確認

まず、ffmpeg.exe のある場所を探します。
よくある場所の例:

C:\ffmpeg\bin\ffmpeg.exe

bin フォルダ内のパスが必要です!ffmpeg.exe までのパスではなく、その一つ上のフォルダを指定します。


② システム環境変数に追加する

1. 「スタートメニュー」で「環境変数」と検索

→「システム環境変数の編集」を開く

2. 「環境変数(N)…」ボタンをクリック

3. 「システム環境変数」か「ユーザー環境変数」の中の Path をダブルクリック

4. 「新規」を押して、ffmpegのパスを追加

例:

C:\ffmpeg\bin

5. OK → OK → OKで閉じる(全部保存)


③ パスが通ったか確認する

コマンドプロンプト(またはPowerShell)で以下を実行:

ffmpeg -version

うまくいけば、バージョン情報が表示されます!🎉


💡 注意:コマンドプロンプト再起動してね!

環境変数を変更した後は、新しいウィンドウを開いて再確認してください。


できたら record_and_transcribe() 試してみてくださいね!
ffmpegに問題がなければ、Whisperが音声ファイルを処理してくれるはずです!🔥

 

単体テストの録音&文字起こしできました!

 

うおおお!!🎉🎤📢
**録音&文字起こし成功、おめでとうございます!!**めちゃくちゃ順調ですね!👏✨


✅ ここまでできたということは:

  • マイクから音声を録音 ✅

  • WAVに保存 ✅

  • Whisperで日本語を認識 ✅

  • 文字起こしの結果を表示 ✅

という音声入力パートがすでに完成してます!


🎯 次のステップ(選んでください!)

このあと、どんな形でゲームと連携させたいかによって進め方が変わります。以下から好きな方向をどうぞ👇


① Flaskサーバーに /speech API を作って

→ UEから「録音 → 認識 → 返答」を一発で呼び出せるようにする
🧠💬🎮【おすすめ!】


② 録音をUnreal Engineからコントロールしたい

→ UEのボタンなどで「録音開始→停止→送信」ができるようにする


③ Whisperの認識結果をそのままNPCに喋らせたい

→ たとえば「プレイヤー:こんにちは」→「NPC:こんにちは」的なリピート動作


④ TTS(Text-to-Speech)で返答を喋らせたい

NPCのボイス再生も自動化したい 🎤🗣️


やりたい方向を教えてもらえれば、即テンプレ作ります💪
今、ものすごく良い流れきてますね🔥

 

① Flaskサーバーに /speech API を作って お願いします

 

了解です!🎯
それでは、マイクで録音 → Whisperで認識 → 返答生成 → JSONで返すという一連の処理を /speech エンドポイントとして Flask に統合しましょう!


🧠 目的

Unreal Engine から以下のようなリクエストを送ると:

POST http://127.0.0.1:5000/speech

Flask側が:

  1. マイクで録音(5秒)

  2. Whisperで認識(日本語)

  3. テキストを元に返答をつくる(例:「あなたは『〇〇』と言いましたね!」)

  4. {"reply": "..."} を返す


✅ Flaskサーバーのコードに /speech を追加

以下のコードを今ある Flask サーバーに追加してください:

from flask import Flask, request, jsonify
import sounddevice as sd
from scipy.io.wavfile import write
import whisper

app = Flask(__name__)
model = whisper.load_model("base")  # 初回はちょっと時間かかるけどそのままでOK

@app.route("/speech", methods=["POST"])
def speech_input():
    fs = 44100
    duration = 5  # 秒数はお好みで
    print("🎤 録音開始...")
    audio = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
    sd.wait()
    write("input.wav", fs, audio)
    print("🎧 録音完了、文字起こし中...")

    result = model.transcribe("input.wav", language="ja")
    recognized = result["text"]
    print("📜 認識結果:", recognized)

    reply = f"あなたは「{recognized}」と言いましたね!"
    return jsonify(reply=reply), 200, {'Content-Type': 'application/json; charset=utf-8'}

if __name__ == "__main__":
    app.run(port=5000)

✅ テスト方法

PowerShell(またはUEのHTTPリクエスト)

Invoke-WebRequest -Uri http://127.0.0.1:5000/speech -Method POST -Headers @{"Content-Type"="application/json"}

または curl

curl -X POST http://127.0.0.1:5000/speech -H "Content-Type: application/json"

✅ UE側でも使い方は簡単!

  • URL:http://127.0.0.1:5000/speech

  • メソッド:POST

  • Content-Type:application/json

  • Body:不要(空でOK)

すると、{"reply":"あなたは「〇〇」と言いましたね!"} というレスポンスが返ってきます!


💡 注意点

  • このAPIリクエストが来てから録音開始なので、録音中に話す必要があります

  • UEから送るたびにマイクで5秒録音されます

  • 音声録音ができない環境では実行に失敗します


準備できたら、Unrealから /speech を呼び出してみてください!
うまく動いたら、次は「返答をしゃべらせる」もいけますよ🗣️✨

 

Unrealから /speech を呼び出してうまくいきました!

 

おおお、最高です!!!🎉🎉🎉
Unrealからの呼び出し成功、マジでおめでとうございます!👏✨


🚀 これでできたこと

  • 🎤 プレイヤーの声を録音(Flaskサーバー側)

  • 🧠 Whisperで文字起こし

  • 💬 テキストを返すAPI連携が完成!


🎯 次のステップ案

  1. UE側で返ってきたテキストをNPCのセリフやUIに表示する

  2. 返答テキストをTTS(Text-to-Speech)で音声化してNPCにしゃべらせる

  3. 録音時間や認識モデルをカスタマイズする

  4. プレイヤーが録音開始・停止を操作できるようにする


何をやりたいか教えてもらえれば、すぐサポートしますよ!
最高のゲーム体験を目指していきましょう🔥

 

ここまでの実行結果を動画にしました。