react-native-bdVoice(百度长语音)
语音问答模块使用的是百度语音,在百度官网下载了百度语音的SDK,并封装成npm原生模块,使用的时候,只要npm install到自己的项目中,即可使用。长按按钮,开始讲话,松开按钮,停止录音,讲话的时候,实时将录音转换为文字。
我已经将该SDK封装完毕
语音包SDK(使用者无需关注)
封装该包需要从百度官网下载一个压缩包【audiobd_speech_sdk_asr_v3.0.6_bdasr_20171108_9800a2a_v3.zip】,不同时期名字会有所不同,解压后,找到如下几个文件
- 百度语音包:bdasr_V3_20171108_9800a2a.jar;
- 五个动态链接库包so文件
- 下载地址:点击我 或者 [http://ai.baidu.com/sdk#asr]
语音包提供的供RN使用的接口方法
- 开始录音:start();
- 结束录音:stop();
- 讲话期间监听事件名称:onScanningResult
- 取消录音:onDestroy();
##RN项目如何引入该包
- 在RN的package.json中添加:“xx-yy-voice”: “git+ssh://xxx.yyy.com:npm/xx-yy-voice.git”
- 命令行:$ npm i
- 命令行:$ react-native link xx-yy-voice
经过link之后,android/settings.gradle、android/app/build.gradle、android/app/src/main/java/com/[xxx]/MainApplication.java中会自动针对xx-yy-voice进行微妙的配置
##RN项目如何使用该包
1,在百度长语音平台创建一个应用
点击我开始创建,应用APP的我已经创建了。创建好的应用,百度会立马提供APP_ID、API_KEY、SECRET_KEY,然后将这些值配置在RN项目中的AndroidManifest.xml文件中:以本次APP为例,具体配置如下,其他的应用要记得修改上述提到的三个值,因为每个应用的这些值是不同的,在标签下添加如下子标签:
<meta-data android:name="com.baidu.speech.APP_WRONG_ID"
android:value="xxxyyyzzz---假的" />
<meta-data
android:name="com.baidu.speech.API_WRONG_KEY"
android:value="xxxyyyzzz---假的" />
<meta-data
android:name="com.baidu.speech.SECRET_WRONG_KEY"
android:value="xxxyyyzzz---假的" />
<service
android:name="com.baidu.speech.VoiceRecognitionService"
android:exported="false" />
2,同样在该AndroidManifest.xml文件中赋予该语音应用相关权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
3,引入相关联的包
import { NativeModules, DeviceEventEmitter } from 'react-native
4,在组件加载完成之后对“onScanningResult”事件进行监听
componentDidMount() {
DeviceEventEmitter.addListener('onScanningResult', this.XXXYYY.bind(this))
}
XXXYYY(e) {
let result = e.result
let json = result && result.includes('best_result') ? JSON.parse(result) : null
if (json) {
//业务逻辑,此处自行设计
console.log('json.best_result ========== ', json.best_result)
}
}
5,移除监听
componentWillUnmount() {
DeviceEventEmitter.removeListener('XXXYYY', this.XXXYYY)
}