diff --git a/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx b/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx index f443498f..a8b85da1 100644 --- a/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx +++ b/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx @@ -20,6 +20,7 @@ const TTSControl = () => { const [ttsLang, setTtsLang] = useState('en'); const [isPlaying, setIsPlaying] = useState(false); const [isPaused, setIsPaused] = useState(false); + const [showIndicator, setShowIndicator] = useState(false); const [showPanel, setShowPanel] = useState(false); const [panelPosition, setPanelPosition] = useState(); const [trianglePosition, setTrianglePosition] = useState(); @@ -58,6 +59,7 @@ const TTSControl = () => { ttsControllerRef.current.stop(); ttsControllerRef.current = null; } + setShowIndicator(true); try { const ttsController = new TTSController(view); @@ -132,6 +134,7 @@ const TTSControl = () => { ttsControllerRef.current = null; setIsPlaying(false); setShowPanel(false); + setShowIndicator(false); } }; @@ -219,7 +222,7 @@ const TTSControl = () => { onContextMenu={handleDismissPopup} /> )} - {ttsControllerRef.current && ( + {showIndicator && (
diff --git a/apps/readest-app/src/libs/edgeTTS.ts b/apps/readest-app/src/libs/edgeTTS.ts index 9d594b9a..2bbea905 100644 --- a/apps/readest-app/src/libs/edgeTTS.ts +++ b/apps/readest-app/src/libs/edgeTTS.ts @@ -6,12 +6,74 @@ const EDGE_SPEECH_URL = 'wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1'; const EDGE_API_TOKEN = '6A5AA1D4EAFF4E9FB37E23D68491D6F4'; const EDGE_TTS_VOICES = { + 'af-ZA': ['af-ZA-AdriNeural', 'af-ZA-WillemNeural'], + 'am-ET': ['am-ET-AmehaNeural', 'am-ET-MekdesNeural'], + 'ar-AE': ['ar-AE-FatimaNeural', 'ar-AE-HamdanNeural'], + 'ar-BH': ['ar-BH-AliNeural', 'ar-BH-LailaNeural'], + 'ar-DZ': ['ar-DZ-AminaNeural', 'ar-DZ-IsmaelNeural'], + 'ar-EG': ['ar-EG-SalmaNeural', 'ar-EG-ShakirNeural'], + 'ar-IQ': ['ar-IQ-BasselNeural', 'ar-IQ-RanaNeural'], + 'ar-JO': ['ar-JO-SanaNeural', 'ar-JO-TaimNeural'], + 'ar-KW': ['ar-KW-FahedNeural', 'ar-KW-NouraNeural'], + 'ar-LB': ['ar-LB-LaylaNeural', 'ar-LB-RamiNeural'], + 'ar-LY': ['ar-LY-ImanNeural', 'ar-LY-OmarNeural'], + 'ar-MA': ['ar-MA-JamalNeural', 'ar-MA-MounaNeural'], + 'ar-OM': ['ar-OM-AbdullahNeural', 'ar-OM-AyshaNeural'], + 'ar-QA': ['ar-QA-AmalNeural', 'ar-QA-MoazNeural'], 'ar-SA': ['ar-SA-HamedNeural', 'ar-SA-ZariyahNeural'], - 'de-DE': ['de-DE-AmalaNeural', 'de-DE-ConradNeural', 'de-DE-KatjaNeural', 'de-DE-KillianNeural'], + 'ar-SY': ['ar-SY-AmanyNeural', 'ar-SY-LaithNeural'], + 'ar-TN': ['ar-TN-HediNeural', 'ar-TN-ReemNeural'], + 'ar-YE': ['ar-YE-MaryamNeural', 'ar-YE-SalehNeural'], + 'az-AZ': ['az-AZ-BabekNeural', 'az-AZ-BanuNeural'], + 'bg-BG': ['bg-BG-BorislavNeural', 'bg-BG-KalinaNeural'], + 'bn-BD': ['bn-BD-NabanitaNeural', 'bn-BD-PradeepNeural'], + 'bn-IN': ['bn-IN-BashkarNeural', 'bn-IN-TanishaaNeural'], + 'bs-BA': ['bs-BA-GoranNeural', 'bs-BA-VesnaNeural'], + 'ca-ES': ['ca-ES-EnricNeural', 'ca-ES-JoanaNeural'], + 'cs-CZ': ['cs-CZ-AntoninNeural', 'cs-CZ-VlastaNeural'], + 'cy-GB': ['cy-GB-AledNeural', 'cy-GB-NiaNeural'], + 'da-DK': ['da-DK-ChristelNeural', 'da-DK-JeppeNeural'], + 'de-AT': ['de-AT-IngridNeural', 'de-AT-JonasNeural'], + 'de-CH': ['de-CH-JanNeural', 'de-CH-LeniNeural'], + 'de-DE': [ + 'de-DE-AmalaNeural', + 'de-DE-ConradNeural', + 'de-DE-FlorianMultilingualNeural', + 'de-DE-KatjaNeural', + 'de-DE-KillianNeural', + 'de-DE-SeraphinaMultilingualNeural', + ], + 'el-GR': ['el-GR-AthinaNeural', 'el-GR-NestorasNeural'], + 'en-AU': ['en-AU-NatashaNeural', 'en-AU-WilliamNeural'], + 'en-CA': ['en-CA-ClaraNeural', 'en-CA-LiamNeural'], + 'en-GB': [ + 'en-GB-LibbyNeural', + 'en-GB-MaisieNeural', + 'en-GB-RyanNeural', + 'en-GB-SoniaNeural', + 'en-GB-ThomasNeural', + ], + 'en-HK': ['en-HK-SamNeural', 'en-HK-YanNeural'], + 'en-IE': ['en-IE-ConnorNeural', 'en-IE-EmilyNeural'], + 'en-IN': ['en-IN-NeerjaExpressiveNeural', 'en-IN-NeerjaNeural', 'en-IN-PrabhatNeural'], + 'en-KE': ['en-KE-AsiliaNeural', 'en-KE-ChilembaNeural'], + 'en-NG': ['en-NG-AbeoNeural', 'en-NG-EzinneNeural'], + 'en-NZ': ['en-NZ-MitchellNeural', 'en-NZ-MollyNeural'], + 'en-PH': ['en-PH-JamesNeural', 'en-PH-RosaNeural'], + 'en-SG': ['en-SG-LunaNeural', 'en-SG-WayneNeural'], + 'en-TZ': ['en-TZ-ElimuNeural', 'en-TZ-ImaniNeural'], 'en-US': [ - 'en-US-AriaNeural', 'en-US-AnaNeural', + 'en-US-AndrewMultilingualNeural', + 'en-US-AndrewNeural', + 'en-US-AriaNeural', + 'en-US-AvaMultilingualNeural', + 'en-US-AvaNeural', + 'en-US-BrianMultilingualNeural', + 'en-US-BrianNeural', 'en-US-ChristopherNeural', + 'en-US-EmmaMultilingualNeural', + 'en-US-EmmaNeural', 'en-US-EricNeural', 'en-US-GuyNeural', 'en-US-JennyNeural', @@ -19,23 +81,42 @@ const EDGE_TTS_VOICES = { 'en-US-RogerNeural', 'en-US-SteffanNeural', ], - 'es-ES': ['es-ES-AlvaroNeural', 'es-ES-ElviraNeural'], - 'fr-FR': ['fr-FR-DeniseNeural', 'fr-FR-EloiseNeural', 'fr-FR-HenriNeural'], + 'es-AR': ['es-AR-ElenaNeural', 'es-AR-TomasNeural'], + 'es-BO': ['es-BO-MarceloNeural', 'es-BO-SofiaNeural'], + 'es-CL': ['es-CL-CatalinaNeural', 'es-CL-LorenzoNeural'], + 'es-CO': ['es-CO-GonzaloNeural', 'es-CO-SalomeNeural'], + 'es-CR': ['es-CR-JuanNeural', 'es-CR-MariaNeural'], + 'es-CU': ['es-CU-BelkysNeural', 'es-CU-ManuelNeural'], + 'es-DO': ['es-DO-EmilioNeural', 'es-DO-RamonaNeural'], + 'es-EC': ['es-EC-AndreaNeural', 'es-EC-LuisNeural'], + 'es-ES': ['es-ES-AlvaroNeural', 'es-ES-ElviraNeural', 'es-ES-XimenaNeural'], + 'es-US': ['es-US-AlonsoNeural', 'es-US-PalomaNeural'], + 'fr-BE': ['fr-BE-CharlineNeural', 'fr-BE-GerardNeural'], + 'fr-CA': ['fr-CA-AntoineNeural', 'fr-CA-JeanNeural', 'fr-CA-SylvieNeural', 'fr-CA-ThierryNeural'], + 'fr-CH': ['fr-CH-ArianeNeural', 'fr-CH-FabriceNeural'], + 'fr-FR': [ + 'fr-FR-DeniseNeural', + 'fr-FR-EloiseNeural', + 'fr-FR-HenriNeural', + 'fr-FR-RemyMultilingualNeural', + 'fr-FR-VivienneMultilingualNeural', + ], 'ja-JP': ['ja-JP-KeitaNeural', 'ja-JP-NanamiNeural'], - 'ko-KR': ['ko-KR-InJoonNeural', 'ko-KR-SunHiNeural'], - 'pt-BR': ['pt-BR-AntonioNeural', 'pt-BR-FranciscaNeural'], - 'ru-RU': ['ru-RU-DmitryNeural', 'ru-RU-SvetlanaNeural'], + 'ko-KR': ['ko-KR-HyunsuMultilingualNeural', 'ko-KR-InJoonNeural', 'ko-KR-SunHiNeural'], + 'pt-BR': ['pt-BR-AntonioNeural', 'pt-BR-FranciscaNeural', 'pt-BR-ThalitaMultilingualNeural'], + 'pt-PT': ['pt-PT-DuarteNeural', 'pt-PT-RaquelNeural'], 'zh-CN': [ 'zh-CN-XiaoxiaoNeural', 'zh-CN-XiaoyiNeural', 'zh-CN-YunjianNeural', - 'zh-CN-liaoning-XiaobeiNeural', - 'zh-CN-shaanxi-XiaoniNeural', 'zh-CN-YunxiNeural', 'zh-CN-YunxiaNeural', 'zh-CN-YunyangNeural', + 'zh-CN-liaoning-XiaobeiNeural', + 'zh-CN-shaanxi-XiaoniNeural', ], - 'zh-TW': ['zh-TW-HsiaoChenNeural', 'zh-TW-YunJheNeural', 'zh-TW-HsiaoYuNeural'], + 'zh-HK': ['zh-HK-HiuGaaiNeural', 'zh-HK-HiuMaanNeural', 'zh-HK-WanLungNeural'], + 'zh-TW': ['zh-TW-HsiaoChenNeural', 'zh-TW-HsiaoYuNeural', 'zh-TW-YunJheNeural'], }; const genVoiceList = (voices: Record) => {