Initial commit: add .gitignore and README
This commit is contained in:
30
frontend/src/hooks/useVoicePlayback.ts
Normal file
30
frontend/src/hooks/useVoicePlayback.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
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 }
|
||||
}
|
||||
Reference in New Issue
Block a user