You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

谷歌Text-to-Speech是否过滤脏话?含敏感词汇的SSML/文本语音合成异常技术咨询

Google Text-to-Speech敏感词汇朗读异常问题解析

核心结论:确实存在内容过滤机制

先给你明确答案:Google Text-to-Speech内置了内容审核过滤机制,你提到的sexcondomdrug这类与性、毒品相关的敏感词汇,会被系统识别并触发特殊处理——这就是它们被拆成单个字母读、或者发音被篡改的原因。这种过滤是谷歌为了符合内容政策设置的,和你的代码逻辑无关(毕竟你测试过非敏感文本完全正常)。

为什么会出现这种奇怪的朗读方式?

谷歌的TTS系统会先对输入的文本/SSML做内容扫描,一旦检测到敏感词汇,就不会按照正常的单词发音来处理,而是通过拆分字母、修改发音的方式“弱化”敏感内容,避免直接读出这些词汇。你遇到的情况完全符合这个过滤逻辑。

可行的解决方向

如果你是在合法合规的场景下使用这些词汇(比如医疗科普、学术研究、正经的内容创作),可以试试这几个办法:

  • 申请政策豁免:通过谷歌云的官方支持渠道提交申请,详细说明你的使用场景和必要性,请求针对特定词汇的过滤豁免。
  • 替换专业术语:如果暂时没法申请豁免,可以换成更中性的专业表述,比如用contraceptive代替condomsubstance use代替drug,这类术语一般不会触发过滤。
  • 切换语音模型:不同的Wavenet模型对敏感词汇的处理可能略有差异,你可以试试换个en-US的语音模型(比如en-US-Wavenet-D)测试,但这不能保证完全绕过过滤,只能作为临时尝试。

代码细节确认

你的代码本身没有问题,这里再帮你核对几个可能的细节:

  • 你用ssmlCheck.check做了SSML语法验证,这点很到位,排除了语法错误导致的发音异常;
  • enableTimePointing参数只是用来生成时间点标记,和词汇的发音处理没有关系,不用怀疑这个参数的影响。

附上你提供的问题示例文本:

"I told her about abstinence, cоndоm , everything."
"Did you mention oral sеx as a work-around?"
"what with all my drinking and drսg and dealing and managing an international escort service with ties to the Russian mob"

以及你的代码片段:

const textToSpeech = require("@google-cloud/text-to-speech").v1beta1;
const fs = require("fs");
const util = require("util");
async function speech(text, name) {
  var error = await ssmlCheck.check(text);
  const client = new textToSpeech.TextToSpeechClient();
  var request = {
    input: {
      ssml: text,
    },
    voice: {
      languageCode: "en-US",
      name: "en-US-Wavenet-E",
      ssmlGender: "FEMALE",
    },
    audioConfig: {
      audioEncoding: "MP3",
    },
    enableTimePointing: ["SSML_MARK"],
  };
  const [response] = await client.synthesizeSpeech(request);
  const writeFile = util.promisify(fs.writeFile);
  await writeFile(name + ".mp3", response.audioContent, "binary");
  await writeFile(name + ".json", JSON.stringify(response.timepoints));
}

内容的提问来源于stack exchange,提问作者H.X. Wang

火山引擎 最新活动