文本转语音,我这里会用到讯飞的SDK。讯飞官网,此链接直接进入他们的服务页面。
注册一个账号,然后添加一个应用,会得到一个appid,程序里会用到。
然后下载他们的SDK,会用到里面的这些文件。
这里提一下我项目的名称,可能看着有点奇怪,为什么取个名字叫spider。这是因为这个项目是我前几天刚写的爬虫爬了一下各个手机号段的归属地,我捡了下懒,就直接在这里面开整了。
接着来,看阅读文档中的这一段。
这里,可以看到会生成一个pcm文件。pcm文件并不是你最终想要的音频文件,它不能播放,你需要把它转成wav格式音频文件。pcm文件是一个记录语音脉冲编码的文件,至于它跟wav的关系与区别,我在网上看了下,说的不是太通俗易懂,也不是看的太明白,也没深究,因为我觉得这不是重点。如果硬要去理解一下呢,我觉得可以这样类比,就好比java源码与class文件关系区别,系统播放器认识wav,但不认识pcm。虚拟机认识class,但不认识java源码,不知道类比的有没有问题,但我觉得可以先这样类比。
那么如何把pcm转成wav格式的文件呢!?这才是重点
合成监听器有个方法onSynthesizeCompleted,这是监听生成pcm文件后的回调方法。在该方法中调用pcm转wav的方法。
上图中标红的方法是一个比较特殊的方法。作用是向wav文件中写入特定的其需要的头信息。
public byte[] getWAVHeader(long fileLeng, int srate, int channel, int format) {
byte[] header = new byte[44];
long totalDataLen = fileLeng + 36;
long bitrate = srate * channel * format;
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = (byte) format;
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1;
header[21] = 0;
header[22] = (byte) channel;
header[23] = 0;
header[24] = (byte) (srate & 0xff);
header[25] = (byte) ((srate >> 8) & 0xff);
header[26] = (byte) ((srate >> 16) & 0xff);
header[27] = (byte) ((srate >> 24) & 0xff);
header[28] = (byte) ((bitrate / 8) & 0xff);
header[29] = (byte) (((bitrate / 8) >> 8) & 0xff);
header[30] = (byte) (((bitrate / 8) >> 16) & 0xff);
header[31] = (byte) (((bitrate / 8) >> 24) & 0xff);
header[32] = (byte) ((channel * format) / 8);
header[33] = 0;
header[34] = 16;
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (fileLeng & 0xff);
header[41] = (byte) ((fileLeng >> 8) & 0xff);
header[42] = (byte) ((fileLeng >> 16) & 0xff);
header[43] = (byte) ((fileLeng >> 24) & 0xff);
return header;
}
至此,就会在桌面生成一个可以播放的wav格式的音频文件。
有了wav文件就简单了,只需在后台页面添加<video><source></source></video>标签,在source标签中加属性src,路径为你的音频文件就行。不过,指向自己电脑里的文件可能会有问题。我们这项目指向的都是测试环境的文件。
本文的代码会显得有点粗糙,我只是想记录怎么文本转语音,并没有去优化自己的代码。
本文部分参考了这篇博客。
结尾再记录下自己遇到的一个小问题:
因为这个项目本来是我用springboot搭起来弄爬虫的,当时代码里有这一行代码,
因为加了这一行代码,死都没有生成那个pcm文件,又回去看文档,是不是我哪里看漏了,百度别人的博客吧啦吧啦的,结果还是没卵用。对着自己的代码发呆了半天,突然感觉一道灵光照下,感觉就是它的问题,把它注释了,结果就好了。我tm。。。。,容我写两行代码压压惊。最终原因应该就是,还没开始写pcm文件,程序就显示调用退出了。