react-native-tts设置hi-IN报语言不支持、语音不存在错误如何解决
React Native TTS 印地语播报报错排查方案
两个报错的核心原因是硬编码语言/语音参数前未校验设备实际支持情况,且未等待TTS引擎初始化完成,react-native-tts不会自动下载缺失的系统语音包,iOS、Android的语言码规则、语音标识存在平台差异,直接写死hi-IN或iOS专属语音id很容易触发异常,按以下步骤排查修复:
1. 修正初始化逻辑,先拉取设备实际支持的资源
不要在组件顶层直接调用TTS设置方法,必须等TTS引擎初始化完成后,先拉取设备当前已安装的语言、语音列表,匹配到印地语资源后再设置参数,参考代码:
import React, { useEffect } from 'react' import { Button, View } from 'react-native' import Tts from 'react-native-tts' const Home = () => { useEffect(() => { // 等待TTS引擎初始化完成再执行配置 Tts.getInitStatus().then(() => { // 获取设备所有支持的TTS语言 Tts.languages().then(supportedLangs => { console.log('设备支持语言列表:', supportedLangs) // 获取设备所有已安装的语音包 Tts.voices().then(availableVoices => { console.log('设备可用语音列表:', availableVoices) // 匹配印地语相关资源,不要硬写hi-IN,部分设备返回hi或hi_IN格式 const hindiVoice = availableVoices.find(voice => voice.language.toLowerCase().startsWith('hi')) if (!hindiVoice) { console.log('当前设备未安装印地语TTS语音包') return } // 用接口实际返回的参数设置,不要硬编码 Tts.setDefaultLanguage(hindiVoice.language) Tts.setDefaultVoice(hindiVoice.id) }) }) }).catch(err => { console.log('TTS初始化异常:', err) }) }, []) return ( <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}> <Button title="Speak!" onPress={() => Tts.speak('वहां कोई है?')} /> </View> ) } export default Home
2. 分平台补全缺失的语音资源
如果打印的列表里找不到印地语相关项,按对应平台安装语音包:
- iOS端:进入系统「设置-辅助功能-朗读内容-嗓音」,找到印地语分类,手动下载Lekha系列语音包,下载完成后重启App即可识别到对应资源。注意你注释里的
com.apple.ttsbundle.Lekha-compact是iOS专属语音id,必须等下载完成后才能生效,提前硬写会直接触发「selected voice was not found」报错。 - Android端:首先确认系统默认TTS引擎为「Google文字转语音引擎」(部分厂商自带TTS不支持印地语),切换后进入Google TTS设置页,下载印地语(印度)语音包。注意安卓端印地语语言码通常为下划线分隔的
hi_IN,和iOS的横杠格式hi-IN不一致,硬写横杠格式会触发「Language is not supported」报错。
避坑提醒
所有TTS参数配置逻辑必须放在
Tts.getInitStatus()的成功回调中执行,模块顶层代码执行时TTS引擎还未完成初始化,哪怕设备已安装对应语音包,也可能偶发识别失败报错。
禁止跨平台硬编码语音id,iOS和安卓的语音资源命名规则完全不同,写死iOS的语音id在安卓端运行必然报错。
内容的提问来源于stack exchange,提问作者saikumar
相关产品推荐
相关产品推荐

