You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:12:29