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