Add local TTS smoke test mode

This commit is contained in:
2026-05-01 03:30:34 +09:00
parent 03b06bcc6e
commit ac88b8c50a
4 changed files with 60 additions and 2 deletions

View File

@@ -3,7 +3,7 @@ import process from "node:process";
import { loadConfig, requireAssistantRuntimeConfig, requireDiscordRuntimeConfig } from "./config.js";
import { runDiscordBot } from "./discord-main.js";
import { Logger } from "./logger.js";
import { printLocalAudioDevices, runLocalAssistant } from "./local-main.js";
import { printLocalAudioDevices, runLocalAssistant, runLocalTtsSmokeTest } from "./local-main.js";
const mode = process.argv[2] ?? "discord";
const config = loadConfig();
@@ -20,8 +20,13 @@ async function main(): Promise<void> {
case "local-devices":
await printLocalAudioDevices();
return;
case "local-say": {
const text = process.argv.slice(3).join(" ").trim() || "안녕하세요. TTS 단독 재생 테스트입니다.";
await runLocalTtsSmokeTest(requireAssistantRuntimeConfig(config), logger, text);
return;
}
default:
throw new Error(`알 수 없는 실행 모드입니다: ${mode}. 사용 가능: discord, local, local-devices`);
throw new Error(`알 수 없는 실행 모드입니다: ${mode}. 사용 가능: discord, local, local-devices, local-say`);
}
}

View File

@@ -5,9 +5,11 @@ import type { AssistantRuntimeConfig } from "./config.js";
import { Logger } from "./logger.js";
import { LocalVoiceSession } from "./audio/local-voice-session.js";
import { requireFfmpegPath } from "./audio/ffmpeg-path.js";
import type { LlmService } from "./services/llm.js";
import { LocalFasterWhisperSttService } from "./services/local-stt.js";
import { LocalKokoroTtsService } from "./services/local-tts.js";
import { OllamaLlmService } from "./services/ollama-llm.js";
import type { SttService } from "./services/stt.js";
import { WindowsSystemTtsService } from "./services/windows-system-tts.js";
export async function printLocalAudioDevices(): Promise<void> {
@@ -120,3 +122,47 @@ export async function runLocalAssistant(config: AssistantRuntimeConfig, logger:
await session.start();
}
export async function runLocalTtsSmokeTest(
config: AssistantRuntimeConfig,
logger: Logger,
text: string,
): Promise<void> {
const tts =
process.platform === "win32"
? new WindowsSystemTtsService(config.LOCAL_TTS_SPEED)
: new LocalKokoroTtsService(config, logger);
const noOpStt: SttService = {
async transcribePcm16() {
return null;
},
};
const noOpLlm: LlmService = {
async generateReply() {
return "";
},
};
await tts.warmup();
const session = new LocalVoiceSession({
config,
logger,
stt: noOpStt,
tts,
llm: noOpLlm,
});
console.log("TTS 단독 재생 테스트를 시작합니다.");
console.log(`재생 문장: ${text}`);
if (process.platform === "win32") {
console.log("Windows에서는 시스템 기본 출력 장치로 재생됩니다.");
}
try {
await session.speakText(text);
} finally {
await Promise.allSettled([session.destroy(), tts.destroy?.()]);
}
}