音素

音素是构成语音的基本声音,音节和单词建立在音节上。在与语音语言处理相关的各种应用(例如文本到语音系统)中,将文本从其拼写形式转录为语音字母表是一项重要要求。

Phonemizer 是一个精确寻址的 Python 包, 它将文本从其拼写表示转录为语音表示。 该包设计用户友好的,并公开了一个高级音素化函数, 支持大约100种不同的语言。phonemizer 使用的默认后端是 eSpeak (Dunn & Vitolins,2019 年),一种基于语言专业知识和手写转录规则的文本转语音软件。它将文本转录成国际音标,并支持一百多种语言。使用 MBROLA 声音(Tits & Vitolins,2019),eSpeak 后端可用于大约 35 种语言,以 SAMPA 计算机可读语音字母表转录文本。


安装

安装phonemizer前需要配置espeak-ng,

pip3 install phonemizer

音素化phonemize

from phonemizer import phonemize

phonemize(text, language=‘en-us’, prepend_text=False, preserve_punctuation=False, with_stress=False, njobs=1)

  • text 文本列表
  • language 语言。“en-us"美国英语, “zh"中文
  • prepend_text 输出结果保留输入的文本,默认False
  • preserve_punctuation 输出结果保留标点符号,默认False
  • with_stress 标记重读,默认False
  • njobs 并行运算核数,默认使用cpu的1个核。
from phonemizer import phonemize

texts = ['hello, my name is david', 
        'nice to meet you!']

# Do this:
phonemized =  phonemize(texts, language='en-us')
phonemized

Run

['həloʊ maɪ neɪm ɪz deɪvɪd ', 'naɪs tə miːt juː ']

但上面的用法速度较慢, 更高效的写法应该为

from phonemizer.backend import EspeakBackend
backend = EspeakBackend(language='en-us')

texts = ['hello, my name is david', 
         'nice to meet you!']

phonemized = backend.phonemize(texts) 
phonemized

Run

142 µs ± 851 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

给每个单词构造音素,输出结果为字典样式


from phonemizer.backend import EspeakBackend
from phonemizer.punctuation import Punctuation
from phonemizer.separator import Separator
backend = EspeakBackend('en-us')

text = 'It amused him to think that they were probably talking about him at that very moment'
words = [word for word in text.lower().split(' ')]

# 忽略词语边界,音素之间用空格间隔
separator = Separator(phone=' ', word=None)

lexicon = {word: backend.phonemize([word], separator=separator, strip=True)[0]
           for word in words}

lexicon

Run

{'it': 'ɪ t',
 'amused': 'ɐ m j uː s d',
 'him': 'h ɪ m',
 'to': 't uː',
 'think': 'θ ɪ ŋ k',
 'that': 'ð æ t',
 'they': 'ð eɪ',
 'were': 'w ɜː',
 'probably': 'p ɹ ɑː b ə b l i',
 'talking': 't ɔː k ɪ ŋ',
 'about': 'ɐ b aʊ t',
 'at': 'æ t',
 'very': 'v ɛ ɹ i',
 'moment': 'm oʊ m ə n t'}

中文的音素化

text_zhs = ['你好我的名字是大卫', 
            '很高兴认识你']

phonemized_zhs = phonemize(text_zhs, language='zh')
phonemized_zhs

Run

['ni2 xɑu2 wo2 tə1 miɜŋ tsi̪5 s.i.5 tɑ5 wei5 ',
 'xə2n kɑu5 ɕi5ŋ ʐə5n s.i.1 ni2 ']

from phonemizer.backend import EspeakBackend
from phonemizer.punctuation import Punctuation
from phonemizer.separator import Separator
import re


text = '想到他们可能在那个时候谈论他,他觉得好笑'
words = re.findall('[\u4e00-\u9fa5]', text)


backend = EspeakBackend('zh')

separator = Separator(phone=' ', word=None)

# 构建每个汉字一个对应的音素表达,输出结果为字典样式
lexicon = {word: backend.phonemize([word], separator=separator, strip=True)[0]
           for word in words}

lexicon

Run

{'想': 'ɕ iɑ2 ŋ ',
 '到': 't ɑu5 ',
 '他': 'th ɑ5 ',
 '们': 'm ə1 n ',
 '可': 'kh o2 ',
 '能': 'n əɜ ŋ ',
 '在': 'ts ai5 ',
 '那': 'n ɑ5 ',
 '个': 'k o1 ',
 '时': 's. i.ɜ ',
 '候': 'x ou5 ',
 '谈': 'th aɜ n ',
 '论': 'l uə5 n ',
 '觉': 'tɕ yɛɜ ',
 '得': 't ə1 ',
 '好': 'x ɑu2 ',
 '笑': 'ɕ j ɑu5 '}

心理学相关概念

这个包用起来比较简单,但是想到一个场景,说不定可以多个角度去分析文本。

经常看文本的时候,脑海里不自觉的读出声音,这种现象今天查了下叫做“听觉表象”,听觉表象产生于语言的视觉区和语言的运动区——角回和布洛卡区。通过听觉,听出相应的字的声音,我们就可以领会到这句话的意思。从常人的生长发育的过程,我们都是先牙牙学语,通过声音理解内容的含义,而后经过十数教育学会语言书面文字,掌握文字系统,此时我们的神经回路是“视觉(听觉)~记忆~理解”

对一个东西的“知觉”在心理学上叫做这个东西的“知觉表征”,相当于是把这个东西转码为了一个,用于后续在心理上对这个东西进行加工。这个心理符号的编码与这个东西本身的特征以及最初的感觉通道有关——一个真正的苹果常会被以视觉的方式编码,成为一个视觉知觉表征,可以简单理解成这个苹果的图像;一个词“苹果”常会被以听觉的方式编码,成为一个AVL单元,可以简单地理解成把“苹果”这两个字和“ping’guo”这个读音打包在一起的一个文件。

感觉代码被经过某些处理后储存在记忆当中,当有一天需要用的时候再被从记忆里提取出来。这个时候的提取,本身是一种建构,也就是与将感觉处理后存储起来的一个相反的过程——所以心理学上把我们所提取(建构)的这个代码就称为表象。表象和知觉是机能等价的(Neisser,1972),可以简单理解为表象就是是一种基于过去经验的知觉。这也解释了我们默读词汇的时候,这个AVL单元里“语音”的部分是哪里来的了——这是我们基于对自己声音的了解而建构的一种听觉表象。简单来说这个语音就是根据我们对自己声音的认识,来“想象”的读出来的声音。

知乎回答-心理学哈士奇

Conrad R (1963). Acoustic confusions and memory span for words. Nature, 197: 1029-1030.

Neisser U (1972). Changing conception of imagery. In P W Sheehan (ED), The Function and Nature of Imagery. London: Achademic Press. 知乎回答-心理学哈士奇


引用格式

Bernard, M. and Titeux, H. (2021). Phonemizer: Text to phones transcription for multiple languages in python. Journal of Open Source Software, 6(68):3958.

@article{Bernard2021,
  doi = {10.21105/joss.03958},
  url = {https://doi.org/10.21105/joss.03958},
  year = {2021},
  publisher = {The Open Journal},
  volume = {6},
  number = {68},
  pages = {3958},
  author = {Mathieu Bernard and Hadrien Titeux},
  title = {Phonemizer: Text to Phones Transcription for Multiple Languages in Python},
  journal = {Journal of Open Source Software}
}

广而告之