谷歌Text-to-Speech是否过滤脏话?含敏感词汇的SSML/文本语音合成异常技术咨询
Google Text-to-Speech敏感词汇朗读异常问题解析
核心结论:确实存在内容过滤机制
先给你明确答案:Google Text-to-Speech内置了内容审核过滤机制,你提到的sex、condom、drug这类与性、毒品相关的敏感词汇,会被系统识别并触发特殊处理——这就是它们被拆成单个字母读、或者发音被篡改的原因。这种过滤是谷歌为了符合内容政策设置的,和你的代码逻辑无关(毕竟你测试过非敏感文本完全正常)。
为什么会出现这种奇怪的朗读方式?
谷歌的TTS系统会先对输入的文本/SSML做内容扫描,一旦检测到敏感词汇,就不会按照正常的单词发音来处理,而是通过拆分字母、修改发音的方式“弱化”敏感内容,避免直接读出这些词汇。你遇到的情况完全符合这个过滤逻辑。
可行的解决方向
如果你是在合法合规的场景下使用这些词汇(比如医疗科普、学术研究、正经的内容创作),可以试试这几个办法:
- 申请政策豁免:通过谷歌云的官方支持渠道提交申请,详细说明你的使用场景和必要性,请求针对特定词汇的过滤豁免。
- 替换专业术语:如果暂时没法申请豁免,可以换成更中性的专业表述,比如用
contraceptive代替condom,substance 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




