From 46a6b926dfd4b42aedd3dbf499810cb65b2a605c Mon Sep 17 00:00:00 2001 From: claude-bot Date: Sun, 3 May 2026 17:56:42 +0900 Subject: [PATCH] Fix TTS playback and preinstall mecab --- docker/melotts/Dockerfile | 1 + src/services/audio-playback.ts | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docker/melotts/Dockerfile b/docker/melotts/Dockerfile index d58dea1..449ab0a 100644 --- a/docker/melotts/Dockerfile +++ b/docker/melotts/Dockerfile @@ -12,6 +12,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ RUN git clone https://github.com/myshell-ai/MeloTTS.git /opt/MeloTTS RUN pip install --no-cache-dir -e /opt/MeloTTS +RUN pip install --no-cache-dir python-mecab-ko python-mecab-ko-dic RUN python -m unidic download RUN python /opt/MeloTTS/melo/init_downloads.py diff --git a/src/services/audio-playback.ts b/src/services/audio-playback.ts index 1a75afa..180f150 100644 --- a/src/services/audio-playback.ts +++ b/src/services/audio-playback.ts @@ -1,11 +1,12 @@ import { spawn } from "node:child_process"; import process from "node:process"; -async function run(command: string, args: string[]): Promise { +async function run(command: string, args: string[], env?: NodeJS.ProcessEnv): Promise { await new Promise((resolve, reject) => { const child = spawn(command, args, { stdio: ["ignore", "inherit", "inherit"], windowsHide: true, + env, }); child.on("error", reject); @@ -21,6 +22,11 @@ async function run(command: string, args: string[]): Promise { export async function playWavFile(filePath: string): Promise { if (process.platform === "win32") { + const env = { + ...process.env, + TTS_WAV_PATH: filePath, + }; + await run("powershell.exe", [ "-NoProfile", "-NonInteractive", @@ -28,13 +34,12 @@ export async function playWavFile(filePath: string): Promise { "Bypass", "-Command", [ - "$path = $args[0]", + "$path = $env:TTS_WAV_PATH", "$player = New-Object System.Media.SoundPlayer $path", "$player.Load()", "$player.PlaySync()", ].join("; "), - filePath, - ]); + ], env); return; }