使用react-native-audio进行华为云语音交互服务(实时语音转写)大致流程

基础前端框架:react-native
语音交互服务:华为云

1、react-native-audio录制音频

华为云支持的音频编码格式如下表:
一共有六种,但是一般用下表的前两种,即不压缩的裸音频格式

audio_format取值说明
pcm16k16bit16k16bit单通道录音数据。
pcm8k16bit8k16bit单通道录音数据。
 audioPath = AudioUtils.DownloadsDirectoryPath + '/luyin.aac'; //路径下的文件名
 AudioRecorder.prepareRecordingAtPath(audioPath, {
            SampleRate: 16000,            //采样率
            Channels: 1,                  //通道
            AudioQuality: "High",         //音质(Low, Medium, High)
            AudioEncoding: "aac",         //音频编码(aac编码iOS和Android均支持)
            AudioEncodingBitRate: 256000,  //音频编码比特率
            IncludeBase64: true,          //是否是base64格式
        });

最后发现react-native-audio录出来的音频编码不符合,需要在服务端再转一次音频编码。

2、react-native-fs分片读取录音文件转为base64

计算方式:
16000采样率: 1s音频 16000采样点
16bits: 一个采样点 16bits = 2 bytes
1s : = 1000ms
即 100ms * 16000 * 2bytes / 1000ms = 3200bytes

ITEM_SIZE = 3200;
RNFS.read(audioPath, ITEM_SIZE, ITEM_SIZE*itemIndex, "base64")
.then()
.catch()
3、base64转化为二进制数据
function base64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
       const base64 = (base64String + padding)
                    .replace(/\-/g, '+')
                    .replace(/_/g, '/');

       const rawData = window.atob(base64);
       const outputArray = new Uint8Array(rawData.length);

       for (let i = 0; i < rawData.length; ++i) {
            outputArray[i] = rawData.charCodeAt(i);
       }
       return outputArray;
}
4、 使用websocket与服务端交互

举例:华为云-实时语音转写连续模式-websocket握手

交互流程:

握手成功——发出开始指令——传输二进制数据——接收文本数据——…——发出结束指令——握手结束

实时语音识别api WebSocket协议:
0.0s: 【连接】发起WebSocket请求
0.1s: 【连接】连接建立
0.1s: 【发送开始参数帧】发送鉴权及识别参数
0.1s-0.2s: 【本地】录制100ms的录音
0.2s: 【发送音频数据帧】发送上面100ms的录音数据到服务器
0.2s-0.3s: 【本地】录制100ms的录音
0.3s: 【发送音频数据帧】发送上面100ms的录音数据到服务器

1.2s-1.3s: 【本地】录制100ms的录音
1.3s: 【发送音频数据帧】发送上面100ms的录音数据到服务器
1.31s:【接收结果】收到0s-1s这段语音的一句话临时识别结果

4.2-4.3s: 【本地】录制100ms的录音
4.3s: 【发送音频数据帧】发送上面100ms的录音数据到服务器
4.39s:【接收结果】收到0s-4.1s这段语音的一句话最终识别结果

9.9s-10.0s: 【本地】录制100ms的录音
10.0s: 【发送音频数据帧】发送上面100ms的录音数据到服务器
10.0s: 【发送结束帧】 告知服务端音频结束
10.3s:【接收结果】收到7.1-10.0 这段语音的一句话最终识别结果

5、websocket发送二进制数据
websocket.binaryType = 'arraybuffer';
webSocket.send(arrayBuffer);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值