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

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

替换要朗读文本中的容易读错的字符

首先讯飞语音合成我们是无法控制的,我们能控制的之后是自己传给他的文本。为了朗读效果,我这里通过替换掉一些容易读错的字符,加入空白符等方式,来提高合成的效果。

点号读错的问题

问题描述

例如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
23
public 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static String replaceEnglish(String text)
{
Pattern englishPattern = Pattern.compile("[a-zA-Z]+");
Matcher englishMatcher = englishPattern.matcher(text);
StringBuffer sb = new StringBuffer();
String line = null;
// find()方法向前查找匹配的子串
boolean englishFind = false;
while ((englishFind = englishMatcher.find()))
{
if (englishFind)
{
// 获取位置在匹配子串之前的文本strbefore,获取匹配的子串strmacther,然后把匹配的子串strmacther替换为replacement,
// 然后(strbefore+replacement)追加到StringBuffer中
// line = "`".concat(englishMatcher.group().concat("`"));
// line = "`".concat(englishMatcher.group());//这个效果还行
line = " ".concat(englishMatcher.group());//这个效果也还行
englishMatcher.appendReplacement(sb, line);
}
}
// 把文本中没有匹配的剩下的文本也加入到StringBuffer中
englishMatcher.appendTail(sb);
return sb.toString();
}

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package replace;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Replace
{
public 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();
}
public static String replaceEnglish(String text)
{
Pattern englishPattern = Pattern.compile("[a-zA-Z]+");
Matcher englishMatcher = englishPattern.matcher(text);
StringBuffer sb = new StringBuffer();
String line = null;
// find()方法向前查找匹配的子串
boolean englishFind = false;
while ((englishFind = englishMatcher.find()))
{
if (englishFind)
{
// 获取位置在匹配子串之前的文本strbefore,获取匹配的子串strmacther,然后把匹配的子串strmacther替换为replacement,
// 然后(strbefore+replacement)追加到StringBuffer中
// line = "`".concat(englishMatcher.group().concat("`"));
// line = "`".concat(englishMatcher.group());//这个效果还行
line = " ".concat(englishMatcher.group());//这个效果也还行
englishMatcher.appendReplacement(sb, line);
}
}
// 把文本中没有匹配的剩下的文本也加入到StringBuffer中
englishMatcher.appendTail(sb);
return sb.toString();
}
public static void main(String[] args)
{
String text = "5.5.2 构造器重载";
// StringBuffer sb=new StringBuffer(text);
// replaceTitle(text);
// System.out.println(replaceTitle(text));
// String text = "java.lang.Object";
System.out.println(replaceTitle(text));
}
}

手动解决

合成音频后,肯定还是有不理想的地方,通过audition等音频编辑软件,做进一步的优化。