feat(#395): implement Piper TTS provider via OpenedAI Speech
All checks were successful
ci/woodpecker/push/api Pipeline was successful

Add fallback-tier TTS provider using Piper via OpenedAI Speech for
ultra-lightweight CPU-only synthesis. Maps 6 standard OpenAI voice
names (alloy, echo, fable, onyx, nova, shimmer) to Piper voices.
Update factory to use the new PiperTtsProvider class, replacing the
inline stub. Includes 37 unit tests covering provider identity,
voice mapping, and voice listing.

Fixes #395

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 02:39:20 -06:00
parent 7b4fda6011
commit 6c465566f6
3 changed files with 480 additions and 19 deletions

View File

@@ -14,30 +14,13 @@
*/
import { Logger } from "@nestjs/common";
import { BaseTTSProvider } from "./base-tts.provider";
import { ChatterboxTTSProvider } from "./chatterbox-tts.provider";
import { KokoroTtsProvider } from "./kokoro-tts.provider";
import { PiperTtsProvider } from "./piper-tts.provider";
import type { ITTSProvider } from "../interfaces/tts-provider.interface";
import type { SpeechTier, AudioFormat } from "../interfaces/speech-types";
import type { SpeechConfig } from "../speech.config";
// ==========================================
// Concrete provider classes
// ==========================================
/**
* Piper TTS provider via OpenedAI Speech (fallback tier).
* Ultra-lightweight CPU, GPL license.
*/
class PiperProvider extends BaseTTSProvider {
readonly name = "piper";
readonly tier: SpeechTier = "fallback";
constructor(baseURL: string) {
super(baseURL, "alloy", "mp3");
}
}
// ==========================================
// Factory function
// ==========================================
@@ -76,7 +59,7 @@ export function createTTSProviders(config: SpeechConfig): Map<SpeechTier, ITTSPr
// Fallback tier: Piper
if (config.tts.fallback.enabled) {
const provider = new PiperProvider(config.tts.fallback.url);
const provider = new PiperTtsProvider(config.tts.fallback.url);
providers.set("fallback", provider);
logger.log(`Registered fallback TTS provider: piper at ${config.tts.fallback.url}`);
}