背景是以前开发的叫号系统,最近发现了一个问题,就是多音字发音不正常。比如姓曾读成了céng,姓覃读成了tán,姓绮读成了qī ,姓缪读成了móu等等。
环境是
Windows 11 专业版
python 3.12.2
gTTS 2.5.1
pyttsx3 2.90
之前用的是pyttsx3 后面换成了gTTS ,也尝试过其他的tts引擎,问题仍然存在。示例代码如下:
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('rate', 100)
engine.setProperty('volume', 0.8)
engine.say("曾") # céng
engine.say("曾小姐") # céng
engine.say("曾思思") # céng
engine.say("曾叶") # céng
engine.say("曾小红") # zēng
engine.say("曾某某") # zēng
engine.runAndWait()
一般在文本转语音之前,可以进行预处理,比如去除标点符号和特殊字符、文本分词、指定词库拼音等,但是对于这个问题,预处理的成本显然不小。当然可以尝试更换其他的tts引擎,或使用第三方云厂商提供的接口,方式方法都有,只是成本偏高。
所以想了一个临时的解办法,汉字不光有多音字,还有同音字。比如: 曾同增,缪同庙,覃同勤等等,做一个简单的映射表,在发音之前替换一下。这个成本是最低的。如下
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('rate', 100)
engine.setProperty('volume', 0.8)
engine.say("增") # zēng
engine.say("增小姐") # zēng
engine.say("增思思") # zēng
engine.say("增叶") # zēng
engine.say("增小红") # zēng
engine.say("增某某") # zēng
engine.runAndWait()
至此,基本就解决了。