讯飞语音合成发音不准确怎么解决
替换要朗读文本中的容易读错的字符
首先讯飞语音合成我们是无法控制的,我们能控制的之后是自己传给他的文本。为了朗读效果,我这里通过替换掉一些容易读错的字符,加入空白符等方式,来提高合成的效果。
点号读错的问题
问题描述
例如java.lang.Object
,我们读成java点lang点Object
。但是发音人不一定会把.
读成点
。
解决方案
合成之前先对字符串进行替换
- 对于java包名(或类全名),例如:
java.lang.Object
先自行替换成java点lang点Object
。 - 对于文章标题,如
5.5.5 XXXXX
先自行替换成5点5点5 XXXXX
替换方法
首先通过正则表达式进行匹配,然后匹配到的文本中的点号.
替换成中文点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public static String replaceTitle(String text)
{
Pattern titlePattern = Pattern.compile("\\w+(?:(\\.)(?:\\w+))+");
Matcher titleMatcher = titlePattern.matcher(text);
StringBuffer sb = new StringBuffer();
String line = null;
boolean titleFind = false;
// find()方法向前查找匹配的子串
while ((titleFind = titleMatcher.find()))
{
if (titleFind)
{
// 获取位置在匹配子串之前的文本strbefore,获取匹配的子串strmacther,然后把匹配的子串strmacther替换为replacement,
// 然后(strbefore+replacement)追加到StringBuffer中
line = titleMatcher.group();
line = line.replaceAll("\\.", "点");
titleMatcher.appendReplacement(sb, line);
}
}
// 把文本中没有匹配的剩下的文本也加入到StringBuffer中
titleMatcher.appendTail(sb);
return sb.toString();
}
中英混合英文读不清楚的问题
问题描述
中文和英文混合的时候,当从中文读到英文然后读到中文时,发音人可能会把英文读错,经过测试之后.
在英文签名加上空格
经过我的反复实验,发现在每个英文前面加上一个空格
,这个时候英文朗读会比较清晰.
替换方法
1 | public static String replaceEnglish(String text) |
完整代码
1 | package replace; |
手动解决
合成音频后,肯定还是有不理想的地方,通过audition等音频编辑软件,做进一步的优化。