语音接入
考虑到pc与ios、android三端的混服情况,所有录音的格式均存储为mp3格式,也是unity推荐的音频文件方式
前提:目前比较成熟的语音模块由科大讯飞平台提供的,目前我们需要的功能是把语音转化成文字,因此我们只需要下载相应的语音识别模块就可以了。
1)进入科大讯飞官网下载相应平台的sdk,目前我们只需要免费的语音识别就可以了,要创建相应的应用才能下载,里面的demo提供边录音边翻译的功能。
2)pc端的没有提供边录边能,要想在pc版进行录音可引入第三方库进行录音或者使用unity提供的microphone进行录音也可以的
1 pc端录音以及识别
1.1 录音:
方法一:unity本身有microphone录制功能,存储在AudioClip,这是原生态数据比较大,我们需要保存成相应的wav文件,再转成mp3发给服务器.
要根据服务器的协议发送大小,随时更改录制的参数, 主要录制功能代码 Microphone.Start(),一般移动端都适合录制10s,sample_rate(采样率) = 8000
的设置即可. mp3录制的参数的bitRate尽量设置为 16位(影响mp3文件大小的主要参数),不懂这些参数可参考以下链接,代码里面会有设置。
AudioClip存为wav参考链接:
http://www.lxway.com/812992244.htm
wav转成mp3参考链接:
https://github.com/Corey-M/NAudio.Lame
http://www.codeproject.com/Articles/5901/C-MP3-Compressor
http://stackoverflow.com/questions/19058530/change-format-from-wav-to-mp3-in-memory-stream-in-naudio
方法二:利用NAudio 录制,是利用.net里面的录音功能,同时压缩mp3也需要利用这里的库文件进行解析wav格式等等。
1.2 注意的问题:
1.2.1 NAudio 主要录制的功能waveIn,录制的时候往往需要获取声音的大小,以便录音者调整音量大小. waveIn有个事件回调,根据刷新频率传回相应的文件数据,此时只需要只能通过相应的数据来获取音量大小,可在一下源码进行获取观看。
http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=10182
1.2.1 NAudio waveOut是可用来播放mp3,但是没有源码播放、暂停、停止均不会设置回来状态。
2、 android录音以及存储、语音识别
2.1 目前没有和pc,ios混服 因此采用科大讯飞进行边录边翻译功能,暂时采用的存储方式是.amr,如果需要混服我们需要把它压缩成mp3格式,科大讯飞支持录制两种方式wav
和pcm,我们只需要在unity利用和pc端一样的压缩原理把它压缩成mp3即可.
步骤: 需要到科大讯飞开发者网站 创建应用下载相应的sdk,源码主要是在IatDemo里面
原理: 讯飞支持把语音数据分段发送进行识别,主要是边录边把数据进行发送识别,录音是采用android本身的录音。主要类是IatDemo
问题:讯飞提供的SpeechRecognizer主要是普遍反映录的声音较小,改变手机的音量会导致游戏的声音同时改变,解决办法:在录音提高系统音量,录完再回复原来音量
2.2 pcm或者wav转成mp3
同样是使用lame mp3库,主要采用 java与 C之间的交互生成相应的so文件(主要是调用lame mp3库方法),录音成pcm采用该so文件进行压缩即可,这个方法把安全容易造成某些机型闪退,不建议采用,尽量采用和pc端一样的压缩方式.
3 ios的原理和android差不多,只不过他有.a库,我们尽量不在XCode工程里面做压缩,ios、pc、android尽量采用统一方式在Unity层进行压缩即可。