M5Stack LLM モジュールとCoreS3 SEを使って、テキスト音声変換ー読み上げ(TTS:Text To Speech)をやってみます。
Windows 側からメッセージを送って、それをM5Stack CoreS3 SE +LLM モジュール側で読み上げます。
●初期機種のGray でも動作しました。ボード情報はM5Core です。
M5Stack CoreS3 SE にアプリを展開します。
LLM モジュールはデフォルトの環境で使います。
元ネタはArduino IDE のM5ModuleLLMライブラリに付いてくるスケッチ例のTTSですが、ちょっといじってIDEのシリアルモニターからメッセージを送信するようにしてみます。
Arduino IDE のインストールなどはWindows 11からM5Stack LLM モジュール に触ってみる(2)環境設定とアプリケーションの環境設定1をご参照ください。
スケッチ例のTTSをそのままデプロイしてみます。
これは足し算の文字列を作って、それを読み上げるというそれだけのアプリです。
ファイルー>スケッチ例ー>M5ModuleLLMー>TTSを選択
TTSのコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD * * SPDX-License-Identifier: MIT */ #include <Arduino.h> #include <M5Unified.h> #include <M5ModuleLLM.h> M5ModuleLLM module_llm; String tts_work_id; String language; void setup() { M5.begin(); M5.Display.setTextSize(2); M5.Display.setTextScroll(true); // M5.Display.setFont(&fonts::efontCN_12); // Support Chinese display language = "en_US"; // language = "zh_CN"; /* Init module serial port */ // int rxd = 16, txd = 17; // Basic // int rxd = 13, txd = 14; // Core2 // int rxd = 18, txd = 17; // CoreS3 int rxd = M5.getPin(m5::pin_name_t::port_c_rxd); int txd = M5.getPin(m5::pin_name_t::port_c_txd); Serial2.begin(115200, SERIAL_8N1, rxd, txd); /* Init module */ module_llm.begin(&Serial2); /* Make sure module is connected */ M5.Display.printf(">> Check ModuleLLM connection..\n"); while (1) { if (module_llm.checkConnection()) { break; } } /* Reset ModuleLLM */ M5.Display.printf(">> Reset ModuleLLM..\n"); module_llm.sys.reset(); /* Setup Audio module */ M5.Display.printf(">> Setup audio..\n"); module_llm.audio.setup(); /* Setup TTS module and save returned work id */ M5.Display.printf(">> Setup tts..\n\n"); m5_module_llm::ApiTtsSetupConfig_t tts_config; tts_work_id = module_llm.tts.setup(tts_config, "tts_setup", language); } void loop() { /* Make a text for speech: {i} plus {i} equals to {i + i} */ static int i = 0; i++; std::string text = std::to_string(i) + " plus " + std::to_string(i) + " equals " + std::to_string(i + i) + "."; // std::string text = std::to_string(i) + " 加 " + std::to_string(i) + " 等于 " + std::to_string(i + i) + "."; M5.Display.setTextColor(TFT_GREEN); M5.Display.printf("<< %s\n\n", text.c_str()); /* Push text to TTS module and wait inference result */ module_llm.tts.inference(tts_work_id, text.c_str(), 10000); delay(500); } |
コンパイルして書き込みます。
デプロイされると、即読み上げが開始されます(が、なぜか2+2=4からでした)。
Windowsからメッセージを送信して読み上げさせる
上記のソースを改変して、メッセージを受信して読み上げさせます。
TTS改変コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
#include <Arduino.h> #include <M5Unified.h> #include <M5ModuleLLM.h> #define CommSerialPort Serial M5ModuleLLM module_llm; String tts_work_id; String language; String received_question; bool Input_completed; void setup() { M5.begin(); M5.Display.setTextSize(2); M5.Display.setTextScroll(true); /* Init usb serial */ CommSerialPort.begin(115200); language = "en_US"; /* Init module serial port */ int rxd = M5.getPin(m5::pin_name_t::port_c_rxd); int txd = M5.getPin(m5::pin_name_t::port_c_txd); Serial2.begin(115200, SERIAL_8N1, rxd, txd); /* Init module */ module_llm.begin(&Serial2); /* Make sure module is connected */ M5.Display.printf(">> Check ModuleLLM connection..\n"); while (1) { if (module_llm.checkConnection()) { break; } } /* Reset ModuleLLM */ M5.Display.printf(">> Reset ModuleLLM..\n"); module_llm.sys.reset(); /* Setup Audio module */ M5.Display.printf(">> Setup audio..\n"); module_llm.audio.setup(); /* Setup TTS module and save returned work id */ M5.Display.printf(">> Setup tts..\n\n"); m5_module_llm::ApiTtsSetupConfig_t tts_config; tts_work_id = module_llm.tts.setup(tts_config, "tts_setup", language); M5.Display.printf(">> Initialization completed..\n\n"); } void loop() { Input_completed = false; if (CommSerialPort.available()) { while (CommSerialPort.available()) { char in_char = (char)CommSerialPort.read(); received_question += in_char; if (received_question.endsWith("\r\n")) { received_question.remove(received_question.length() - 2); Input_completed = true; break; } } } if (Input_completed) { /* Push text to TTS module and wait inference result */ M5.Display.setTextColor(TFT_GREEN); M5.Display.printf("<< %s\n", received_question.c_str()); M5.Display.setTextColor(TFT_YELLOW); M5.Display.printf(">> "); CommSerialPort.printf("<< \"%s\"\n", received_question.c_str()); CommSerialPort.print(">> "); module_llm.tts.inference(tts_work_id, received_question.c_str(), 10000); /* Clear for next question */ received_question.clear(); M5.Display.println(); CommSerialPort.println(); } delay(500); } |
これをコンパイルして書き込みます。
初期画面です。
この段階で念のためM5Stackのハードウェアリセットをかけておきます。
Power Key を6秒長押ししてシャットダウンし、再度Keyを押して起動させます。
再起動
メッセージ送信にArduino IDE のシリアルモニタを使ってみます。
改行(CR + LF)とボーレート(115200)を設定。
フィールドにメッセージを記述してリターンキーを押します。
メッセージがM5Stack に送信されLLM モジュールで処理されて、スピーカーから女性の声で発声されます。
LLM モジュールの処理に若干時間がかかる(2~3秒)のでその分発声にタイムラグがあります。
Note
●Arduino IDE のM5ModuleLLMのスケッチ例にもう一つMeloTTS というのがあるのですが….
どうも数字が読めないようです。
Appendix
その他のシリアルモニタ
今回はArduino IDE に付属のシリアルモニタを使いましたが、その他によく使われるものにTera Term があります。
Tera Term のインストールは簡単なので省きます。
インストールしたら、M5Stack とPCをUSBケーブルで接続後起動して、シリアルでポートを指定してオープンします。
英語版の場合、日本語に設定しておきます。
SetupでTerminal を開きます。
UIタブでLanguage を日本語指定。
次に通信速度を115200に指定しておいて、ウィンドウを閉じます。
メニュのコントロールからブロードキャストコマンドを開きます。
まずリアルタイムのチェックを外します。
改行を「CRLF」に変更して、「このプロセスのみに送信」にチェックを入れます。
メッセージ用のフィールドにチャットを入力して送信。
以上です。
関連ページ
Windows 11からM5Stack LLM モジュール に触ってみる(1)アクセス編
Windows 11からM5Stack LLM モジュール に触ってみる(2)環境設定とアプリケーション
Windows11からM5Stack LLM モジュール に触ってみる(3)アプリケーション(TTS)
Windows11からM5Stack LLM モジュール に触ってみる(4)アプリケーション(SerialTextAssistant + TTS)
LLM モジュール のSerialTextAssistant + TTS のシリアルモニタにPythonを使ってみる
















Leave a Reply