技術検証

OpenAIの音声合成とESP32連携で、家電が喋り出す!title_point

はじめに

第4話では、ESP32とPythonサーバーにOpenAIの音声合成(TTS)機能を組み込み、赤外線リモコン操作に音声インターフェースを追加します。

これにより、家電の操作内容を喋ったり、Webから送ったメッセージを即座に音声で再生したりすることができるようになります。


音声合成の仕組み

今回使用するのは、OpenAIの text-to-speech エンドポイント:

  • ? 入力テキストを送信

  • ? mp3形式の音声で返却

  • ? mp3をサーバーにキャッシュ保存(ハッシュ化)

  • ▶️ ブラウザで即再生


音声合成に必要なもの

OpenAI 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の連携を実現します!

次回 ▶️ 第5話:ChatGPTで家電を音声制御!自然言語×IoTの未来


? このプロジェクトは社内の実験から始まりましたが、
いまや採用活動でもアピールできる「技術の棚卸し」に!
気になる方はぜひ会社情報をご覧ください。