Replace ElevenLabs with local STT and TTS

This commit is contained in:
2026-04-30 03:21:30 +09:00
parent 5d636e8619
commit 73546c15b9
24 changed files with 943 additions and 326 deletions

View File

@@ -15,14 +15,21 @@ const envSchema = z.object({
DISCORD_BOT_TOKEN: emptyToUndefined,
DISCORD_APPLICATION_ID: emptyToUndefined,
DISCORD_COMMAND_GUILD_ID: emptyToUndefined,
ELEVENLABS_API_KEY: emptyToUndefined,
ELEVENLABS_VOICE_ID: emptyToUndefined,
ELEVENLABS_STT_MODEL: z.string().min(1).default("scribe_v2_realtime"),
ELEVENLABS_TTS_MODEL: z.string().min(1).default("eleven_flash_v2_5"),
OLLAMA_BASE_URL: z.string().min(1).default("http://localhost:11434"),
OLLAMA_MODEL: z.string().min(1).default("qwen3:0.6b"),
OLLAMA_KEEP_ALIVE: z.string().min(1).default("5m"),
OLLAMA_NUM_CTX: z.coerce.number().int().min(512).max(32768).default(4096),
LOCAL_AI_VENV_PATH: z.string().min(1).default(".local-ai/.venv"),
LOCAL_AI_CACHE_DIR: z.string().min(1).default(".local-ai/cache"),
LOCAL_AI_PYTHON: emptyToUndefined,
LOCAL_STT_MODEL: z.string().min(1).default("tiny"),
LOCAL_STT_DEVICE: z.string().min(1).default("auto"),
LOCAL_STT_COMPUTE_TYPE: z.string().min(1).default("auto"),
LOCAL_STT_BEAM_SIZE: z.coerce.number().int().min(1).max(8).default(1),
LOCAL_TTS_LANGUAGE: z.string().min(1).default("KR"),
LOCAL_TTS_SPEAKER: z.string().min(1).default("KR"),
LOCAL_TTS_DEVICE: z.string().min(1).default("auto"),
LOCAL_TTS_SPEED: z.coerce.number().min(0.8).max(1.6).default(1.12),
BOT_DEFAULT_LANGUAGE: z.string().min(2).default("ko"),
MAX_CONVERSATION_TURNS: z.coerce.number().int().min(4).max(30).default(12),
LOCAL_AUDIO_SOURCE: emptyToUndefined,
@@ -36,10 +43,7 @@ const envSchema = z.object({
});
export type AppConfig = z.infer<typeof envSchema>;
export type AssistantRuntimeConfig = AppConfig & {
ELEVENLABS_API_KEY: string;
ELEVENLABS_VOICE_ID: string;
};
export type AssistantRuntimeConfig = AppConfig;
export type DiscordRuntimeConfig = AssistantRuntimeConfig & {
DISCORD_BOT_TOKEN: string;
DISCORD_APPLICATION_ID: string;
@@ -57,11 +61,7 @@ function requirePresent(value: string | undefined, name: string): string {
}
export function requireAssistantRuntimeConfig(config: AppConfig): AssistantRuntimeConfig {
return {
...config,
ELEVENLABS_API_KEY: requirePresent(config.ELEVENLABS_API_KEY, "ELEVENLABS_API_KEY"),
ELEVENLABS_VOICE_ID: requirePresent(config.ELEVENLABS_VOICE_ID, "ELEVENLABS_VOICE_ID"),
};
return config;
}
export function requireDiscordRuntimeConfig(config: AppConfig): DiscordRuntimeConfig {