31 lines
992 B
TypeScript
31 lines
992 B
TypeScript
import { useState, useCallback } from "react"
|
|
|
|
export function useVoicePlayback() {
|
|
const [speakingHead, setSpeakingHead] = useState<string | null>(null)
|
|
const [headSummaries, setHeadSummaries] = useState<Record<string, string>>({})
|
|
|
|
const onHeadSpeak = useCallback(
|
|
(headId: string, summary: string, audioBase64?: string | null) => {
|
|
setSpeakingHead(headId)
|
|
setHeadSummaries((prev) => ({ ...prev, [headId]: summary }))
|
|
if (audioBase64) {
|
|
try {
|
|
const audio = new Audio(`data:audio/wav;base64,${audioBase64}`)
|
|
audio.play().then(() => {
|
|
audio.onended = () => setSpeakingHead(null)
|
|
}).catch(() => setSpeakingHead(null))
|
|
} catch {
|
|
setSpeakingHead(null)
|
|
}
|
|
} else {
|
|
setTimeout(() => setSpeakingHead(null), 1500)
|
|
}
|
|
},
|
|
[]
|
|
)
|
|
|
|
const clearSpeaking = useCallback(() => setSpeakingHead(null), [])
|
|
|
|
return { speakingHead, headSummaries, onHeadSpeak, clearSpeaking }
|
|
}
|