a68b9bf01f
Add speed (rate) and pitch controls for Edge TTS provider: - Frontend: speedToEdgeRate()/hzToEdgePitch() helpers + UI sliders - Backend: rate/pitch passthrough in OpenaiTtsRequest and controller - i18n: add edgeRate/edgePitch keys across all 8 languages - Rate: 0.5x-2.0x slider, Pitch: -20Hz to +20Hz slider
37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
export interface TtsOptions {
|
|
text: string
|
|
lang?: string
|
|
rate?: string // Edge TTS rate format: "+NN%" or "-NN%"
|
|
pitch?: string // Edge TTS pitch format: "+NNHz" or "-NNHz"
|
|
}
|
|
|
|
export async function generateSpeech(opts: TtsOptions): Promise<{ audio: Blob; engine: string }> {
|
|
const res = await fetch(
|
|
`${localStorage.getItem('hermes_server_url') || ''}/api/hermes/tts`,
|
|
{
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${localStorage.getItem('hermes_api_key') || ''}`,
|
|
},
|
|
body: JSON.stringify(opts),
|
|
},
|
|
)
|
|
|
|
if (!res.ok) {
|
|
throw new Error(`TTS request failed: ${res.status}`)
|
|
}
|
|
|
|
const audio = await res.blob()
|
|
const engine = res.headers.get('X-TTS-Engine') || 'unknown'
|
|
return { audio, engine }
|
|
}
|
|
|
|
export function playAudioBlob(blob: Blob): HTMLAudioElement {
|
|
const url = URL.createObjectURL(blob)
|
|
const audio = new Audio(url)
|
|
audio.play()
|
|
audio.onended = () => URL.revokeObjectURL(url)
|
|
return audio
|
|
}
|