React Native Voice无法检测语音,onSpeechResults回调未触发求助
解决React Native Voice语音检测失效与NativeEventEmitter警告问题
可能的原因及解决方案
1. 版本兼容与缓存清理
这两个警告是因为RN Voice原生模块未实现addListener和removeListeners方法,大概率是版本和当前RN不兼容导致的。
- 先升级
react-native-voice到最新稳定版:npm install react-native-voice@latest --save # 用yarn的话执行:yarn add react-native-voice@latest - 升级后清理缓存并重新安装依赖:
npx react-native start --reset-cache cd ios && pod install && cd ..
2. 手动补充原生模块的EventEmitter方法(临时修复)
如果升级后警告还在,可以临时在原生代码里补全方法(优先升级,不推荐长期用这个方法):
- iOS端:找到项目里的
RCTVoice.m文件,添加:- (void)addListener:(NSString *)eventName {} - (void)removeListeners:(NSInteger)count {} - Android端:找到
VoiceModule.java文件,添加:
写完重新编译项目即可。@ReactMethod public void addListener(String eventName) {} @ReactMethod public void removeListeners(Integer count) {}
3. 核对语音权限配置
虽然isAvailable正常,但权限配置不全也会导致识别失败:
- iOS:在
Info.plist里添加麦克风和语音识别权限:<key>NSSpeechRecognitionUsageDescription</key> <string>需要使用语音识别功能</string> <key>NSMicrophoneUsageDescription</key> <string>需要访问麦克风</string> - Android:在
AndroidManifest.xml里添加:<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> - 代码里要主动请求权限:
import Voice from '@react-native-voice/voice'; const requestPermissions = async () => { try { await Voice.requestPermissions(); } catch (err) { console.error('权限请求失败', err); } };
4. 检查回调注册与清理逻辑
确认onSpeechResults的注册方式正确,且组件卸载时清理监听:
import Voice from '@react-native-voice/voice'; import { useEffect } from 'react'; useEffect(() => { Voice.onSpeechResults = (event) => { console.log('识别结果:', event.value); }; return () => { Voice.destroy().then(Voice.removeAllListeners); }; }, []);
别漏了卸载时的清理操作,不然可能导致内存泄漏,回调失效。
5. 排查设备系统级语音功能
有些设备可能系统本身的语音识别有问题:
- iOS:检查是否开启了「设置- Siri与搜索」里的语音识别功能
- Android:确保Google语音服务正常运行,可以用系统自带的语音输入测试能否识别,排除设备本身的问题
内容的提问来源于stack exchange,提问作者Nour
相关产品推荐
相关产品推荐

