From a663a6bee6149a1af6f1966a7ea46173c6be6686 Mon Sep 17 00:00:00 2001 From: liou Date: Fri, 21 Apr 2023 00:41:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=AD=E9=9F=B3=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=8A=9F=E8=83=BD=20(#12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useSpeechService.ts | 46 +++++++++++++----------- src/pages/Home/components/Content.vue | 2 +- src/pages/Home/components/NewChat.vue | 50 +++++++++++++++++++++------ 3 files changed, 67 insertions(+), 31 deletions(-) diff --git a/src/hooks/useSpeechService.ts b/src/hooks/useSpeechService.ts index 6ab2c99..c999a47 100644 --- a/src/hooks/useSpeechService.ts +++ b/src/hooks/useSpeechService.ts @@ -6,8 +6,11 @@ import { SpeechRecognizer, SpeechSynthesizer, } from 'microsoft-cognitiveservices-speech-sdk' - -export const useSpeechService = (langs = ['fr-FR', 'ja-JP', 'en-US', 'zh-CN', 'zh-HK', 'ko-KR', 'de-DE']) => { +interface Config { + langs?: readonly['fr-FR', 'ja-JP', 'en-US', 'zh-CN', 'zh-HK', 'ko-KR', 'de-DE'] + isFetchAllVoice?: boolean +} +export const useSpeechService = ({ langs = ['fr-FR', 'ja-JP', 'en-US', 'zh-CN', 'zh-HK', 'ko-KR', 'de-DE'], isFetchAllVoice = true }: Config = {}) => { const { azureKey, azureRegion } = useGlobalSetting() const languages = ref(langs) const language = ref(langs[0]) @@ -118,16 +121,17 @@ export const useSpeechService = (langs = ['fr-FR', 'ja-JP', 'en-US', 'zh- }) } - const ssmlToSpeak = async (text: string) => { + const ssmlToSpeak = async (text: string, { voice, voiceRate, lang }: { voice?: string; voiceRate?: number; lang?: string } = {}) => { isSynthesizing.value = true - const lang = speechConfig.value.speechSynthesisLanguage - const voice = speechConfig.value.speechSynthesisVoiceName + const targetLang = lang || speechConfig.value.speechSynthesisLanguage + const targetVoice = voice || speechConfig.value.speechSynthesisVoiceName + const targetRate = voiceRate || rate.value const ssml = ` - - - + + + ${text} @@ -158,18 +162,20 @@ export const useSpeechService = (langs = ['fr-FR', 'ja-JP', 'en-US', 'zh- } onMounted(async () => { - try { - isFetchAllVoices.value = true - allVoices.value = await getVoices() - // fr-FR 法语 ja-JP 日语 en-US 英语 zh-CN 中文 zh-HK 粤语 ko-KR 韩语 de-DE 德语 - for (const lang of languages.value) - languageMap.value[lang] = allVoices.value.filter(x => lang === x.locale) - console.log(languageMap) - isFetchAllVoices.value = false - } - catch (error) { - isFetchAllVoices.value = false - allVoices.value = [] + if (isFetchAllVoice) { + try { + isFetchAllVoices.value = true + allVoices.value = await getVoices() + // fr-FR 法语 ja-JP 日语 en-US 英语 zh-CN 中文 zh-HK 粤语 ko-KR 韩语 de-DE 德语 + for (const lang of languages.value) + languageMap.value[lang] = allVoices.value.filter(x => lang === x.locale) + console.log(languageMap) + isFetchAllVoices.value = false + } + catch (error) { + isFetchAllVoices.value = false + allVoices.value = [] + } } }) diff --git a/src/pages/Home/components/Content.vue b/src/pages/Home/components/Content.vue index 5a50327..d319c1c 100644 --- a/src/pages/Home/components/Content.vue +++ b/src/pages/Home/components/Content.vue @@ -27,7 +27,7 @@ const { stopRecognizeSpeech, ssmlToSpeak, isSynthesizing, -} = useSpeechService(store.allLanguage as any) +} = useSpeechService({ langs: store.allLanguage as any }) // states const message = ref('') // input message diff --git a/src/pages/Home/components/NewChat.vue b/src/pages/Home/components/NewChat.vue index 32fed5f..a8f0ece 100644 --- a/src/pages/Home/components/NewChat.vue +++ b/src/pages/Home/components/NewChat.vue @@ -13,7 +13,7 @@ const avatarList = ref(Object.keys(modules).map(path => path.replace(' const currentAvatarIndex = ref(Math.random() * avatarList.value.length | 0) const store = useConversationStore() - +const { ssmlToSpeak, isSynthesizing } = useSpeechService({ isFetchAllVoice: false }) const allLanguages = computed(() => [...new Set(allVoices.map(v => v.locale))].filter(l => Object.keys(supportLanguageMap).includes(l))) const selectLanguage = ref('') const filterVoices = ref([]) @@ -21,6 +21,7 @@ const selectVoiceName = ref('') const desc = ref('') const name = ref('') const rate = ref('1.0') +const previewText = ref('hello wrold') const canAdd = computed(() => !!(selectLanguage.value && selectVoiceName.value && desc.value && name.value)) @@ -58,6 +59,9 @@ const addChat = (event: any) => { const changeAvatar = () => { currentAvatarIndex.value = avatarList.value.length - 1 === currentAvatarIndex.value ? 0 : currentAvatarIndex.value + 1 } +const previewSpeech = () => { + ssmlToSpeak(previewText.value, { voice: selectVoiceName.value, lang: selectLanguage.value, voiceRate: +rate }) +}