讯飞语音合成 如何选择发音人
问题描述
讯飞语音合成有多个发音人,如何选择一个合适的发音人呢?我的解决方法是,选择符合要求的,然后每个都听一遍.最后选出一个合适的.
我的要求
我是用来朗读技术文章的,文章中要英文也有中文,所以我要选择支持中英文的发音人。发音人列表
符合我条件的发音人如下:
名称 | 属性 | 语言 | 参数名称 | 引擎参数 | 备注 |
---|---|---|---|---|---|
小燕 | 青年女声 | 中英文(普通话) | 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
读英文的时候声音小不清晰,读音不标准。
具体情况还是以实验为主.
原文链接: 讯飞语音合成 如何选择发音人
讯飞语音合成 如何选择发音人相关推荐
- 讯飞语音合成 发音不准确怎么解决
讯飞语音合成发音不准确怎么解决 替换要朗读文本中的容易读错的字符 首先讯飞语音合成我们是无法控制的,我们能控制的之后是自己传给他的文本.为了朗读效果,我这里通过替换掉一些容易读错的字符,加入空白符等方 ...
- 讯飞语音合成 下载音频Java Demo
注册讯飞账号 略 实名认证 略 创建应用 添加语音合成服务 进入控制台,点击我的应用,然后添加语音合成服务(免费),并记下APPID 下载SDK 点击应用右侧的SDK下载 你将会下载到一个压缩包: 解 ...
- Android 讯飞语音合成
. . 首先,需要先去科大讯飞官网申请帐号,以及创建应用,创建应用后可以进入我的应用查看APPID,并开通"讯飞语音合成"服务.然后下载对应的SDK,并进行以下步骤 http:// ...
- 讯飞语音合成和百度语音合成,粘贴就能用
XFAudioComp 脚本中包含连接讯飞相关方法(其中讯飞使用Websocket 我使用的 BestHttp插件,插件在我资源里可以找到) using BestHTTP.WebSocket; u ...
- 讯飞语音合成andriod版本
目录直达 1.成员变量声明 2.参数设置 3.获取离线资源 4.语音合成监听 5.调用方法合成语音 6.在onCreate中初始化合成对象 7.添加一个按钮 8.按钮按下监听 在离线命令的基础上,我们 ...
- uniapp使用讯飞语音合成
uniapp使用讯飞语音合成 封装: // A code block var foo = 'bar'; var receiver = plus.android.implements('com.ifly ...
- 让计算机开口说话教案,生活创客系列教学设计:第十三节 利用讯飞语音合成技术让掌控板开口说话 —掌控板与讯飞语音合成...
一.项目内容 项目背景:在同学们的作品中,都用到了物联网.同学们又提出了问题:联网后,同伴发来了文字信息,但我们不可能长期看着掌控板的屏幕,咋办?能否让掌控板把文字朗读出来? 可以!今天,我们就一起尝 ...
- 微信小程序实现讯飞语音合成
参考文档:语音合成(流式版)WebAPI 文档 微信小程序背景音频播报可参考:uniapp实现微信小程序websocket+背景音频语音播报 实现步骤 注册讯飞账号,完成实名认证,获取应用appid ...
- Android应用开发接入讯飞语音合成
前言: 在日常的生活中免不了要有一些指定的文字需要手机帮我们读出来,那这个时候我就需要考虑到怎么样才能让手机帮我们读出来呢? 实现的方法: 接下来我来说说实现的方法以及步骤,我们都知道Android原 ...
- C语言制作的讯飞语音合成、识别、唤醒标准调用接口DLL
一 .导出函数: LIBRARY "XF_MSC" EXPORTS addxy @1 //测试用的两数和函数 mystrcat @2 ...
最新文章
- 参数量110亿,附赠750GB数据集,Google提NLP预训练模型T5
- word2vec原理之CBOW与Skip-Gram模型基础
- 未找到要求的 from 关键字_性能优化|这恐怕是解释Explain关键字最全的一篇文章
- udf、utaf、udtf进出数量规律
- Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
- ini配置文件打开模式 r,r+等
- 073:【Django数据库】ORM聚合函数详解-Count
- 怎么修改打印机服务器权限,Win7如何设置网络打印机管理权限
- 中国神话--学术性研究
- 计算机任意字符替换,计算机excel通配符
- java木马_Java校验上传图片文件是否含有木马的两种方式
- kubernetes 实用 api list
- 中兴B863AV3.2-M_安卓9.0系统_线刷包及教程
- 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
- 关于error: multiple definition 的问题来源
- 从成交量变化抓住股票涨跌
- 苹果iOS 10的备份加密减弱:破解速度提升2500倍
- Unity 之 纹理类型导入设置和压缩格式介绍
- IC验证-浅谈中断验证(一)
- 暴雪战网安全令的原理
热门文章
- 四位共阳数码管与共阴数码管的c语言,4位共阳LED数码管与常用共阳极数码管型号...
- python语言三角函数_python中三角函数_Python中的三角函数
- 推荐10个堪称神器的学习网站
- 三种方法帮你恢复删除的文件
- 测试技术-兼容性测试
- pythonpost请求json_将JSON字符串作为post请求发送
- 网络唤醒 php,go实现网络唤醒远程开机(Wake on Lan)
- win7 插入鼠标自动禁用触摸板
- ibm量子云计算机,IBM量子云的16个量子比特全被纠缠起来了!
- 人脸关键点检测论文总结