LLMが出力したテキストを音声として再生するには、TTSにテキストを入力して音声合成する必要があります。通常はテキストをTTSへ送信するプログラムを用意しなければなりませんが、Module-LLMで採用されているStackFlowには各ユニット同士をリンクする機能が備わっているので、リンクする設定を行うだけで自動的に喋ってくれます。今回はそのリンク機能を試してみます。

リンクの仕組み

StackFlowにはllm_sysという全体のコントロールをしているユニットがあり、LLMのユニットllm_llmや、TTSのユニットllm_ttsが簡単に使用できるようになっています。ユーザーはTCP ポート10001からSocketでllm_sysと通信するか、またはUARTで通信します。M5Stack Core製品と接続して使用するためにUARTでも接続できるようになっているのは面白いですね。

今回はこのLLMの出力をTTSの入力にリンクします。こうすることで別途プログラムを作らなくても、フレームワーク内で自動的に喋ってくれるようになります。StackFlowの素晴らしい設計!

def setup_link_llmtts():
    """LLMの出力をTTSの入力にリンクする"""
    global llm_work_id, tts_work_id

    try:
        request_id = f"link_{int(time.time())}_setup"
        link_setup = {
            "request_id": request_id,
            "work_id": tts_work_id,
            "action": "link",
            "object": "work_id",
            "data": llm_work_id
        }
        send_json_request(sf_sock, link_setup)
        res = receive_response(sf_sock, 180, request_id)
        if res and res.get('error', {}).get('code', -999) != 0:
            raise Exception(f'LLM/TTSリンク エラー: {res["error"]["message"]}')
        
    except Exception as e:
        print(f'エラー setup_link_llmtts: {e}')
        return False

    return True

各ユニットにはwork_idという固有のIDがあって、各ユニットを起動するときにこのIDが取得できます。こちらではTTSのwork_idにLLMのwork_idを繋げています。この辺に説明があるので、興味がある方は見てみてください。

StackFlowのアップデートと日本語TTSのインストール

StackFlowは開発が進んでいて、新しいモデルを使用するにはアップデートが必要な場合もあります。まずはアップデートしておきます。(–only-upgrade=インストール済みのみをアップデート)

apt update
apt install --only-upgrade "llm-*"

次に日本語TTSモデルをインストールします。デフォルトではmelotts_zh-cnがインストールされていますが、これは中国語と英語のみなので、新しい日本語に対応したモデルをインストールします。

apt install llm-model-melotts-ja-jp

準備ができたらさっそく試してみましょう。

プログラムの実行

プログラムは GitHub にアップしました。

Module-LLMで起動します。(uv環境使用)

uv run mcp_llm_gradio.py \
  --llmmodel qwen2.5-0.5B-prefill-20e \
  --ttsmodel melotts-ja-jp \
  --enabletts \
  --linktts

オプションの意味は、
LLMで使用するモデル –llmmodel qwen2.5-0.5B-prefill-20e
TTSで使用するモデル –ttsmodel melotts-ja-jp
TTSを有効にする(これがないとLLMのみになる) –enabletts
LLMとTTSにリンクする –linktts

起動が完了するまでかなり時間がかかります。以下のように表示されたら準備完了です。

Starting gradio MCP server...
* Running on local URL:  http://0.0.0.0:7860
* To create a public link, set `share=True` in `launch()`.

🔨 MCP server (using SSE) running at: http://localhost:7860/gradio_api/mcp/sse

ブラウザから以下のURLアクセスします。ホストが見つからないというエラーになる場合は、m5stack-llm.localの部分をIPアドレスにしてみてください。
http://m5stack-llm.local:7860/

しばらく待つと喋ってくれました。名前はスタックチャンと言うようです。かわいいですね。

ブラウザの画面はLLMの出力が全て完了しないと応答の文字が表示されませんが、Module LLMのターミナルを見れば細切れになった言葉が流れているのがわかります。この出力が自動的にTTSにも送信されて、TTSで音声合成してスピーカーで再生されるというわけです。

残念ながら現時点では melotts-ja-jp は数字やアルファベットを正常に発音することができませんでした。

LINEで送る
Pocket