feat: add voice playback settings with 4-provider support (#608)
Add WebSpeech, OpenAI TTS, Custom endpoint, and Edge TTS providers. Co-authored-by: Hermes Agent <noreply@nousresearch.com>
This commit is contained in:
@@ -12,6 +12,9 @@ const FIXED_PITCH = '+12Hz'
|
||||
export interface TtsOptions {
|
||||
text: string
|
||||
lang?: string
|
||||
voice?: string
|
||||
rate?: string
|
||||
pitch?: string
|
||||
}
|
||||
|
||||
export async function edgeTts(opts: TtsOptions): Promise<Buffer> {
|
||||
@@ -20,9 +23,9 @@ export async function edgeTts(opts: TtsOptions): Promise<Buffer> {
|
||||
|
||||
try {
|
||||
const tts = new EdgeTTS({
|
||||
voice: FIXED_VOICE,
|
||||
rate: FIXED_RATE,
|
||||
pitch: FIXED_PITCH,
|
||||
voice: opts.voice || FIXED_VOICE,
|
||||
rate: opts.rate || FIXED_RATE,
|
||||
pitch: opts.pitch || FIXED_PITCH,
|
||||
timeout: 15000,
|
||||
})
|
||||
|
||||
@@ -35,7 +38,41 @@ export async function edgeTts(opts: TtsOptions): Promise<Buffer> {
|
||||
}
|
||||
|
||||
export async function textToSpeech(opts: TtsOptions): Promise<{ audio: Buffer; engine: string }> {
|
||||
const voice = opts.voice || FIXED_VOICE
|
||||
const rate = opts.rate || FIXED_RATE
|
||||
const pitch = opts.pitch || FIXED_PITCH
|
||||
const audio = await edgeTts(opts)
|
||||
logger.debug({ engine: 'edge', voice: FIXED_VOICE, rate: FIXED_RATE, pitch: FIXED_PITCH }, 'TTS generated via Edge')
|
||||
logger.debug({ engine: 'edge', voice, rate, pitch }, 'TTS generated via Edge')
|
||||
return { audio, engine: 'edge' }
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert speed multiplier (0.5-2.0) to Edge TTS rate string.
|
||||
* Edge TTS rate format: "+/-NN%"
|
||||
*/
|
||||
export function speedToEdgeRate(speed: number): string {
|
||||
const percent = Math.round((speed - 1) * 100)
|
||||
return percent >= 0 ? `+${percent}%` : `${percent}%`
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert OpenAI TTS request to internal TtsOptions.
|
||||
* OpenAI format: { model, input, voice, speed }
|
||||
*/
|
||||
export interface OpenaiTtsRequest {
|
||||
model?: string
|
||||
input: string
|
||||
voice?: string
|
||||
speed?: number
|
||||
}
|
||||
|
||||
export async function openaiCompatibleTts(
|
||||
body: OpenaiTtsRequest,
|
||||
): Promise<{ audio: Buffer; engine: string }> {
|
||||
return textToSpeech({
|
||||
text: body.input,
|
||||
voice: body.voice || FIXED_VOICE,
|
||||
rate: body.speed ? speedToEdgeRate(body.speed) : FIXED_RATE,
|
||||
pitch: FIXED_PITCH,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user