pdf-icon

Module LLM - Text-to-Speech

This example demonstrates how to use the M5ModuleLLM library on the Arduino platform to call a TTS model for speech synthesis and playback.

Preparation

  1. Refer to the Module LLM Arduino Quick Start to set up the environment and install the M5ModuleLLM driver library.

  2. Refer to the Module LLM Software Package Update Guide to install the following model and software packages:

apt install llm-melotts
apt install llm-model-melotts-en-default
  1. The hardware used in the following example includes:

TTS CoreS3

/*
* SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#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 TTS module and save returned work id */
    M5.Display.printf(">> Initialize TTS..\n\n");
    m5_module_llm::ApiMelottsSetupConfig_t melotts_config;
    melotts_config.model = "melotts-en-default";
    tts_work_id          = module_llm.melotts.setup(melotts_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(20);
}
  1. Upload the code to CoreS3
  1. Open the Serial Monitor in Arduino IDE and set the baud rate to 115200. Enter text and press Enter to send.
  1. Module LLM will synthesize and play the audio.

More Languages

To support TTS in additional languages, install different model packages. Below are commonly used TTS models. After installation, modify the configuration in the example code to switch TTS languages.

Chinese Model

apt install llm-model-melotts-zh-cn
language = "zh_CN";
melotts_config.model = "model-melotts-zh-cn";

English Model

apt install llm-model-melotts-en-default
language = "en_US";
melotts_config.model = "melotts-en-default";

Japanese Model

apt install llm-model-melotts-ja-jp
language = "ja_JP";
melotts_config.model = "model-melotts-ja-jp";
On This Page