如何在React Native应用中使用Python脚本实现离线语音识别及手机控制?
解决方案:React Native整合Vosk离线语音识别(完全离线)
核心思路
无需搭建独立Python服务器,直接在React Native应用中集成Vosk的移动端原生能力,通过社区封装的库或自定义原生桥接,在设备本地完成离线语音识别,同时用React Native处理所有手机控制逻辑。
步骤1:选用React Native Vosk封装库
优先使用维护活跃的社区封装库react-native-vosk,它已完成Vosk Android/iOS SDK的桥接,可直接实现离线识别功能。
安装与基础配置
- 安装库:
npm install react-native-vosk --save # 或使用yarn yarn add react-native-vosk
- React Native 0.60+版本会自动完成原生依赖链接,低版本需手动执行链接操作
- 准备离线模型:
- 下载对应语言的Vosk离线模型(如中文小模型
vosk-model-small-cn-0.22) - 将模型文件夹放入Android项目的
android/app/src/main/assets目录,以及iOS项目的ios/Resources目录
- 下载对应语言的Vosk离线模型(如中文小模型
步骤2:实现离线语音识别与控制逻辑
在React Native组件中初始化Vosk、加载本地模型,并处理语音识别结果触发手机控制操作:
import React, { useState, useEffect } from 'react'; import { View, Button, Text, Alert } from 'react-native'; import Vosk from 'react-native-vosk'; const VoiceControlScreen = () => { const [transcript, setTranscript] = useState(''); const [isListening, setIsListening] = useState(false); useEffect(() => { // 初始化Vosk并加载本地模型 const initVosk = async () => { try { // Android用'model'对应assets中的模型文件夹;iOS直接填模型文件夹名称 await Vosk.initialize('model'); } catch (err) { Alert.alert('初始化失败', err.message); } }; initVosk(); return () => Vosk.destroy(); // 组件卸载时清理Vosk实例 }, []); const toggleListening = () => { if (isListening) { Vosk.stopListening(); setIsListening(false); } else { setIsListening(true); Vosk.startListening({ onResult: (res) => setTranscript(res.text), onFinalResult: (finalRes) => { setTranscript(finalRes.text); setIsListening(false); // 处理识别出的语音指令 executeCommand(finalRes.text); }, onError: (err) => { Alert.alert('识别出错', err.message); setIsListening(false); } }); } }; const executeCommand = (command) => { // 这里编写手机控制逻辑,比如打开应用、调整系统设置等 if (command.includes('打开相机')) { // 调用React Native原生API或第三方相机库执行操作 console.log('执行打开相机操作'); } else if (command.includes('调低音量')) { // 调用系统音量控制API console.log('执行调低音量操作'); } else if (command.includes('返回主页')) { // 调用返回主页的原生逻辑 console.log('执行返回主页操作'); } }; return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 }}> <Text style={{ fontSize: 18, marginBottom: 30, textAlign: 'center' }}> 识别结果:{transcript || '等待语音输入...'} </Text> <Button title={isListening ? '停止识别' : '开始语音指令'} onPress={toggleListening} color={isListening ? '#ff4444' : '#2196f3'} /> </View> ); }; export default VoiceControlScreen;
步骤3:平台专属配置
Android端
- 在
AndroidManifest.xml添加权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 在
android/build.gradle中配置NDK支持:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } }
iOS端
- 在
Info.plist添加权限描述:
<key>NSSpeechRecognitionUsageDescription</key> <string>需要使用麦克风进行离线语音识别</string> <key>NSMicrophoneUsageDescription</key> <string>需要访问麦克风采集语音指令</string>
- 将模型文件夹添加到Xcode项目,勾选"Copy items if needed"并关联到目标APP
替代方案:自定义原生桥接
如果需要高度定制化功能,可自行编写React Native原生模块:
- Android:引入Vosk Android依赖,编写Java/Kotlin模块暴露识别接口给React Native
- iOS:通过CocoaPods引入Vosk iOS SDK,编写Objective-C/Swift模块封装识别逻辑
此方案工作量较大,仅适合有原生开发经验的场景。
关键注意事项
- 模型文件体积较大,可选择小体积模型平衡识别速度与精度,或在APP首次启动时引导用户下载
- 测试时需断开网络,验证离线识别功能是否正常
- 针对低性能设备,建议优化模型加载逻辑,避免启动卡顿
内容的提问来源于stack exchange,提问作者theaniketpatil
相关产品推荐
相关产品推荐

