1、MYPCQQ的框架,提供了语音发送的API:Api_UploadVoice。语音发送全部基于此API实现。用途是上传一个amr语音文件。然后配合Api_SendMsg发送出去。用法很简单:
2、QQ所支持上传的语音,后缀要求为amr,但是注意,仅仅是后缀。其内在编码为silk,这个稍后讲。QQ发送语音的流程是,首先生成AMR后缀的语音,然后上传至腾讯服务器,服务器将这个语音数据流转发至各个用户。在转发过程中,服务器对语音数据没有效验,也没有修改。也就是说,如果你把一个MP3编码音频的后缀,修改为AMR,也可以成功上传到Q群并让大家接收到。但是,能够接收到,并不代表接收端能够正常播放。这就与各个消息接收端的解码有关系了。常见的接收端无非就是PC版,安卓版,IOS版,还有个轻聊版。在我的测试中,如果你真的发送了一个MP3编码的音频,那只有安卓的QQ客户端可以正常播放,其他均不行。比如下图就是发送一个MP3编码文件的结果,在PC端显示为一个1秒的音频,无法正常播放。而IOS端,则可以正常显示此音频的长度,但无法播放出声音。
3、但另一位插件作者冲天表示他的PC端可以播放,尚不确定是他的QQ版本原因还是其他骒貉缭塄原因,最新版QQ肯定是不行的。而如果你将一个真正的AMR编码的音频上传,那么安卓和IOS的QQ都可以正常播放。但电悲逻液徙脑端依然不能解码。因为QQ所支持的语音,虽然后缀是.amr,但实际音频编码是silk。如果你用记事本打开QQ语音的话,会发现文件头是“#!SILK_V3”,而不是AMR编码所应有的“#!AMR”。好了,前面说了这么多,就是想告诉很多尝试想要发送AMR音频的同学,为什么在发出的音频在电脑端不能播放。总之,想要发一个全平台都能正常播放的语音,就必须使用所有版本的QQ都支持的编码方式,那就是SILK编码。那么SILK编码是什么呢,这不是一个常见编码。他本身是Skype开发的一种用于VoIP的编码方式,适合于网络电话,优点是以非常低的比特率和丢包容错率来实现清晰的语音通话。通常是使用24KHz,25Kbps的码率。如果是MP3,到了此码率上基本已经严重失真了。把普通音频转为SILK格式,并没有现成的转换软件,格式工厂,转化大师之类的软件就不用去考虑了。不过,SILK的编解码是开源的。你们可以选择SILK_SDK_SRC_v1.0.9,这是最新的。源码是C语言的,所以需要安装一个GCC编译器来编译为EXE程序,当你下载了SILK SDK之后。test目录下有一个Encoder.c,这就是你要编译的源码,编译后就能得到一个SILK编码程序了。编译的过程百度一下GCC编译连接即可,命令行执行罢了。但是,这个简单的编码软件,并没有太高级的功能,所以他所支持的输入音频,必须为24KHz的PCM音源。下面就是语音时代插件所附带的编码软件的参数配置,这个与原始版是一样的。通常情况下,你不会想去修改输出音频的参数的,默认的就很好。顺便一说,语音时代的SILK编码器是他们二次开发过的,所以你无法直接使用。
4、如果是格式工厂,当然你转换频率的时候,他会完美的处理。而这个简单的编码软件不会。所以输入的PCM编码数据,如果不是24KHz,出来的音频就会严重失真。所以问题就来了。大家想要编码的音频源各种各样,可能是MP3,可能是AAC,可能是WAV,频率也可能是48K,22K怎么办?这里就需要另一个编码软件:ffmpeg。有研究过语音时代插件的同学可能已经发现了。在语音时代的组件包里,有ffmpeg.exe和VoiceEra_Encoder.exe两个可执行程序。ffmpeg可以说是各种编解码软件的核心,各种音频视频无一不能。(然而他不支持SILK。。。)那么,首先用ffmpeg把任意格式的音频文件,转换为24KHz的PCM即可。这里顺便一说。正常情况下的WAV后缀音频,用的就是PCM编码,只是多了WAV文件头而已。转换完之后,你就有了一个适合SILK编码的音频源了,此时再用先开始编译出的编码器转换即可。可以直接保存为.amr文件。原本如果是正常情况,这个silk编码的amr文件应该是可以正常播放了。但是!腾讯很无聊的,在他们的SILK编码时,加入了一个效验字符:^B,如下图。在文件最开头,有一个符号。正常的SILK音频是没有的。
5、而腾讯加上的^B这个间隔符很关键,如果一个SILK编码的AMR文件(说的好复杂),文件头第一个字符不是它,那么对不起,各版本的QQ都不会识别。所以,在先开始说的,编译Encoder.c时,你可能需要稍微微修改一下源码,让输出的音频,加上这么一个文件头。这样,输出的音频,你就可以使用Api_UploadVoice上传啦,并且所有版本的QQ都可以正常播放!到了这里,可能有人会说,不懂修改源码怎么办?没关系,你也可以修改标准SILK音频的字节集。Api_UploadVoice读入的是字节集,你只要在这个SILK音频的字节集最前方加上一个“2,”,QQ也可以正常识别这个音频文件啦!这样就简单很多了是不是?好了,原理解析到此结束。如果你想使用语音替换文字输出,那么流程就是3步:第一步获取合成语音mp3文件,百度就有提供接口,这个很简单。当然也可以使用歌曲啊什么的。第二步,用ffmpeg把任意音源转为24KHz的PCM源。第三步,用SILK编码器把这个PCM源转为SILK音频。发送!如果还是解决不了的话,就只有用语音时代喽。。我有空的话大概会写一个发送自定义音频的插件吧。不过语音合成我完全没计划。因为我在语音上研究了半天只是为了娇喘机器人而已。。。