python-pinyin
python-pinyin copied to clipboard
pypinyin标注准确率测评结果
最近写了一个程序并利用thchs30语料库的拼音标注粗略地对python-pinyin标注的准确性进行评估,供大家参考。
准确率:约96%【仅供参考,不保证准确性】
其中,错误次数最高的词如下:
一 232
为 83
不 80
得 36
子 34
上 25
个 23
十 20
可 19
有 19
儿 17
来 17
所 15
地 14
长 13
尽 11
曲 11
谁 10
老 9
也 9
颇 8
往 8
育 8
是 8
两 8
只 8
分 8
种 8
佛 7
百 7
thchs30将不少字按照实际音频发音标注成轻声,并且thchs30将两个三声连读的词中第一个标注为二声,这两个是主要误差
@Jackiexiao 感谢分享!
@mozillazg
还有一种情景不一致,比如词语: ‘表演’ ‘你好’
这种两个第三声组合的词,正确的发音是首字读第二声.
pypinyin出来的结果是'biao3 yan3'、'ni3 hao3'
而thchs30中的标注是'biao2 yan3'、'ni2 hao3'
因为要借助pypinyin和thchs30来实现中文AI TTS,匹配不正确会引发异常.
这种情况能否修正呢?
只能是修改词典,或者借助正确的分词来将两个三声连读的第一个三声变二声情况纠正。
现实生活中都是读第三声吧😳
不是,这是拼音中的变调规则
是的,在一些情境下需要变调,目前有如下4四种情况.
三声变调 最普通的变调规则即是在一组两个上声(第三声)的合音节中,须将合音节中领先的第一个音节提升到阳平(第二声)。举例来说,你好(nǐ hǎo)为最普通的中文问候语,nǐ与hǎo原调都是上声,不过合音节第三声的“你”须提升为阳平,即“你好”要念为“ní hǎo”。 一不变调 当“一”和“不”夹在词语中间念轻声,例如“看一看”、“好不好”等等。 “一”的变调 “一”的原调是第一声。当“一”在表示数目时,以及在词尾出现时,念为原调。例如︰一二三四、第一等等。 当“一”与量词配搭时,如量词的声调是第一声、第二声或第三声,“一”念成第四声,例如“一根”、“一钱”和“一种”。如量词的声调是第四声,“一”念成第二声,例如“一个”。 “不”的变调 “不”的原调是第四声。当“不”后面跟着第一声、第二声和第三声的字,或者“不”出现在词末,念为原调。例如︰“不高”、“不祥”、“不好”和“我就不”。 当“不”后面的字是第四声,念为第二声,例如“不要”。
@Jackiexiao @Starlon87 学习了,之前不知道这个知识点。
@Jackiexiao @Starlon87 请问python-pinyin如何批量处理?
运行环境 操作系统:Windows10 Python 版本:python-3.4.3 pypinyin 版本:v0.33.0
我有一个文本文件b.txt,utf-8格式,文件里面有内容: 这个 进行 因为 还是 时候 看到 …… 想把转换成汉语拼音,该如何操作?
能批处理、拖叠文件等一步到位吗? 指教一下吧!谢!
有可能「變調前、變調後」都提供嗎?
日文轉假名的程式庫(http://taku910.github.io/mecab/) 每個日文詞下去查會得到以下結果:
表層形 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
最後兩個「読み,発音」一個是拿來標注的(變調前)、一個是真正唸出來的音調(變調後)的假名。
猜想現在 python-pinyin 都是「變調前」的。 thchs30 因為是拿來 train speech model 的所以都是「變調後」的。
兩個合起來才是所有的結果。
如果按读音区分的话,像 ti si shi 里的 i 其实是三种不同的读音,做speech model时需要输出成不同的符号,比如 cmu sphinx的中文词典里的表示分别是 i (ti), iy (si), ix (shi)
最新版本已支持部分变调规则(参考 https://en.wikipedia.org/wiki/Standard_Chinese_phonology#Tone_sandhi ):
>>> lazy_pinyin('你好', style=Style.TONE2, tone_sandhi=True)
['ni2', 'ha3o']
不过,如果要达到更好的效果还需要配合使用 https://github.com/mozillazg/pypinyin-dict 中更庞大的词语拼音库以及基于词语拼音库的更精准的分词方法来进行优化。
BTW,pypinyin 这种基于词语拼音库的方式优化拼音结果的方法的准确率毕竟是有限的, 听说 Interspeech 2020 有几个 session 介绍的方法都比 pypinyin 要更优,可以关注一下: https://mp.weixin.qq.com/s/vaqKKcNWKf-lFFfjT0813A 。 同时也可以关注一下最新的 Interspeech 2021 中相关内容的 session。
一种比较好的方式是通过词频的方式来判断是否要3声变调,例如 小老虎,freq{老虎} > freq{小老} 所以[老虎]要优先变调,这种方式能解决大部分问题,当然少量情况下可能是错误的。
最新版本已支持部分变调规则(参考 https://en.wikipedia.org/wiki/Standard_Chinese_phonology#Tone_sandhi ):
>>> lazy_pinyin('你好', style=Style.TONE2, tone_sandhi=True) ['ni2', 'ha3o']
不过,如果要达到更好的效果还需要配合使用 https://github.com/mozillazg/pypinyin-dict 中更庞大的词语拼音库以及基于词语拼音库的更精准的分词方法来进行优化。
BTW,pypinyin 这种基于词语拼音库的方式优化拼音结果的方法的准确率毕竟是有限的, 听说 Interspeech 2020 有几个 session 介绍的方法都比 pypinyin 要更优,可以关注一下: https://mp.weixin.qq.com/s/vaqKKcNWKf-lFFfjT0813A 。 同时也可以关注一下最新的 Interspeech 2021 中相关内容的 session。
最近基于 Interspeech 2022 中发布的 g2pW 项目封装了一个项目,优点是继承了 g2pW 项目的支持通过训练模型的方式提升拼音准确性的能力以及可以沿用 pypinyin 的使用习惯(支持各种拼音风格),感兴趣的话可以试一下:
https://github.com/mozillazg/pypinyin-g2pW