import { createContext, useContext, useState, ReactNode } from 'react' export interface TextToSpeechConfigState { speakerEmbeddings?: string voice?: string } export interface AudioResult { audio: Float32Array sampling_rate: number text: string voice?: string } interface TextToSpeechContextType { config: TextToSpeechConfigState setConfig: React.Dispatch> audioResults: AudioResult[] setAudioResults: React.Dispatch> currentText: string setCurrentText: React.Dispatch> addAudioResult: ( text: string, audio: Omit, voice?: string ) => void clearAudioResults: () => void } const TextToSpeechContext = createContext( undefined ) export function TextToSpeechProvider({ children }: { children: ReactNode }) { const [config, setConfig] = useState({ speakerEmbeddings: 'https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/speaker_embeddings.bin', voice: undefined }) const [audioResults, setAudioResults] = useState([]) const [currentText, setCurrentText] = useState('') const addAudioResult = ( text: string, audio: Omit, voice?: string ) => { const fullAudioResult: AudioResult = { ...audio, text, voice } setAudioResults((prev) => [...prev, fullAudioResult]) } const clearAudioResults = () => { setAudioResults([]) setCurrentText('') } const value = { config, setConfig, audioResults, setAudioResults, currentText, setCurrentText, addAudioResult, clearAudioResults } return ( {children} ) } export function useTextToSpeech() { const context = useContext(TextToSpeechContext) if (context === undefined) { throw new Error( 'useTextToSpeech must be used within a TextToSpeechProvider' ) } return context }