@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
87 lines (82 loc) • 2.48 kB
text/typescript
import {
EdgeSpeechOptions,
MicrosoftSpeechOptions,
OpenAITTSOptions,
TTSOptions,
useEdgeSpeech,
useMicrosoftSpeech,
useOpenAITTS,
} from '@lobehub/tts/react';
import isEqual from 'fast-deep-equal';
import { createHeaderWithOpenAI } from '@/services/_header';
import { API_ENDPOINTS } from '@/services/_url';
import { useAgentStore } from '@/store/agent';
import { agentSelectors } from '@/store/agent/slices/chat';
import { useGlobalStore } from '@/store/global';
import { globalGeneralSelectors } from '@/store/global/selectors';
import { useUserStore } from '@/store/user';
import { settingsSelectors } from '@/store/user/selectors';
import { TTSServer } from '@/types/agent';
interface TTSConfig extends TTSOptions {
onUpload?: (currentVoice: string, arraybuffers: ArrayBuffer[]) => void;
server?: TTSServer;
voice?: string;
}
export const useTTS = (content: string, config?: TTSConfig) => {
const ttsSettings = useUserStore(settingsSelectors.currentTTS, isEqual);
const ttsAgentSettings = useAgentStore(agentSelectors.currentAgentTTS, isEqual);
const lang = useGlobalStore(globalGeneralSelectors.currentLanguage);
const voice = useAgentStore(agentSelectors.currentAgentTTSVoice(lang));
let useSelectedTTS;
let options: any = {};
switch (config?.server || ttsAgentSettings.ttsService) {
case 'openai': {
useSelectedTTS = useOpenAITTS;
options = {
api: {
headers: createHeaderWithOpenAI(),
serviceUrl: API_ENDPOINTS.tts,
},
options: {
model: ttsSettings.openAI.ttsModel,
voice: config?.voice || voice,
},
} as OpenAITTSOptions;
break;
}
case 'edge': {
useSelectedTTS = useEdgeSpeech;
options = {
api: {
/**
* @description client fetch
* serviceUrl: TTS_URL.edge,
*/
},
options: {
voice: config?.voice || voice,
},
} as EdgeSpeechOptions;
break;
}
case 'microsoft': {
useSelectedTTS = useMicrosoftSpeech;
options = {
api: {
serviceUrl: API_ENDPOINTS.microsoft,
},
options: {
voice: config?.voice || voice,
},
} as MicrosoftSpeechOptions;
break;
}
}
return useSelectedTTS(content, {
...config,
...options,
onFinish: (arraybuffers) => {
config?.onUpload?.(options.voice || 'alloy', arraybuffers);
},
});
};