问题描述

讯飞语音合成有多个发音人,如何选择一个合适的发音人呢?我的解决方法是,选择符合要求的,然后每个都听一遍.最后选出一个合适的.

我的要求

我是用来朗读技术文章的,文章中要英文也有中文,所以我要选择支持中英文的发音人。发音人列表

符合我条件的发音人如下:

名称 属性 语言 参数名称 引擎参数 备注
小燕 青年女声 中英文(普通话) 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, String Input){this.voiceName = voiceName;this.fileName = fileName;this.Input = Input;}public void run(){// 3.创建一个SpeechSynthesizer对象SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer();// 4.合成参数设置,详见《MSC Reference Manual》SpeechSynthesizer 类// 设置发音人// 小燕 青年女声 中英文(普通话) xiaoyan 默认// 小研 青年女声 中英文(普通话) vixy// 小琪 青年女声 中英文(普通话) vixq xiaoqi// 小宇 青年男声 中英文(普通话) xiaoyu// 小峰 青年男声 中英文(普通话) vixf// 4-1 设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME, voiceName);//// 设置要下载的文件名mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语调,范围0~100mTts.setParameter(SpeechConstant.PITCH, "50");// 设置音量,范围0~100mTts.setParameter(SpeechConstant.VOLUME, "50");// TODO Auto-generated method stubSystem.out.println("    正在合成 " + fileName.substring(0, fileName.lastIndexOf("."))+ " 朗读样例" + " 下载位置:" + fileName);mTts.synthesizeToUri(Input, fileName, synthesizeToUriListener);}// 1 设置合成监听器static SynthesizeToUriListener synthesizeToUriListener = new SynthesizeToUriListener(){// progress为合成进度0~100public void onBufferProgress(int progress){}// 会话合成完成回调接口// uri为合成保存地址,error为错误信息,为null时表示合成会话成功public void onSynthesizeCompleted(String uri, SpeechError error){//表明下载完成isEnd=true;if(error==null)System.out.println("        合成成功");else System.out.println("        合成失败");}@Overridepublic void onEvent(int arg0, int arg1, int arg2, int arg3, Object arg4,Object arg5){// TODO Auto-generated method stub}};
}

主线程

package demo;
import java.util.Scanner;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechUtility;
import replace.Replace;
public class DemoList
{static Scanner scanner = new Scanner(System.in);public static void main(String[] args){// 2 将“XXXXXXXX”替换成您申请的APPIDSpeechUtility.createUtility(SpeechConstant.APPID + "=XXXXXXXX");// 5设置要合成的文本System.out.println("######################################## 讯飞语音合成系统 ########################################");System.out.println("输入要合成的文字(以: \"#exit\"作为结束符):");StringBuffer sbBuffer = new StringBuffer(10240);String line = null;while (scanner.hasNext()){line = scanner.nextLine();if ("#exit".equals(line)){break;}sbBuffer.append(line.concat("\r\n"));}System.out.println("---------------------------------- 特殊字符处理 ----------------------------------");// 处理输入文本,替换容易读错的特殊字符.String Input = Replace.replaceTitle(sbBuffer.toString());Input = Replace.replaceEnglish(Input);System.out.println(Input);System.out.println("---------------------------------- 特殊字符处理 ----------------------------------");String[] fileNameArr = new String[]{"小燕xiaoyan.pcm", "小研vixy.pcm", "小琪vixq.pcm", "小宇xiaoyu.pcm","小峰vixf.pcm"};String[] voiceNameArr = new String[]{"xiaoyan", "vixy", "vixq", "xiaoyu", "vixf"};for (int i = 0; i < fileNameArr.length; i++){DemoListRunable runable=new DemoListRunable(voiceNameArr[i], fileNameArr[i], Input);DemoListRunable.isEnd=false;Thread thread=new Thread(runable);thread.start();//等待下载完毕while(!DemoListRunable.isEnd){try{Thread.sleep(1000);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

其中Replace这个类用来预处理朗读的文本.包括替换容易读错的字符,添加空格以加入停顿等。代码参见讯飞语音合成 发音不准确怎么解决

实验结果

下载好音频后,逐个听一半,比较一番,我的到如下结果:

发音人 连贯性 英文准确性
小燕xiaoyan 可以 英文准确
小研vixy 可以 英文准确
小琪vixq 英文可能不准确
小峰vixf 慢没有节奏 英文发音不全
小宇xiaoyu 可以 英文发音不好

通过比较我发现:

  • 女发音人中,

    • 小燕xiaoyan小研vixy这两个发音人可以用,还有就是小燕xiaoyan(默认)读的时候有写破音,最后我选择小研vixy这个发音人。
    • 小琪vixq读的有点慢,但是中英文之间切换比较好。
  • 而男发音人小峰vixf小宇xiaoyu读英文的时候声音小不清晰,读音不标准。

具体情况还是以实验为主.

原文链接: 讯飞语音合成 如何选择发音人

讯飞语音合成 如何选择发音人相关推荐

  1. 讯飞语音合成 发音不准确怎么解决

    讯飞语音合成发音不准确怎么解决 替换要朗读文本中的容易读错的字符 首先讯飞语音合成我们是无法控制的,我们能控制的之后是自己传给他的文本.为了朗读效果,我这里通过替换掉一些容易读错的字符,加入空白符等方 ...

  2. 讯飞语音合成 下载音频Java Demo

    注册讯飞账号 略 实名认证 略 创建应用 添加语音合成服务 进入控制台,点击我的应用,然后添加语音合成服务(免费),并记下APPID 下载SDK 点击应用右侧的SDK下载 你将会下载到一个压缩包: 解 ...

  3. Android 讯飞语音合成

    . . 首先,需要先去科大讯飞官网申请帐号,以及创建应用,创建应用后可以进入我的应用查看APPID,并开通"讯飞语音合成"服务.然后下载对应的SDK,并进行以下步骤 http:// ...

  4. 讯飞语音合成和百度语音合成,粘贴就能用

    XFAudioComp 脚本中包含连接讯飞相关方法(其中讯飞使用Websocket  我使用的  BestHttp插件,插件在我资源里可以找到) using BestHTTP.WebSocket; u ...

  5. 讯飞语音合成andriod版本

    目录直达 1.成员变量声明 2.参数设置 3.获取离线资源 4.语音合成监听 5.调用方法合成语音 6.在onCreate中初始化合成对象 7.添加一个按钮 8.按钮按下监听 在离线命令的基础上,我们 ...

  6. uniapp使用讯飞语音合成

    uniapp使用讯飞语音合成 封装: // A code block var foo = 'bar'; var receiver = plus.android.implements('com.ifly ...

  7. 让计算机开口说话教案,生活创客系列教学设计:第十三节 利用讯飞语音合成技术让掌控板开口说话 —掌控板与讯飞语音合成...

    一.项目内容 项目背景:在同学们的作品中,都用到了物联网.同学们又提出了问题:联网后,同伴发来了文字信息,但我们不可能长期看着掌控板的屏幕,咋办?能否让掌控板把文字朗读出来? 可以!今天,我们就一起尝 ...

  8. 微信小程序实现讯飞语音合成

    参考文档:语音合成(流式版)WebAPI 文档 微信小程序背景音频播报可参考:uniapp实现微信小程序websocket+背景音频语音播报 实现步骤 注册讯飞账号,完成实名认证,获取应用appid ...

  9. Android应用开发接入讯飞语音合成

    前言: 在日常的生活中免不了要有一些指定的文字需要手机帮我们读出来,那这个时候我就需要考虑到怎么样才能让手机帮我们读出来呢? 实现的方法: 接下来我来说说实现的方法以及步骤,我们都知道Android原 ...

  10. C语言制作的讯飞语音合成、识别、唤醒标准调用接口DLL

    一 .导出函数: LIBRARY "XF_MSC" EXPORTS   addxy @1                //测试用的两数和函数   mystrcat @2      ...

最新文章

  1. 参数量110亿,附赠750GB数据集,Google提NLP预训练模型T5
  2. word2vec原理之CBOW与Skip-Gram模型基础
  3. 未找到要求的 from 关键字_性能优化|这恐怕是解释Explain关键字最全的一篇文章
  4. udf、utaf、udtf进出数量规律
  5. Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
  6. ini配置文件打开模式 r,r+等
  7. 073:【Django数据库】ORM聚合函数详解-Count
  8. 怎么修改打印机服务器权限,Win7如何设置网络打印机管理权限
  9. 中国神话--学术性研究
  10. 计算机任意字符替换,计算机excel通配符
  11. java木马_Java校验上传图片文件是否含有木马的两种方式
  12. kubernetes 实用 api list
  13. 中兴B863AV3.2-M_安卓9.0系统_线刷包及教程
  14. 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
  15. 关于error: multiple definition 的问题来源
  16. 从成交量变化抓住股票涨跌
  17. 苹果iOS 10的备份加密减弱:破解速度提升2500倍
  18. Unity 之 纹理类型导入设置和压缩格式介绍
  19. IC验证-浅谈中断验证(一)
  20. 暴雪战网安全令的原理

热门文章

  1. 四位共阳数码管与共阴数码管的c语言,4位共阳LED数码管与常用共阳极数码管型号...
  2. python语言三角函数_python中三角函数_Python中的三角函数
  3. 推荐10个堪称神器的学习网站
  4. 三种方法帮你恢复删除的文件
  5. 测试技术-兼容性测试
  6. pythonpost请求json_将JSON字符串作为post请求发送
  7. 网络唤醒 php,go实现网络唤醒远程开机(Wake on Lan)
  8. win7 插入鼠标自动禁用触摸板
  9. ibm量子云计算机,IBM量子云的16个量子比特全被纠缠起来了!
  10. 人脸关键点检测论文总结