Files
Hermes-ui/packages/client/src/api/hermes/tts.ts
T
memeflyfly a68b9bf01f feat: add Edge TTS rate/pitch sliders to voice settings (#629)
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
2026-05-11 21:56:11 +08:00

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
}