AWS Polly语音标记文件自定义图片标签问题求助
解决AWS Polly句子标记冗余标签问题
问题根源
AWS Polly在处理嵌入自定义标记的文本时,会自动插入prosody类SSML标签维持语音输出连贯性,导致生成的Sentence类型语音标记的value字段混入这些冗余标签内容。
解决方案建议
预处理输入文本,分离标记与纯文本
先剥离输入文本中的自定义图片标签(如{image1}),得到纯文本内容单独用于生成Sentence标记;保留含自定义标签的原文本(转换为Polly支持的<mark>标签格式)用于生成语音和SSML标记。这样Sentence标记的value就只会包含纯文本内容。
示例Java代码:// 原始输入文本 String originalText = "This is a {image1} dinosaur"; // 预处理:剥离自定义标签,用于生成Sentence标记 String pureTextForSentence = originalText.replaceAll("\\{[^}]+\\}", "").trim(); // 将自定义标签转换为Polly支持的SSML <mark>标签 String ssmlText = "<speak>" + originalText.replace("{", "<mark name='").replace("}", "'/>") + "</speak>"; // 构建合成请求 SynthesizeSpeechRequest request = new SynthesizeSpeechRequest() .withTextType(TextType.SSML) .withText(ssmlText) .withOutputFormat(OutputFormat.MP3) .withVoiceId(VoiceId.Joanna) .withSpeechMarkTypes(SpeechMarkType.SSML, SpeechMarkType.SENTENCE);后处理标记结果,清理冗余内容
若无法预处理文本,在获取到Sentence标记结果后,对每个标记的value字段进行字符串清洗,移除冗余的SSML标签片段。
示例Java代码:// 假设已获取到SpeechMark列表 List<SpeechMark> speechMarks = ...; // 从Polly响应中获取的标记列表 List<CustomCleanedMark> cleanedMarks = new ArrayList<>(); for (SpeechMark mark : speechMarks) { if (SpeechMarkType.SENTENCE.toString().equals(mark.getType())) { // 移除prosody和mark标签 String cleanedValue = mark.getValue() .replaceAll("</?prosody[^>]*>", "") .replaceAll("<mark name='[^']+'/>", "") .trim(); // 存储清理后的标记(需自定义类,因为SpeechMark是不可变类) cleanedMarks.add(new CustomCleanedMark( mark.getTime(), mark.getType(), cleanedValue, mark.getStart(), mark.getEnd() )); } else { cleanedMarks.add(new CustomCleanedMark( mark.getTime(), mark.getType(), mark.getValue(), mark.getStart(), mark.getEnd() )); } } // 自定义存储清理后标记的类 static class CustomCleanedMark { private long time; private String type; private String value; private Integer start; private Integer end; // 构造方法、getter/setter省略 }替换自定义标签为Polly原生标记格式
直接将自定义的{image1}替换为Polly支持的<mark name='image1'/>标签,避免Polly自动生成额外的prosody标签。这种方式需要确保输入文本采用SSML格式提交,能减少冗余标签的生成概率,但仍需配合预处理或后处理确保Sentence标记的value纯净。
内容的提问来源于stack exchange,提问作者C96
相关产品推荐
相关产品推荐

