讯飞语音合成发音不准确怎么解决
替换要朗读文本中的容易读错的字符
首先讯飞语音合成我们是无法控制的,我们能控制的之后是自己传给他的文本。为了朗读效果,我这里通过替换掉一些容易读错的字符,加入空白符等方式,来提高合成的效果。
点号读错的问题
问题描述
例如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; while ((titleFind = titleMatcher.find())) { if (titleFind) { line = titleMatcher.group(); line = line.replaceAll("\\.", "点"); titleMatcher.appendReplacement(sb, line); } } 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; boolean englishFind = false; while ((englishFind = englishMatcher.find())) { if (englishFind) {
line = " ".concat(englishMatcher.group()); englishMatcher.appendReplacement(sb, line); } } 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; while ((titleFind = titleMatcher.find())) { if (titleFind) { line = titleMatcher.group(); line = line.replaceAll("\\.", "点"); titleMatcher.appendReplacement(sb, line); } } 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; boolean englishFind = false; while ((englishFind = englishMatcher.find())) { if (englishFind) {
line = " ".concat(englishMatcher.group()); englishMatcher.appendReplacement(sb, line); } } englishMatcher.appendTail(sb); return sb.toString(); } public static void main(String[] args) { String text = "5.5.2 构造器重载";
System.out.println(replaceTitle(text)); } }
|
手动解决
合成音频后,肯定还是有不理想的地方,通过audition等音频编辑软件,做进一步的优化。