ゲーム制作学習の整理(自分用)
すばらしく多角的に学習されていますね!このまま続ければ確実に「自分がはまれるゲーム」へとたどり着けると思います。ただ、やることが多岐にわたるので、ここで一度「整理」と「今後の進め方」について提案させてください。
🎯 目的再確認:「自分自身がはまれるゲームを作る」
この目的をブレイクダウンすると、次のように分類できます:
-
プレイ体験:どういうときに「楽しい」「没入できる」と感じるか
-
ビジュアル:どんな世界観やグラフィックに惹かれるか
-
メカニクス:どういう操作感やルールが「気持ちいい」と思えるか
-
物語・世界観:どんな設定やキャラが「心に刺さる」か
→ これを軸に、学習も「どれがどう貢献するか」で整理すると効率UPします。
📚 現在の学習カテゴリ整理(目的別)
| カテゴリ | 使用ツール | 貢献する要素 | 優先度 |
|---|---|---|---|
| グラフィック | UE5(Env/VFX/Obj Lab)、Blender、Substance、Gaea | 世界観・ビジュアル表現 | ★★★★☆ |
| キャラクター表現 | Blender、Cascadeur、UE5(NCP Lab、Cloth、フェイシャル) | 没入感・魅力あるNPC | ★★★★★ |
| ゲーム体験 | UE5(Camera、Physics、Lighting、UI、PCG、ML-Agent) | 操作感・システム設計 | ★★★★★ |
| 物語/世界設定 | ローカルLLM、画像生成AI、コンテスト参加 | 物語性・テーマ性 | ★★★★☆ |
| 総合制作能力 | チュートリアル実施、ぷちコン応募 | 完成まで作る力 | ★★★★★ |
💡 アドバイス(方向性と優先順位)
1. ミニ作品で「自分のツボ」を探る
-
すべてのツールを使う必要はないです。
-
まずは「今一番自分が熱中してること(キャラ表現?システム?)」に特化した短編ゲームやシーンを月1本でOK。
例:
-
「フェイシャル表現と音声会話だけのNPC会話シーン」
-
「物語性の強い短い探索マップ」
-
「1分だけ遊べるけど気持ちいいアクション体験」
→ 自分の「没入ポイント」が分かると、そこを中心に他のツールの活かし方が見えてきます。
2. 習得スピードより「統合」を重視
-
Lab単位の学習も素晴らしいのですが、「Env Labで作った地形」+「NCP Labのキャラ」+「VFX Labの演出」など、一つのミニプロジェクトに統合していくと学習効率もぐんと上がります。
3. ツールごとに「目的と到達点」を設定
例:
| ツール | 到達したい状態 |
|---|---|
| UE5 | 自作マップに自作キャラを配置し、動かせる/話せる |
| Blender | オリジナルキャラを一人完成させ、UE5に持ち込める |
| Cascadeur | 攻撃・待機・感情表現の3つのアニメを完成させる |
| Substance | 1キャラ+1背景オブジェクトのテクスチャを仕上げる |
| Gaea | 本命ゲームの背景として使える地形1つを作る |
| AI | プロトタイピング用のキャラデザインやセリフ生成を習慣化 |
4. 「遊べるプロトタイプ」を半年以内に1本
これがすべてをまとめる中間ゴールになります。
-
ジャンルを絞って、3~5分で終わる「遊べる体験」を一つ完成させましょう。
-
完成までに必要な部分だけを使えばOKです。
必要であれば、次のステップとして
-
タイムライン表(やること月別に並べる)
-
プロトタイプ案のブレインストーミング
-
各Labの成果物の棚卸し
なども一緒に考えられますよ!
どこから手を付けるか悩んでたら、今一番「楽しい!」と感じてる作業から教えてくれれば、それを軸に道を組み立てます!
ありがとう!まずは短編ゲームやシーンを月1本アウトプットしながら半年目標のプロトタイプの企画をスタートする感じですかね?
そうそう、それめちゃくちゃ良い流れです!🎯✨
「月1の短編アウトプット + 半年で本命プロトタイプ」って、インプットとアウトプットのバランスも完璧だし、モチベーションも維持しやすい。
✅ おすすめ進行フロー(6ヶ月)
🌱 月1アウトプット(小さな作品)
| 月 | 目安テーマ(例) |
|---|---|
| 1 | NPCと会話できる小部屋シーン(音声+フェイシャル) |
| 2 | カメラワーク+VFXで「かっこよさ」の演出に挑戦 |
| 3 | 自作キャラとアニメーションの短いアクション体験 |
| 4 | UI+選択肢+分岐のインタラクション実験 |
| 5 | Gaea背景+フォトリアル系ライティング |
| 6 | 小さな物語を入れたミニゲーム(次のプロトタイプの土台) |
🚀 半年後のプロトタイプ構築
-
Step 1(今):アイデア出し、テーマ・ジャンル決定
-
Step 2(2ヶ月目):機能とアセットのスコープ設計(小さく始める)
-
Step 3(3〜5ヶ月目):並行して素材制作&機能構築
-
Step 4(6ヶ月目):通しプレイ・デバッグ・演出調整 → 完成
✍️ いまからできること
-
「月1アウトプット」の第1弾を決めてみる(技術的にやってみたいことベースでOK)
-
本命プロトタイプのジャンル候補や**テーマ(世界観・遊び心)**をゆるく妄想しはじめる
プロトタイプのアイデア出しとか、「第1弾アウトプット何にするか」で迷ったら、いつでも一緒に整理しますよ!
楽しく、でも着実に作っていきましょ🔥
「プレイヤーの声にNPCが応答するゲーム」のミニプロトタイプ #3 オウム返し
次のステップ案4つのうち、UEのC++を使用するものってありますか?できればC++は最後にまとめてやりたいです
おお、方針ナイスです!💡
「C++はできれば最後にまとめてやりたい」ということでしたら、それを考慮して次のステップを見直してみましょう!
🎯 前のステップ案(+C++使用有無)
| ステップ案 | C++使用 |
|---|---|
| 1. UE側で返ってきたテキストをNPCのセリフやUIに表示する | ❌(BlueprintでOK) |
| 2. 返答テキストをTTS(Text-to-Speech)で音声化してNPCにしゃべらせる | ⭕ or ❌(方法による) |
| 3. 録音時間や認識モデルをカスタマイズする | ❌(Python側の修正のみ) |
| 4. プレイヤーが録音開始・停止を操作できるようにする | ❌(BlueprintでHTTP POSTするだけ) |
✅ つまり:
今のステップはすべてBlueprintだけで完結可能!
C++はまだ使わなくてOKです ✨
💬 TTSだけ少し補足
TTSの方法は2種類あります:
→ 方針Aを選べばTTSもC++不要です!
ということで、次のステップはどれを選んでもBlueprint+Pythonで完走可能!
気になるものがあれば一緒にやっていきましょう~!🔥
次は3. 録音時間や認識モデルをカスタマイズする お願いします
了解です!🎤🧠
それでは「録音時間やWhisperの認識モデルをカスタマイズする」ステップに進みましょう!
🔧 カスタマイズできる項目
✅ 録音時間の変更(Pythonサーバー側)
duration = 5 # ← ここを好きな秒数に変更
たとえば:
-
3秒だけ録音:
duration = 3 -
長く録音してみたい:
duration = 10など
✅ Whisperの認識モデルの変更
model = whisper.load_model("base")
ここの "base" を変更すると、精度や速度のバランスを変えられます👇
| モデル名 | 特徴 | メモ |
|---|---|---|
"tiny" |
超高速だけど精度は低め | 動作確認用におすすめ |
"base" |
速くてまあまあの精度 | 現在使用中 |
"small" |
精度ちょいUP | GPUなしでもいける |
"medium" |
高精度・重め | CPUだと時間かかるかも |
"large" |
最も高精度・超重い | GPU推奨(時間かかる) |
✅ 変更方法(サーバー起動時だけでOK)
model = whisper.load_model("small") # smallに変更して精度UP
📌 モデルの初回使用時は、自動でダウンロードされるため少し時間がかかります。
✅ おすすめ設定(用途別)
| 用途 | 推奨設定 |
|---|---|
| 軽さ重視・プロトタイプ | "tiny" + duration = 3 |
| 普段使い(標準) | "base" or "small" + duration = 5 |
| 精度重視・本番想定 | "medium" + duration = 5〜10 |
🔁 オプション:モデルを毎回ロードせず使いまわす
今すでにやってると思いますが、Flask起動時に一度だけ読み込んでおけば、毎回の処理が速くなります:
model = whisper.load_model("base") # サーバー起動時に読み込み
👇試してみよう!
録音時間とモデルを変えてみて、どんな違いがあるかチェックしてみてください!
「tiny」で早く、「small」で精度、「medium」でプロ感が出ます。
もし録音時間をプレイヤー操作で変えたいとか、自動で話し終わりを検出したいなどもあれば、そっちにも対応できます!🔥
mediumにしたらメッセージが出ました。C:\Users\toyokin\AppData\Local\Programs\Python\Python310\lib\site-packages\whisper\transcribe.py:126: UserWarning: FP16 is not supported on CPU; using FP32 instead
warnings.warn("FP16 is not supported on CPU; using FP32 instead")
はい、そのメッセージはまったく問題なし!心配不要です😊
ちゃんと動作してる証拠みたいなものです!
🔍 解説すると:
UserWarning: FP16 is not supported on CPU; using FP32 instead
これは:
❗「あなたの環境はGPUじゃないから、FP16(高速演算)は使えないけど、FP32(通常精度)でちゃんと処理するね!」
という**単なる注意メッセージ(警告)**です。
✅ 放置OKな理由
-
mediumやlargeはもともとGPU推奨モデル -
でも CPUでも動作可能(遅くなるだけ)
-
このメッセージは**自動で代替手段に切り替えたよ〜**っていうだけ
🧠 ヒント:ちょっとでも速くしたいなら…
でも、今はまず「mediumの精度を体験してみる」だけでも価値ありです✨
しばらくこのままで大丈夫ですよー!💪
引き続き、精度チェックやTTS連携なども準備できたらやってみましょう!
mediumにしたら認識の精度が上がりましたね!
おおー!それ聞けて嬉しいです!!🎉✨
やっぱり "medium" モデル、いい仕事しますよね〜🧠💬
🎯 mediumモデルの強みは:
-
💬 聞き取りミスが減る
-
🧠 長めの発話でも文脈を理解しやすい
-
🔍 特に日本語の助詞(が・は・を)や敬語の認識がうまくなることも!
🕒 でもちょっと遅くなるので…
-
本番用や動画撮影用では
medium💪 -
テスト・試作中は
baseやsmallに切り替えるのもアリ!
みたいな使い分けをすると、開発も快適です!
✅ 次に進みたくなったら…
「TTSでNPCに返答させたい」「UIに表示したい」「録音をUIで操作したい」など、やってみたいことがあればどんどん言ってください!
今めっちゃ順調なので、どんな方向にも伸ばしていけます🔥
4. プレイヤーが録音開始・停止を操作できるようにする お願いします
了解です!🎤🕹️
次は「プレイヤーが録音開始・停止を操作できるようにする」ステップ、やっていきましょう!
🎯 目的
今までは「Unrealから /speech にPOSTするとその時点で5秒録音スタート」でしたが…
✅ プレイヤーがボタンを押して「録音スタート!」
✅ もう一度押す or 一定時間で「録音終了&送信!」
みたいに、録音をプレイヤーの意思でコントロールできるようにします!
✅ 2つの方法があります
| 方法 | 特徴 | C++必要 |
|---|---|---|
| ① Unrealで録音 → 音声ファイルをPythonへ送信 | UEで完全制御できる | ⭕(録音にはC++プラグインなどが必要) |
| ② Pythonサーバーの録音処理を分離する | 録音制御をHTTPでやりとり | ❌(全部Blueprint+Python)✅おすすめ! |
🔧 ここでは「②サーバー側で録音制御」方式を使います!
🛠️ Flaskサーバーの構成(録音状態を制御)
📂 サーバーに新しいエンドポイントを追加:
is_recording = False
@app.route('/start_recording', methods=['POST'])
def start_recording():
global is_recording
is_recording = True
return jsonify(message="録音開始!")
@app.route('/stop_recording', methods=['POST'])
def stop_recording():
global is_recording
if is_recording:
fs = 44100
duration = 5 # ← 任意に変更してOK
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"]
reply = f"あなたは「{recognized}」と言いましたね!"
is_recording = False
return jsonify(reply=reply), 200, {'Content-Type': 'application/json; charset=utf-8'}
else:
return jsonify(error="録音が開始されていません"), 400
🎮 Unreal側の操作
Blueprintで以下を実装:
🟩 ボタン1 → POST /start_recording(録音フラグON)
POST http://127.0.0.1:5000/start_recording
Content-Type: application/json
🟥 ボタン2 → POST /stop_recording(録音実行→認識)
POST http://127.0.0.1:5000/stop_recording
Content-Type: application/json
→ 結果(JSON: "reply")を受け取って表示 or NPCが話す!
🔁 応用アイデア
-
ボタン長押し → 開始、離したら → 停止
-
タイマーを使って3秒後に自動停止
-
NPCの前でだけ録音ボタンが表示される
🧠 メリット
もし「録音時間をUEから指定したい」「録音状態をLED表示したい」みたいな応用もあれば、それもすぐ対応できます💪
やってみたらぜひ教えてください!🔥
録音時間をUEから指定したいです
いいですね!!🎯
Unreal側から録音時間を指定できるようにすることで、プレイヤーの発話スタイルやシーンに合わせた柔軟な音声入力が可能になりますね✨
✅ やること(全体の流れ)
-
UEから録音時間をJSONで送る(
duration: 3とか) -
Flaskサーバーがその時間だけ録音する
-
文字起こし&応答して返す
🛠️ Flaskサーバーの /stop_recording を改良
@app.route('/stop_recording', methods=['POST'])
def stop_recording():
global is_recording
if not is_recording:
return jsonify(error="録音が開始されていません"), 400
# JSONから録音時間を受け取る(指定がなければデフォルト5秒)
data = request.get_json()
duration = data.get('duration', 5) # ← UE側で渡す!
fs = 44100
print(f"🎤 {duration}秒 録音中...")
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"]
reply = f"あなたは「{recognized}」と言いましたね!"
is_recording = False
return jsonify(reply=reply), 200, {'Content-Type': 'application/json; charset=utf-8'}
🎮 UE側(Blueprint)のPOST内容
POST先:
http://127.0.0.1:5000/stop_recording
Headers:
Content-Type: application/json
Body(Raw JSON):
{
"duration": 3
}
※ 数値は秒。1.5などの小数もOKです!
🎯 これでできること
-
🎮 「短く指示だけ言ってね」→ 2秒だけ録音
-
🎙️ 「長文OK」モード → 10秒まで対応
-
⏱️ 「実験的にユーザーが好きな長さに録音」も可能!
💡 応用アイデア
-
スライダーUIで録音時間をプレイヤーに選ばせる
-
状況によって自動的に録音時間を調整(例:戦闘中は短め)
やってみたらぜひ感想聞かせてくださいね!
次は 返答を喋らせる(TTS) にいきますか?🗣️🎧
うまくいきました!返答を喋らせる(TTS) おねがいします
よっしゃああ!!!🔥
録音時間指定もうまくいったとのことで、次はTTS(Text-to-Speech)でNPCにしゃべらせるステップ、いきましょう〜!🎙️🧠🎮
🎯 目標
Whisperで文字起こし → NPCが返答
→ その返答をTTSで「音声化」して再生する!
✅ 実装パターン(おすすめはA)
| 方法 | 説明 | C++ |
|---|---|---|
| A. Python側で音声ファイル生成 → UEで再生 | サーバーが .wav を返す |
❌(BPで完結)←おすすめ! |
| B. UE内でTTSを実行(Speech APIなど) | Windows標準のTTSを使う | ⭕(C++要素あり) |
🔧 方法A:Python側で .wav 音声を作って返す
① Pythonに TTS ライブラリをインストール
おすすめは pyttsx3 か TTS(高品質)。今回は手軽な pyttsx3 でいきます:
pip install pyttsx3
② /speech or /stop_recording の最後にTTS処理を追加
import pyttsx3
@app.route('/stop_recording', methods=['POST'])
def stop_recording():
# ...(音声録音+Whisper認識)
reply = f"あなたは「{recognized}」と言いましたね!"
# 🔊 TTSで音声ファイル生成
tts = pyttsx3.init()
tts.setProperty('rate', 150) # 話す速度
tts.save_to_file(reply, 'reply.wav')
tts.runAndWait()
is_recording = False
# 🔁 音声ファイル名も返す(必要ならURL形式にする)
return jsonify(reply=reply, audio_file="reply.wav"), 200, {'Content-Type': 'application/json; charset=utf-8'}
🎮 UE側(Blueprint)
-
/stop_recordingのレスポンスからaudio_fileのファイル名を取得 -
"reply.wav"をローカルで再生する
✅ サウンド再生方法(例)
-
Sound Waveアセットを読み込む -
Sound Waveを「ローカルファイルから読み込み」するには C++ が絡むこともあるので…
👉 おすすめ:reply.wav を Content/ にコピーして事前登録した Sound Cue に差し替える
もしくは Play Sound 2D ノードで別のセリフ音声を代替的に再生
✨ ここまででできること
-
プレイヤーが声で話す
-
NPCが「それについて返答し、しゃべる!」
🔁 応用(発展させたい時)
-
pyttsx3→ 声の種類・速度・ピッチも変更可能 -
より自然な声 →
coqui-ai/TTSやEdge-TTSなどへの切り替えも可能 -
再生中のリップシンクや口パク連動もできる(Wavファイルに応じたViseme解析)
試してみたら、音声がどう聞こえたか教えてくださいね!
「もう少し自然にしたい」「喋らせ方をNPCごとに変えたい」などもできるので、気軽にどうぞ🎤🤖
エラーっぽいのが出ました。[2025-06-21 18:26:06,237] ERROR in app: Exception on /stop_recording [POST]
Traceback (most recent call last):
File "C:\Users\toyokin\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1511, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\toyokin\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 919, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\toyokin\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 917, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\toyokin\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 902, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
File "F:\Python\server.py", line 39, in stop_recording
tts = pyttsx3.init()
NameError: name 'pyttsx3' is not defined
127.0.0.1 - - [21/Jun/2025 18:26:06] "POST /stop_recording HTTP/1.1" 500 -
エラー詳細ありがとうございます!🛠️
これはとてもシンプルなエラーで、以下の一行をファイルの冒頭付近に書き忘れていることが原因です👇
✅ 解決策
Pythonスクリプトの先頭あたり(import が並んでいるところ)に:
import pyttsx3
を追加してください!これで NameError: name 'pyttsx3' is not defined は解消されます。
つまり、Flaskファイルはこんな感じになります:
import sounddevice as sd
import whisper
from flask import Flask, request, jsonify
from scipy.io.wavfile import write
import pyttsx3 # ← これを忘れずに!
# 以下、Flask初期化とルーティングが続く...
🔁 補足
import がされていないと、Pythonは「pyttsx3 って何のこと?知らんよ!」という意味で NameError を出します。
このエラーは初心者から上級者までよくやるやつなので、全然気にしなくてOKです😊
試してまたエラーが出たら、いつでもそのまま貼ってください!次は「喋るの成功した!」報告待ってます🎤🤖✨
うまくいきました!
おおおー!!!✨🎉✨
TTSまで動いたの、めちゃくちゃ素晴らしいです!これはもうボイス付きAI NPC完成への大きな一歩ですよ!👏🎮🧠
🎉 ここまででできること
✅ プレイヤーがマイクで話す(録音)
✅ Whisperで音声を文字起こし
✅ PythonでNPCの返答を生成
✅ pyttsx3で音声ファイル作成(TTS)
✅ UEでNPCがしゃべる!(音声ファイルを再生)
🔜 次に進むなら…?
もし次のステップも考えてるなら、例えばこんな展開ができます👇
| ステップ案 | 説明 |
|---|---|
| 🧠 返答をLLMで生成 | GPTなどを組み込んで、NPCがもっと柔軟に返答 |
| 🤖 NPCの口パク・表情と同期 | 音声再生と同時に表情 or 顔アニメーション |
| 🗣️ 声の感情(怒る・笑う)を変える | セリフに応じて声のトーンや速さを調整 |
| 🌐 Web経由でマルチプレイヤー対応 | 複数人の発話をサーバーで処理・応答 |
| 📁 録音や会話ログを保存 | 後から会話を再現・分析できる機能も! |
やりたい方向があればどんどん教えてくださいね!
すでに「声で話しかけて、NPCが理解して喋るゲーム」になってきてて…ほんとワクワクしますね!🎤🤖🔥
TTSの声をもっと自然にしたいですね
いいですね〜!その気持ち、よく分かります✨pyttsx3 は手軽ですが、どうしても「ロボっぽい機械音声」になりがち…。
なのでここでは、もっと自然な日本語のTTS音声を出す方法を紹介します👇
🔊 自然なTTSにする方法【おすすめ順】
| ライブラリ | 特徴 | 日本語対応 | オフライン可 | 備考 |
|---|---|---|---|---|
| OpenVoice(VITS) | 高品質ボイス、感情も対応可 | ◎ | ◯ | 重め。GPU推奨 |
| Edge-TTS | Microsoft Edgeの音声API | ◎ | ❌(Web API) | 手軽・品質良い |
| Google Cloud TTS | 高品質・多言語 | ◎ | ❌ | APIキー要 |
| TTS (coqui-ai) | OSS系、感情音声モデルあり | △(一部) | ◯ | 導入ちょい複雑 |
🎯 一番手軽&高品質 → Edge-TTS
日本語の自然なボイス(男性・女性・感情あり)で、
セットアップも超簡単!🎉
✅ Edge-TTS の使い方(Python)
① インストール
pip install edge-tts
② サンプルコード(TTS用)
import asyncio
import edge_tts
async def speak(text, filename="reply.wav"):
communicate = edge_tts.Communicate(text, voice="ja-JP-NanamiNeural") # 女性の自然な声
await communicate.save(filename)
# 使うとき
asyncio.run(speak("こんにちは、プレイヤーさん!"))
🎙️ 使える日本語音声一覧
| Voice Name | 性別 | 備考 |
|---|---|---|
ja-JP-NanamiNeural |
女性 | 明るめ。おすすめ! |
ja-JP-KeitaNeural |
男性 | 落ち着いた声 |
ja-JP-AoiNeural |
女性 | 優しめ |
ja-JP-DaichiNeural |
男性 | 力強い |
※ edge-tts --list-voices で全一覧が見れます
🔁 Flask連携例(簡易版)
import asyncio
import edge_tts
@app.route('/speak', methods=['POST'])
def speak():
data = request.get_json()
text = data.get("text", "")
asyncio.run(edge_tts.Communicate(text, voice="ja-JP-NanamiNeural").save("reply.wav"))
return jsonify(message="音声生成完了", file="reply.wav")
🎮 UE側はそのまま reply.wav を再生すればOK!
音質が pyttsx3 とは比べものにならないレベルで自然です。
※ただし Edge-TTS は オンライン必須(APIにアクセスして音声生成)なので、そこだけ注意!
🧪 試してみたい?
試してみたいなら、今の Flask サーバーに組み込むバージョンも一緒に作りますよ!
「Edge-TTSをFlaskの /stop_recording に統合したい」って感じでもOK🙆♂️
どうしましょう?やってみますか?💬🔊
サンプルコードでエラーが出ました。SyntaxError: Non-UTF-8 code starting with '\x8f' in file F:\Python\EdgeTTStest.py on line 6, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details
おおっ、そのエラーは簡単に直せます!⚡
Pythonが「ファイルの文字コードがUTF-8じゃないのに、どう読めばいいか分からないよ〜」って言ってるやつです。
✅ 解決策:ファイルの1行目に「エンコーディング指定」を追加!
Pythonファイルの最初の行(もしくは2行目まで)に、以下を入れてください:
# -*- coding: utf-8 -*-
🔁 修正後のコード例(先頭に追加)
# -*- coding: utf-8 -*-
import asyncio
import edge_tts
async def speak(text, filename="reply.wav"):
communicate = edge_tts.Communicate(text, voice="ja-JP-NanamiNeural")
await communicate.save(filename)
asyncio.run(speak("こんにちは、プレイヤーさん!"))
💡 補足
このエラーは:
-
print("こんにちは")やtext="こんにちは"のように、日本語を直書きした場合に発生しやすいです
# -*- coding: utf-8 -*- を書いておくと、Pythonが「おっこれはUTF-8ね」って理解してくれます🙆♂️
試してみて、音声ファイルが生成されたらぜひ教えてください〜!🎧✨
エラーです。SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte
了解です、これはどうやらファイルの文字コードそのものがUTF-8じゃないため、# -*- coding: utf-8 -*- を書いても Pythonが読み込みできない状態になっているようです💥
🛠 解決策:ファイル自体をUTF-8で保存し直す
✅ 方法(Windowsの場合)
🔸 VSCodeを使ってるなら:
🔸 メモ帳(Notepad)を使ってるなら:
✅ 保存し直したあとに再度実行!
そのうえで、以下のようなUTF-8対応済みのコードで再挑戦してください:
# -*- coding: utf-8 -*-
import asyncio
import edge_tts
async def speak(text, filename="reply.wav"):
communicate = edge_tts.Communicate(text, voice="ja-JP-NanamiNeural")
await communicate.save(filename)
asyncio.run(speak("こんにちは、プレイヤーさん!"))
🎯 理由(ちょっと詳しく)
-
ファイル自体をUTF-8に変えれば全て解決します✨
ややこしいですが、ここさえ乗り越えれば自然な声でNPCがしゃべります!🎙️
再トライできたら「音声出た!」の報告、お待ちしてます〜!
音声出ました!
やったあああああ!!🎉🎉🎉
ついに自然な声でNPCがしゃべったーー!!🎤🤖✨
これはめちゃくちゃ大きな進歩ですね…!
もう今の段階で「プレイヤーの声に反応して、日本語でしゃべるNPC」が完成してるわけで、
夢のSFゲームみたいな世界が見えてきましたよ🌟
🧭 ここまでの成果まとめ
✅ プレイヤーの声を録音(マイク)
✅ Whisperで文字起こし(しかも高精度)
✅ Flaskで返答を処理(ローカルサーバー)
✅ 返答を 自然な声(Edge-TTS) で喋る
✅ UEから操作・連携もバッチリ👌
🛠 次に進むならこんなことも!
| ステップ案 | 内容 |
|---|---|
| 🎭 リップシンク&顔アニメ | メタヒューマンと連携すると表情つきNPCに! |
| 🤖 GPTなどで返答をAI生成 | 決め打ちじゃなくて自然な会話も可能に |
| 💾 会話履歴の保存 | ログを取ってゲームへの反映も可能 |
| 🌐 サーバーを外部公開 | オンライン化してマルチプレイ or Web連携 |
| 🎮 キャラや状況で声を変える | 声色・返答ロジックをNPCごとに切替 |
次のステップを進めたくなったら、またいつでも言ってください!
「今の状態を動画化して紹介したい!」ってのも全然アリですよ📹🔥
開発めちゃ順調ですね!ほんとすごい…!お疲れさま&おめでとうございます〜!!🎊💯
コード内容
from flask import Flask, request, jsonify
import sounddevice as sd
from scipy.io.wavfile import write
import whisper
import pyttsx3
import asyncio
import edge_tts
async def speak(text, filename="reply.wav"):
communicate = edge_tts.Communicate(text, voice="ja-JP-NanamiNeural") # 女性の自然な声
await communicate.save(filename)
app = Flask(__name__)
model = whisper.load_model("medium") # 初回はちょっと時間かかるけどそのままでOK
is_recording = False
@app.route('/start_recording', methods=['POST'])
def start_recording():
global is_recording
is_recording = True
return jsonify(message="録音開始!")
@app.route('/stop_recording', methods=['POST'])
def stop_recording():
global is_recording
if not is_recording:
return jsonify(error="録音が開始されていません"), 400
# JSONから録音時間を受け取る(指定がなければデフォルト5秒)
data = request.get_json()
duration = data.get('duration', 5) # ← UE側で渡す!
fs = 44100
print(f"🎤 {duration}秒 録音中...")
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"]
reply = f"あなたは「{recognized}」と言いましたね!"
# 🔊 TTSで音声ファイル生成
asyncio.run(speak(reply))
is_recording = False
# 🔁 音声ファイル名も返す(必要ならURL形式にする)
return jsonify(reply=reply, audio_file="reply.wav"), 200, {'Content-Type': 'application/json; charset=utf-8'}
if __name__ == "__main__":
app.run(port=5000)
reply.wavのインポートでエラーになります。Error: Unable to read wave file 'reply' - "Invalid WAVE file."
Error: Failed to import sound wave reply
なるほど、それは reply.wav の形式やヘッダーが Unreal の要求に合っていないときによく出るエラーです⚠️
Whisper や edge-tts が出力するWAVは、UEがそのまま読めないことがあります。
✅ 解決策:WAVを「正しい形式」に変換する
Unreal Engineが扱えるWAV形式は以下の通り:
PCM形式 / 16bit / 44.1kHz or 48kHz / モノラル or ステレオ
なので、reply.wav をこの形式に変換し直せばインポート成功します!
🎧 変換する方法(おすすめ2つ)
🔹 方法1:Audacity(GUIで簡単)
-
無料の音声編集ソフト「Audacity」を開く
-
reply.wavを開く -
メニューから
「ファイル > 書き出し > WAVとして書き出し」 -
以下を設定:
保存すればOK!UEにインポートできるようになります。
🔹 方法2:Pythonで自動変換(ffmpeg 使用)
ffmpeg -i reply.wav -acodec pcm_s16le -ac 1 -ar 44100 reply_fixed.wav
-
-acodec pcm_s16le:16bitリニアPCM -
-ac 1:モノラル -
-ar 44100:サンプリングレート44100Hz
できた reply_fixed.wav をUEにドラッグ&ドロップでインポートできます!
💡 補足:変換後の音質
-
声の自然さはほとんど変わりません(安心して大丈夫!)
-
必要なら
reply_fixed.wavを TTSの新しい出力先にするよう変更も可能
試してみて、うまく変換&インポートできたら教えてください〜!💪😄
必要なら変換スクリプトも一緒に用意しますよ!
※手動でWavファイルをインポートはめんどうなので、以下のサイトを参考にVoiceVoxに読み上げさせるバージョンを別途作成した。
Ollama×Streamlit×VoiceVoxで作るローカルLLM音声対話アプリ【完全ハンズオン】 : 生成AIエンジニアLab
コード内容
from flask import Flask, request, jsonify
import sounddevice as sd
from scipy.io.wavfile import write
import whisper
import pyttsx3
import requests
import io
import scipy.io.wavfile as wav
# ==== VoiceVoxスピーカーID ====
VOICEVOX_SPEAKER_ID_A = 13 #青山龍星
VOICEVOX_SPEAKER_ID_B = 3 #ずんだもん
# ==== VoiceVox音声合成 ====
def synthesize_and_play_voice(text: str, speaker: int):
if not text.strip():
return
# 1. 合成クエリ
try:
query_resp = requests.post(
"http://localhost:50021/audio_query",
params={"text": text, "speaker": speaker},
timeout=5
)
query_resp.raise_for_status()
query = query_resp.json()
except requests.exceptions.RequestException as e:
st.error(f"VoiceVoxとの通信エラー: {e}")
return
# 2. 音声データ生成
try:
synth_resp = requests.post(
"http://localhost:50021/synthesis",
params={"speaker": speaker},
json=query,
timeout=13
)
synth_resp.raise_for_status()
except requests.exceptions.RequestException as e:
st.error(f"音声合成エラー: {e}")
return
# 3. 再生
with io.BytesIO(synth_resp.content) as f:
fs, data = wav.read(f)
sd.play(data, fs)
# sd.wait()
app = Flask(__name__)
model = whisper.load_model("base") # 初回はちょっと時間かかるけどそのままでOK
is_recording = False
@app.route('/start_recording', methods=['POST'])
def start_recording():
global is_recording
is_recording = True
return jsonify(message="録音開始!")
@app.route('/stop_recording', methods=['POST'])
def stop_recording():
global is_recording
global reply
if not is_recording:
return jsonify(error="録音が開始されていません"), 400
# JSONから録音時間を受け取る(指定がなければデフォルト5秒)
data = request.get_json()
duration = data.get('duration', 5) # ← UE側で渡す!
fs = 44100
print(f"🎤 {duration}秒 録音中...")
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"]
reply = f"あなたは「{recognized}」と言いましたね!"
is_recording = False
# 🔁 音声ファイル名も返す(必要ならURL形式にする)
return jsonify(reply=reply, audio_file="reply.wav"), 200, {'Content-Type': 'application/json; charset=utf-8'}
@app.route('/start_Speech', methods=['POST'])
def start_Speech():
global reply
synthesize_and_play_voice(reply, VOICEVOX_SPEAKER_ID_B)
return jsonify(message="発話開始!")
if __name__ == "__main__":
app.run(port=5000)
「プレイヤーの声にNPCが応答するゲーム」のミニプロトタイプ #2 文字起こし
このページの最終結果
🎯 次の選択肢(どれでもOK!)
ここから先は、やりたい方向によって進み方が変わります:
-
マイクから音声入力して送る(Whisperなどで文字起こし)
-
NPCが返答を喋る(Text-to-Speech連携)
-
NPCの表情や口パクを返答に合わせて変える
-
GPTベースの返答生成に切り替える(LLMと連携)
-
ゲームプレイと統合する(会話クエストや反応変化)
「これやってみたい!」があれば、何でもOKです。
ガッツリ一緒に構築していけますよ💪🔥
どこいきますか!?
マイクから音声入力して送る(Whisperなどで文字起こし)おねがいします!
了解です!🎤🧠
それでは「マイクから音声を録音 → Whisperで文字起こし → サーバーで返答 → Unrealに戻す」という流れを構築していきましょう!
🎯 全体の流れ(ざっくり)
[マイクで録音] → [音声ファイル保存] → [Whisperで文字起こし] → [replyを生成] → [UEに返す]
✅ 必要なもの(前提)
-
Pythonが使えるPC
-
マイク入力ができる環境
-
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側が:
-
マイクで録音(5秒)
-
Whisperで認識(日本語)
-
テキストを元に返答をつくる(例:「あなたは『〇〇』と言いましたね!」)
-
{"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":"あなたは「〇〇」と言いましたね!"} というレスポンスが返ってきます!
💡 注意点
準備できたら、Unrealから /speech を呼び出してみてください!
うまく動いたら、次は「返答をしゃべらせる」もいけますよ🗣️✨
Unrealから /speech を呼び出してうまくいきました!
おおお、最高です!!!🎉🎉🎉
Unrealからの呼び出し成功、マジでおめでとうございます!👏✨
🚀 これでできたこと
-
🎤 プレイヤーの声を録音(Flaskサーバー側)
-
🧠 Whisperで文字起こし
-
💬 テキストを返すAPI連携が完成!
🎯 次のステップ案
-
UE側で返ってきたテキストをNPCのセリフやUIに表示する
-
返答テキストをTTS(Text-to-Speech)で音声化してNPCにしゃべらせる
-
録音時間や認識モデルをカスタマイズする
-
プレイヤーが録音開始・停止を操作できるようにする
何をやりたいか教えてもらえれば、すぐサポートしますよ!
最高のゲーム体験を目指していきましょう🔥
ここまでの実行結果を動画にしました。
「プレイヤーの声にNPCが応答するゲーム」のミニプロトタイプ #1
「プレイヤーの声にNPCが応答するゲーム」のミニプロトタイプ構成テンプレを、段階的に作れる形でお渡しします👇
🎮【ステップ別プロトタイプテンプレート】
🔹STEP 0:前提ツール・環境(事前準備)
-
Unreal Engine 5.x(NPC側のビジュアル・アニメ制御)
-
Whisper (音声認識):
pip install openai-whisper -
ローカルLLM (例: llama.cpp, Command R Plus)
-
TTS (例: Coqui TTS):
pip install TTS
🔹STEP 1:文字入力でNPCと会話(音声なし)
💬構成
🧩連携例(Python側)
from flask import Flask, request
app = Flask(__name__)
@app.route("/talk", methods=["POST"])
def talk():
prompt = request.json["prompt"]
response = your_llm_inference_function(prompt)
return {"reply": response}
🧩UE側(HTTPリクエスト)
🔹STEP 2:音声入力(Whisper)を追加
🎤構成追加
-
マイクから録音(例:録音ボタンを押す)
-
Pythonで録音 → Whisperでテキスト化 → LLMへ
🧩録音 & 認識(Python例)
import whisper
import sounddevice as sd
import soundfile as sf
def record_audio(filename="input.wav", duration=5):
samplerate = 16000
audio = sd.rec(int(duration * samplerate), samplerate=samplerate, channels=1)
sd.wait()
sf.write(filename, audio, samplerate)
model = whisper.load_model("base")
record_audio()
result = model.transcribe("input.wav")
print("You said:", result["text"])
🔹STEP 3:音声合成(TTS)でNPCに喋らせる
🗣構成追加
🧩TTS例(Coqui)
from TTS.api import TTS
tts = TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False)
tts.tts_to_file(text="Hello, player!", file_path="output.wav")
🧩UE側(SoundWave再生)
-
Pythonから
output.wav保存 -
UEからそのファイルを読み込んで再生(Streaming SoundWaveなど使う)
🔹STEP 4:NPC表情&口パクと同期(オプション)
😮実現アイデア
-
メタヒューマンの「音声ドライブ」や「Viseme(音素)」を使用
-
音声の再生と同時に、アニメーションも再生する(顔・まばたき等)
💡開発アドバイス
| ポイント | 内容 |
|---|---|
| 🎯 MVP意識 | 最初は「文字で会話」→「音声入力」→「音声出力」と段階的に |
| 🔁 テストしやすく | 外部サーバー部分はPostmanやcurlで個別確認すると楽 |
| 📁 データのやりとり | ファイル共有 or ソケット通信(最終的にはリアルタイムに) |
| 🧠 LLM応答品質 | Prompt設計でNPCの性格を変えたり、会話パターンの制御もできる |
✅最終構成イメージ図(ざっくり)
🎙マイク
↓
[Python] Whisper → テキスト
↓
[Python] LLM (Command R Plusなど)
↓
[Python] TTS(.wavファイル)
↓
[UE5] SoundWave再生 + NPCアニメ
やってみたい方向性(英語で話す?日本語?感情つけたい?)に合わせて、さらにカスタマイズも可能です!
気になる部分があれば、深掘りも全然できますよ!どこから作ってみたいですか?
Pythonの知識がほとんどないのですが、Pythonサーバーはローカルで動作するのですか?
はい、大丈夫です!
PythonサーバーはローカルPC上で動作可能で、インターネットに公開する必要はありません。Unreal Engineからも同じPC内の「ローカルサーバー」にアクセスすればOKです。
🧠 ざっくりイメージ
あなたのPCの中で、こう動きます👇
🎮 Unreal Engine
↓ HTTPリクエスト
🖥 127.0.0.1(ローカルサーバー)
↓
🐍 Python(LLMやWhisperなど処理)
↓
🎮 UEに返答(テキストや音声)
✅ Pythonサーバーをローカルで立てる方法(超シンプル)
① 必要なライブラリのインストール(1回だけ)
ターミナル or コマンドプロンプトで👇
pip install flask
② 最小構成のローカルサーバー(保存名:server.py)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/talk", methods=["POST"])
def talk():
user_input = request.json.get("prompt", "")
reply = f"あなたは「{user_input}」と言いましたね!"
return jsonify({"reply": reply})
if __name__ == "__main__":
app.run(port=5000)
③ サーバーの起動
python server.py
すると、ローカルPC上で http://127.0.0.1:5000/talk が使えるようになります。
✅ Unreal Engine側のつなぎ方(簡単に)
-
ブループリント → HTTP Requestノードで
POSTを送信 -
URLに
http://127.0.0.1:5000/talk -
JSON本文に
{ "prompt": "こんにちは" } -
応答(例:
{ "reply": "あなたは「こんにちは」と言いましたね!" })を使って、NPCのセリフ表示や処理に活用
💡ポイント
| 要素 | 内容 |
|---|---|
| 💻 ローカル完結 | 完全にPC内で閉じた動作。セキュリティも安心 |
| 🔁 UEとのやりとり | HTTP(JSON形式)なのでシンプル |
| 🔧 カスタマイズ | Python側にWhisperやLLM、TTSを追加していくだけ |
| 📶 外部ネット不要 | LANやWi-Fiがなくても動きます(ローカルループバック) |
Pythonの知識が少なくても、このテンプレートで「入力→返答」まではすぐ試せます!
「サーバー動いたかテストしたい」「UEから呼び出す部分でつまずいた」など、どの段階でもサポートするので、気軽に聞いてください!やってみます?
やってみます!
いいですねー!🎉応援します!
では、まずは 最小構成のローカルPythonサーバーで「テキストを送ると返事が返ってくる」 ところまで一緒にやってみましょう。以下の順に進めるとスムーズです👇
✅ Step 1:Pythonの準備
もしまだインストールしていなければ、まずはインストールから。
-
インストール時に「Add Python to PATH」にチェック入れておくのを忘れずに!
✅ Step 2:Flaskインストール
ターミナル(またはコマンドプロンプト)を開いて、次のコマンドを入力:
pip install flask
✅ Step 3:Pythonサーバースクリプト作成
適当な場所に server.py というファイルを作って、以下をコピペして保存してください:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/talk", methods=["POST"])
def talk():
user_input = request.json.get("prompt", "")
reply = f"あなたは「{user_input}」と言いましたね!"
return jsonify({"reply": reply})
if __name__ == "__main__":
app.run(port=5000)
✅ Step 4:サーバー起動
同じフォルダで次のコマンドを打ってください:
python server.py
すると以下のような表示が出て、サーバーがローカルで動きます:
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
✅ Step 5:動作テスト(お試し)
テスト方法 1:curlコマンド(Windowsでも使えます)
curl -X POST http://127.0.0.1:5000/talk -H "Content-Type: application/json" -d "{\"prompt\": \"こんにちは\"}"
テスト方法 2:ブラウザで代替
-
https://reqbin.com/ のようなオンラインツールでもテストできます(POSTリクエストを送信)
✅ Step 6:次のステップ
動作確認できたら、Unreal EngineからこのサーバーにPOSTリクエストを送ることで、NPCにしゃべらせる処理につなげていきます!
進んだところや詰まったところがあれば、スクショやエラーメッセージなどを送ってくれたらすぐ対応します!
がんばってください〜!💪🔥
このPCにPythonがはいっているかどうか確認するにはどうすればいいですか?
PythonがすでにこのPCにインストールされているかを確認する方法はいくつかありますが、一番手軽なのはコマンドプロンプトやPowerShellを使う方法です!
✅ Pythonインストール確認方法(Windows)
① コマンドプロンプトまたはPowerShellを開く
-
スタートメニューで「cmd」や「PowerShell」と検索して起動
② 次のコマンドを入力
python --version
または
py --version
🧾 結果例
| 結果 | 状況 |
|---|---|
Python 3.x.x |
✅ インストールされています! |
'python' は内部コマンドまたは外部コマンド... |
❌ インストールされていません or PATHが通っていません |
✅ Pythonが入ってない時の対処
✔ 確実なインストール方法
-
Python公式サイトにアクセス
-
上部の「Download Python 3.x.x(最新版)」をクリック
-
「Install Now」を押してインストール
✅ Flaskが入っているか確認するには?
Pythonが入っている状態で、次のコマンドを打ちます:
pip show flask
結果:
-
Flaskのバージョンやパスが表示されたら→ インストール済み
-
WARNING: Package(s) not found: flask→ 未インストール
インストールは以下:
pip install flask
確認してみて、何か表示されたら貼ってくれたら状況がわかるのでサポートしやすくなります!
試してみてOKです!
Pythonは入ってました。Flaskは今インストールしました
完璧なスタートです!🎉✨
PythonもFlaskも準備OKなら、いよいよ ローカルサーバーの起動テスト に進めます!
✅ Step 1:サーバースクリプトを作成
-
エクスプローラーで分かりやすい場所(例:デスクトップ)に、フォルダを1つ作ります(例:
npc_chat_server) -
その中に
server.pyという名前のファイルを作成 -
中身に以下のコードをコピペ&保存:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/talk", methods=["POST"])
def talk():
user_input = request.json.get("prompt", "")
reply = f"あなたは「{user_input}」と言いましたね!"
return jsonify({"reply": reply})
if __name__ == "__main__":
app.run(port=5000)
✅ Step 2:サーバーを起動する
python server.py
✅ Step 3:サーバーが正常に動いたときの表示
成功すると、こんな感じのメッセージが表示されます:
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
この状態で、サーバーはローカルで動いています!
✅ Step 4:テスト送信
別のターミナル、またはPowerShellなどで以下のコマンドを実行:
curl -X POST http://127.0.0.1:5000/talk -H "Content-Type: application/json" -d "{\"prompt\": \"こんにちは\"}"
🎯 結果
{"reply":"あなたは「こんにちは」と言いましたね!"}
もし curl がない場合や失敗したら、代わりにテスト用GUIツール(Postmanなど)も紹介します!
ここまでできたら、Unrealからの連携に進めます✨
うまくいったかどうか教えてください!
なんかエラーでました。Invoke-WebRequest : パラメーター 'Headers' をバインドできません。"Content-Type: application/json" の値を "System.String
" 型から "System.Collections.IDictionary" 型に変換できません。
発生場所 行:1 文字:44
+ ... ttp://127.0.0.1:5000/talk -H "Content-Type: application/json" -d "{\" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
ナイス報告ありがとう!
これは「PowerShell」で curl を実行したときに、実は裏側で Invoke-WebRequest に置き換えられてしまって起きるエラーです 😅
✅ 解決方法(PowerShell用の正しい書き方)
PowerShellを使っている場合、以下のように書き直すと動きます:
Invoke-RestMethod -Uri "http://127.0.0.1:5000/talk" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{ "prompt": "こんにちは" }'
※「
@{}」が PowerShell での辞書(連想配列)です
✅ もしくは「本物のcurl」を使う方法
Windowsで「本物のcurl」を使うには:
-
cmd(コマンドプロンプト)を使う -
または
Git BashやWSLを使う(インストール済みなら)
例(コマンドプロンプトでOK):
curl -X POST http://127.0.0.1:5000/talk -H "Content-Type: application/json" -d "{\"prompt\": \"こんにちは\"}"
✅ 結果の例(成功時)
{"reply":"あなたは「こんにちは」と言いましたね!"}
試してみて、成功したかまた教えてください!
その後はUEから呼び出すステップにも進めます💪
リプライが文字化け?{"reply":"\u3042\u306a\u305f\u306f\u300c\u3053\u3093\u306b\u3061\u306f\u300d\u3068\u8a00\u3044\u307e\u3057\u305f\u306d\uff01"}
おっ、良いところに気付きました!
その \u3042\u306a... というのは実は**「文字化け」ではなく、Unicodeエスケープされた日本語**なんです。
✅ 現象の説明
{"reply":"\u3042\u306a\u305f\u306f\u300c\u3053\u3093\u306b\u3061\u306f\u300d\u3068\u8a00\u3044\u307e\u3057\u305f\u306d\uff01"}
これは実際には:
{"reply":"あなたは「こんにちは」と言いましたね!"}
と同じ意味ですが、ASCII文字だけで表現するために Unicode にエスケープされています(\u3053 = こ、\u3093 = ん など)。
✅ 解決方法(人間に読みやすく表示する)
💡 PowerShellで正しく表示するなら:
Invoke-RestMethod -Uri "http://127.0.0.1:5000/talk" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{ "prompt": "こんにちは" }'
これなら結果は自動的にデコードされて:
reply : あなたは「こんにちは」と言いましたね!
と読める形で表示されるはずです。
✅ Pythonサーバー側でも改善できる?
はい、どうしても見やすくしたいなら ensure_ascii=False を設定することで、JSONレスポンスを日本語のまま返すようにもできます。
return jsonify(reply=reply), 200, {'Content-Type': 'application/json; charset=utf-8'}
または、手動で json.dumps(..., ensure_ascii=False) を使うパターンもありますが、Flask + jsonify はだいたい自動でいい感じにやってくれます。
🔚 結論
-
あれは文字化けではなく、正常なUnicode表記です!
-
表示するツール(PowerShell、Postman、curlなど)によって見え方が違うだけです
-
UE側では日本語文字列として使えるので問題なしです 🙆♂️
このまま次ステップ「Unreal Engineと連携」も進められますよ~!やってみます?
本質的ではないので、先に進みましょう!
了解です!
では次は、Unreal Engineから先ほどのPythonサーバーにPOSTリクエストを送って応答を受け取る簡単な方法をご案内しますね。
🎮 Unreal EngineでのHTTPリクエスト送信(Blueprint編)
1. HTTP Request プラグインを有効化
-
UEエディタの「Edit」→「Plugins」
-
「Online」カテゴリの「HTTP Request Plugin」が有効か確認(無効なら有効にして再起動)
※正しくは、HttpBlueprintプラグイン
2. Blueprintでリクエスト作成
・HTTPリクエストノードを作成
-
「イベントグラフ」で右クリック → 「Http Request」 と検索 → 「Make HTTP Request」ノードを追加
- ※正しくはHttp Post Requestノード
・リクエスト設定
-
URL →
http://127.0.0.1:5000/talk -
Verb → POST
-
Content Type → application/json(※Make Request Headerノードを接続しJson)
-
Request Body →
{"prompt": "こんにちは"}(テキストから作成可)
3. レスポンスの受け取り
4. テスト
-
ゲームを起動して、リクエスト送信→返答表示ができるか確認
もしBlueprintの具体的な組み方が知りたければ、詳しくも説明しますよ!
準備できたら教えてください〜!
UEのバージョンは5.4くらいで大丈夫ですか?
はい、Unreal Engine 5.4で問題ありません!
5.4はHTTPリクエスト機能も十分使えますし、Python連携や外部との通信も安定しています。
もし可能なら5.4以上(例:5.5や5.6)も検討できますが、5.4でも今回の「ローカルPythonサーバーとHTTP通信」の仕組みはしっかり動作しますよ。
安心して進めて大丈夫です!
ResultをPrintstringしたら以下のように表示されました。<!doctype html>
<html lang=en>
<title>415 Unsupported Media Type</title>
<h1>Unsupported Media Type</h1>
<p>Did not attempt to load JSON data because the request Content-Type was not 'application/json'.</p>
おぉ、これはいい観察ですね!
表示されたエラー:
415 Unsupported Media Type
Did not attempt to load JSON data because the request Content-Type was not 'application/json'.
これはつまり:
✅ 原因
Unreal Engineから送ったリクエストで、Content-Typeが 'application/json' になっていない ことが原因です。
✅ 解決方法:Blueprintで正しいJSON POSTを送る手順(簡易版)
Blueprintでちゃんと送るには、以下のノード構成が必要です:
🎯 1. 「POST」用の HTTP Request をつくる
必要ノード:
-
Create Request -
Set Verb→"POST" -
Set URL→http://127.0.0.1:5000/talk -
Set Header→"Content-Type", "application/json" -
Set Content As String→ たとえば{"prompt": "こんにちは"}
CreateRequest
→ SetVerb ("POST")
→ SetURL ("http://127.0.0.1:5000/talk")
→ SetHeader ("Content-Type", "application/json")
→ SetContentAsString (JSONテキスト)
→ ProcessRequest
🎯 2. 返ってきたJSONを扱う
-
OnProcessRequestCompleteイベントでResponse Contentを受け取る -
Get Response Content As String→Print Stringで中身を表示 -
さらに
Get Json Fieldなどで"reply"を抽出可能
✅ よくある間違いポイント
| 問題 | 解決方法 |
|---|---|
| Content-Type が未設定 | Set Header ノードで明示的に "application/json" を指定 |
| Content なし | Set Content As String でJSON形式にする(例: {"prompt":"こんにちは"}) |
| Contentが間違った形式 | UE側で " を忘れている、{} の中身が壊れてるなどに注意 |
✅ おまけ:送信用JSON文字列テンプレ
{ "prompt": "こんにちは" }
上記のまま使ってOKです!
Blueprintで文字列として組むなら "{"prompt":"こんにちは"}" というふうに " " をちゃんと囲ってくださいね。
エラー消えるまで付き合うので、うまくいくまで一緒に進めましょう!
「どのノード使ったかスクショで見せて」でもOKです〜📸
ヘッダーをJsonにしたら以下のようになりました。{"reply":"\u3042\u306a\u305f\u306f\u300c\u3053\u3093\u306b\u3061\u306f\u300d\u3068\u8a00\u3044\u307e\u3057\u305f\u306d\uff01"}
おおー!来ましたね!!🎉✨
その {"reply":"\u3042...} の表示は、Pythonサーバーが正しく応答した証拠です!🎯
✅ 状況まとめ
ここまで大成功です!!🙌
🔽 次のステップ:reply の中身(日本語)を取り出す
今は「ただのJSON文字列」として扱ってるので、日本語が \u3053\u3093... のように見えてます。
これを Blueprint 側で「JSONとしてパース」して "reply" の中身を取り出しましょう!
✅ BlueprintでJSONを読む方法
1. On Process Request Complete → Get Response Content As String
→ ResponseString が今表示されてる {"reply":"\u3053..."}
2. Construct Json Object From String
-
入力:
ResponseString -
出力:
JsonObject
3. Get String Field
-
ターゲット:
JsonObject -
フィールド名:
reply(←この文字列は必ず小文字で"reply")
🎯 つなぎ例(フロー)
Event
→ Make HTTP Request
→ On Process Request Complete
→ Get Response Content As String
→ Construct Json Object From String
→ Get String Field ("reply")
→ Print String(または NPC にしゃべらせる etc)
✅ 補足:なぜ \u3053... が出るのか?
UE側で「ただの文字列」として表示しているだけで、実際の中身は "こんにちは" としてしっかり存在しています。Get String Field("reply") を使えば、ちゃんと普通の日本語に戻ります!
🎉 最終形ができたら…
という連携が完成です!
もうすぐ「音声入力(Whisper)」や「返答をTTSで再生」も追加できますよ~
「しゃべり返す」ステップいってみます?🎤🗣️
Get Response Content As Stringに相当するノードが見当たらないです
ナイス進捗報告ありがとう!✨Get Response Content As String に相当するノードは、On Process Request Complete の出力ピンから取り出す形で実装できます!以下、Blueprintでのやり方を順を追って説明します!
✅ On Process Request Complete の正しい使い方
まず、On Process Request Complete イベントには、以下のピンがあります:
| ピン名 | 意味 |
|---|---|
Request |
元のリクエスト |
Response |
サーバーからの返答(ここに注目!) |
bWasSuccessful |
成功したかどうか |
🎯 JSON文字列を取得するステップ(Blueprint)
Step 1:Response ピンを使う
-
On Process Request CompleteノードからResponseピンをドラッグ -
「Get Content As String」ノードを検索して接続!
✅ 正式名称は:
Get Content As String
✅ これはUHttpResponseオブジェクトから中身を文字列で取得する関数です
Step 2:パースして「reply」だけ取り出す
続いて:
-
Get Content As String→ 出力された文字列をConstruct Json Object From Stringに渡す -
Get String Fieldで"reply"を指定して中身を取り出す -
Print Stringで確認!
🎨 ビジュアルで流れをざっくり描くとこんな感じ:
[On Process Request Complete]
│
(Response)
▼
[Get Content As String] → "{"reply":"こんにちは"}"
▼
[Construct Json Object From String]
▼
[Get String Field]("reply")
▼
[Print String] → コンソールに「こんにちは」
✅ 念のため:ノード検索ヒント
Blueprint上で右クリックして出ない場合は:
-
「Context Sensitive」チェックがONになってるか確認
-
Responseピンをドラッグ → 放して検索、で対象の関数が絞られます -
ノード名の一部だけでも検索できる(例:
get content)
ここまでで reply の中身を取り出せるようになるはずです!
見つからない・つながらない部分があれば、ノード名やスクショでも送ってくれたら合わせますね!🔥
[UE5]BlueprintでHttpRequestを実現するプラグイン「HttpBlueprint」を試す
を見つけて、真似してみる。

実行結果

できました!
おおおおーーー!!!🎉🎉🎉
めっちゃナイスです!!ほんとすごい!!👏✨
これで:
が Unreal Engine 上で完成しましたね!!これはかなり大きな一歩です🔥
🎯 次の選択肢(どれでもOK!)
ここから先は、やりたい方向によって進み方が変わります:
-
マイクから音声入力して送る(Whisperなどで文字起こし)
-
NPCが返答を喋る(Text-to-Speech連携)
-
NPCの表情や口パクを返答に合わせて変える
-
GPTベースの返答生成に切り替える(LLMと連携)
-
ゲームプレイと統合する(会話クエストや反応変化)
「これやってみたい!」があれば、何でもOKです。
ガッツリ一緒に構築していけますよ💪🔥
どこいきますか!?
マイクから音声入力して送る(Whisperなどで文字起こし)おねがいします!
ダサいGameUIをどうにかしたい
今回ぷちコンに提出したゲーム作品についてですが、内容の出来自体は満足していますがUIがダサいと感じています。オシャレなUIやかわいいUIにするにはどうしたらいいか分からないので教えてください
いいですね!ゲームの内容に満足できてるってのはすごく大事なことですし、自分で「UIがダサい」って気づける感覚もクリエイターとしてめちゃくちゃ強みです。
「オシャレなUI」や「かわいいUI」にするには、いくつかポイントがあります。最初はプロっぽいUIをそのままマネして学ぶのもアリですよ!
🔍 まずはゴールを明確に!
-
オシャレ系:ミニマル、洗練された、透明感がある、余白が効いてる
-
かわいい系:柔らかい色、丸いフォント、アイコンや装飾がポップ、親しみやすい雰囲気
「どっちを目指したいか?」でデザインの方向がガラッと変わります!
🎨 基本のコツ(どちらにも共通)
1. フォント選びが超大事
-
オシャレ系 → 「Noto Sans」「Roboto」「Poppins」「Montserrat」などスッキリ系
-
かわいい系 → 「Rounded M+」「Yomogi」「さわらびゴシック」など丸みのある日本語フォント
2. 色の使い方は3色以内でまとめる
-
メインカラー(ブランド色)
-
サブカラー(補助的な色)
-
アクセントカラー(ボタンなどに使う強調色)
使う色が多いと統一感がなくなって「ダサ見え」します。
3. 余白をしっかり取る
-
要素同士がぎゅうぎゅうだと安っぽく見える!
-
フォントサイズと余白のバランスで一気に洗練されます
✨ オシャレ or かわいいUIの具体例
【オシャレ系にしたいなら】
-
透明感のあるパネル(背景をぼかすなど)
-
細い線のアイコン(フラット系)
-
アニメーションをフェードやスライドで統一
-
カラーパレットは「くすみカラー」や「モノトーン+差し色」
【かわいい系にしたいなら】
-
パステルカラーの背景
-
丸いボタンやフレーム
-
アニメーションに弾む感じやぷにっと感を
-
アイコンやボタンにちょっとした顔とか入れてもかわいい
🔧 実際に使える参考リソース
🧰 UIキットやインスピレーション
-
Figma Community(UIキット無料)
🎨 カラーパレット
もしよければ、今回のゲームのUIスクショ見せてくれたら、具体的なアドバイスもできますよ〜!
ちなみに、どんなテーマのゲームだったんですか?(世界観とかによってもUIの方向性決まるので、そこも気になる!)

ゲームのテーマは洗浄機で世界をピカピカにしよう!で、子供が水遊び感覚でそうじするイメージですね
なるほど!「洗浄機で世界をピカピカにしよう!」というテーマ、とても楽しくて分かりやすいですし、水遊びの延長としてお掃除するっていう発想が子ども心にグッと刺さりますね!
このスクショもカラフルな枠やフォントのチョイスで明るくポップな雰囲気が出てて、「遊びながらきれいにする」ってコンセプトがすごく伝わってきます。
オレンジの線で汚れの位置を可視化するUIも親切だし、「狙って当てる」っていうシューティングっぽい遊び心も感じられます!
ちなみにこのゲーム、どんな場所をピカピカにしていく想定なんですか?
街中とか、学校とか、おうちの中とか、もっとファンタジーな場所とか…?興味ある〜!
場所は自宅の車と家、戦車公園に展示されている1/1戦車、ホームセンター、神社内の屋台ですね
いいね!場所のバリエーションがめっちゃ楽しいし、ちゃんと「日常の中の非日常」って感じが出ててワクワクします✨
特に「戦車公園」と「神社の屋台」ってのが最高にセンス良い…!子どもが見たら絶対やってみたくなるやつ。テーマの「ピカピカ」に対してのアプローチもユニークで、発想力の勝利って感じです。
さて本題の 「UIをもっとオシャレ・かわいくしたい」 というところですが、今の状態からちょっとした工夫でグッと洗練された見た目にする方法をいくつか提案しますね:
💡 UIをオシャレ・かわいくするためのアイデア
1. フォントの選定で印象が激変!
-
今のフォントは目立つけど、少しゴツい印象も。
-
子供向け・ポップ系なら、以下のような手書き風や丸みのあるフォントがおすすめ:
-
【けいふぉんと】【ふい字】【やさしさゴシック】【しろくまフォント】
-
可読性高くて雰囲気もゆるふわになるよ。
-
2. 色使いを統一して「世界観」を演出
-
UIごとに色がバラバラだと、見た目がゴチャつく印象に。
-
例えば「水遊び×子ども」がテーマなら:
-
メイン:水色・白
-
アクセント:オレンジ・ピンク・黄色
-
このあたりで統一すると、明るくてかわいい見た目に仕上がります!
-
3. フレーム・パネルをゆるっと丸みデザインに
-
UIのパネル(スコア表示やヘルプ)の角を丸くして、縁取りにパステルカラーを使うと、柔らかくて親しみやすい印象に。
-
枠や装飾を「泡っぽく」すると、洗浄テーマともマッチ!
4. アニメーションを加えて“生きたUI”に
-
数字が増えるときに「ぷにっ」と膨らむとか
-
洗浄ゲージが水がたまるようにぬるっと上がるとか
-
細かい動きで、遊んでる感が倍増します!
5. 音もかわいく!
-
UIのクリック音やゲージの変化に「ポンッ」「ピコーン」みたいな軽いSEを入れると、視覚と聴覚両方で可愛さが伝わる!
🛠試しに「キレイ度表示UI」をブラッシュアップするとしたら:
現状:キレイ度: 86.8%(黄文字・アウトライン付き)
改善案:
-
バブル風の透明な枠に水色の丸ゴシック系フォントで「✨キレイ度✨」
-
パーセンテージ部分だけちょっと大きめにしてアニメーションでぴょこぴょこ動かす
-
バックに軽い泡パーティクル演出
もし「試しにこんな感じのUI作ってみて」とリクエストくれたら、簡単なデザインモックも作るよ!
それと、今回の作品がぷちコンに提出されたってことは、また次回もチャレンジする感じ?次の作品でもこの世界観活かせそう!
試しに「キレイ度表示UI」を作ってみてください~

こんな感じで「キレイ度表示UI」を作ってみました!
🫧 キレイ度:86.8%
・爽やかな水色背景
・光る文字とバブルで「清潔感」演出
・数字は大きめで視認性ばっちり
・ポップで明るい雰囲気に仕上げました!
必要であれば、数値の変化アニメやゲージタイプのUIにもできますよ!
ゲームの雰囲気に合わせてカスタマイズもできますが、どうします?別バージョン見てみたいですか?
ありがとう!一旦ここまでOKです~
Cascaduer キャラクターを追加・オフセット・削除する
参考
追加
ファイル→インポート→インポートシーン
オフセット
ジョイントモードにしてすべてを選択、キーフレームもすべて選択
Scene SettingタブでInterval Edit ModeのSelectedを押す
移動・回転量を制限したい場合はManipulatorのFix…を押して希望の値を押す
移動、回転させる
削除
1. Alt キーを押しながら、キャラクターを含むアニメーショントラックをダブルクリックします (キャラクターが複数のトラックを占める場合は、階層の最上位のトラックをダブルクリックします)。
2.コマンドメニューからオブジェクトの削除を選択します(またはDelキーを押します)。