问题描述
讯飞语音合成有多个发音人,如何选择一个合适的发音人呢?我的解决方法是,选择符合要求的,然后每个都听一遍.最后选出一个合适的.
我的要求
我是用来朗读技术文章的,文章中要英文也有中文,所以我要选择支持中英文的发音人。发音人列表
符合我条件的发音人如下:
名称 | 属性 | 语言 | 参数名称 | 引擎参数 | 备注 |
---|---|---|---|---|---|
小燕 | 青年女声 | 中英文(普通话) | xiaoyan | 默认 | |
小宇 | 青年男声 | 中英文(普通话) | xiaoyu | ||
小研 | 青年女声 | 中英文(普通话) | vixy | ||
小琪 | 青年女声 | 中英文(普通话) | vixq | xiaoqi | |
小峰 | 青年男声 | 中英文(普通话) | vixf |
无法直接循环下载
下面写个demo,要求输入一段文字,然后使用上述的多个发音人分别来合成.下载下来我再一个个的听,选出一个英文清晰,阅读节奏合适的发音人.
因为要批量下载,我首先想到的是,循环调用下载方法不就行了如下所示:
for (......)
{
// 3.创建一个SpeechSynthesizer对象
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer();
// 4.设置合成参数
......
mTts.synthesizeToUri(Input, fileName, synthesizeToUriListener);
}
但是我失败了,这样并不会合成多个音频。只会合成一个。经过测试之后,我发现,调用完毕下载方法后,主线程就结束了.
…最后经过一番思索解决方案如下.
创建下载线程
线程的知识我有点忘了,合成音频的方法最后会回调onSynthesizeCompleted
这个方法,我在下载线程DemoListRunable
中设置一个isEnd标记,当开始下载一个音频的时候,把isEnd设置为flase,下载完毕后设置为true.
在主线程中,通过不断的来查询这个标记,从而知道是否下载完毕。
package demo;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechError;
import com.iflytek.cloud.speech.SpeechSynthesizer;
import com.iflytek.cloud.speech.SynthesizeToUriListener;
public class DemoListRunable implements Runnable
{
public static boolean isEnd=false;
String fileName;
String Input;
String voiceName;
public DemoListRunable(String voiceName, String fileName,