技術検証
OpenAIの音声合成とESP32連携で、家電が喋り出す!
投稿日:2025年05月15日
はじめに
第4話では、ESP32とPythonサーバーにOpenAIの音声合成(TTS)機能を組み込み、赤外線リモコン操作に音声インターフェースを追加します。
これにより、家電の操作内容を喋ったり、Webから送ったメッセージを即座に音声で再生したりすることができるようになります。
音声合成の仕組み
今回使用するのは、OpenAIの text-to-speech
エンドポイント:
-
? 入力テキストを送信
-
? mp3形式の音声で返却
-
? mp3をサーバーにキャッシュ保存(ハッシュ化)
-
▶️ ブラウザで即再生
音声合成に必要なもの
OpenAI API
-
アカウント登録(https://platform.openai.com)
-
APIキーの取得
-
課金設定の有効化(無料枠あり)
Python用ライブラリ
-
requests
(HTTPリクエスト用) -
hashlib
(キャッシュキー生成)
MQTT連携と再生処理
MQTTで受け取った inputcmd/#
や outputcmd/#
の内容をJSONとして解析し、content
が含まれていれば、TTSで音声生成を行います。
path = get_mp3_path(text)
if not os.path.exists(path):
# OpenAI APIで生成
requests.post(...)
ブラウザへは WebSocket 経由で次のようなメッセージを送信:
{
"topic": "inputcmd/風呂/1",
"message": "テレビの電源を入れます",
"mp3": "e9d5bfc9e....3.mp3"
}
ブラウザは sndcache/
配下のMP3を自動再生します。
WebSocketで双方向通信
-
? WebSocketにより、MQTT→Webへの即時反映が可能
-
? Web画面から入力した文字列も、MQTTトピック
inputtext/browser
にパブリッシュ -
? Pythonサーバーがそれを受けてTTS再生
実装のポイント
キャッシュ戦略
-
同じ文の再送信を避けるため、
md5(text)
をファイル名に使用 -
例:
テレビの電源を入れます
→d41d8cd9.mp3
mp3再生タイミング
-
ブラウザ上で
Audio.play()
はユーザー操作の後のみ許可されるため -
初回再生のために「? サウンドを有効にする」ボタンを追加
表示UIの工夫
-
最新の発言10件を「吹き出し形式」で表示
-
受信したメッセージは全て
topic
付きで表示 -
自分で送信したメッセージも同様に表示
<div class="bubble">[inputcmd/風呂/1] テレビの電源を入れます</div>
おわりに
音声合成を取り入れることで、IoT家電が「話しかけてくる」ようになります。
スマートホームの臨場感をぐっと引き上げることができます。
次回は、いよいよ「AIと会話して家電を操作する」インターフェースを構築し、
AIエージェント×赤外線×MQTTの連携を実現します!
? このプロジェクトは社内の実験から始まりましたが、
いまや採用活動でもアピールできる「技術の棚卸し」に!
気になる方はぜひ会社情報をご覧ください。