xSegmenter:面向语音库建设的音段自动切分与标注工具

汉语堂2018-12-05 06:02:44

本文转自公众号:《九州语言网》


音段自动切分与标注工具 xSegmenter 由笔者设计开发,属于 xSpeechTools 工具的一个子程序,采用 Perl 脚本语言编写,主要面向较大规模的语音语料库建设,旨在解决语音语料库建设过程中的音段标注效率和一致性问题。这个工具的主体工作在几年前就已经完成了,并在一些较大规模的语音语料库建设过程中得到了较好的应用,最近对其进行了一些改版和优化,主要解决流程的自动控制、初始模型的优化和字符编码转换等问题。

该工具通过 Perl 脚本语言调用 HTK 工具,基于用户所提供的语料及相关资源训练生成 HMM 声学模型,然后进行音段强制对齐和标注,最后针对每个声音文件转写生成相应的语音标注文件(*.TextGrid),可包括词语层、音节层和音素层等标注内容。

主要特色由于该工具自身不提供任何声学模型和词典,而是基于用户所提供的声音文件、带有分词信息的发音文本文件和发音词典文件等数据资源自动训练生成相应的语音声学模型,然后再利用所生成的语音声学模型去完成音段对齐任务,因此这一工具可适用于任意语言和方言的语音库建设

一、数据准备

为了完成某种语言或方言的语音声学模型训练和音段自动切分任务,用户需要提前准备好下述三类文件:

1、wav 格式的原始声音文件,扩展名为 *.wav。训练用的声音文件越多越好;但每个声音文件都不宜过长,最好是字、词、句等材料;如果属于篇章录音材料,则建议提前将其截取成以句子为单元的多个声音片段。

xSegmenter 程序会根据用户在参数配置文件(setting.ini)中所指定的数据路径遍历搜索该文件夹(包含其子文件夹)之中的所有原始声音文件,再自动检测和修改声音文件的属性,并以 *.raw 为扩展名拷贝放至 DATA 文件夹之中,DATA 文件夹由程序自动生成。也就是说,此程序可以同时处理多个不同文件夹中的声音文件,只需给定其公共的父路径即可。这一数据拷贝与整理过程不会影响到用户的原始声音文件属性。存放至 DATA 文件夹之中的声音文件会被统一修改至如下属性:采样率=16000Hz,声道数=1。如果用户提供的是双通道的声音,则仅提取其左声道的声音数据进行处理和分析。此外,程序还会自动给这些声音文件数据添加一些随机噪音。

特别提示:原始声音文件和发音文本文件的路径和文件名之中不能同时出现三个相邻的下划线符号:“___”,这是由于该符号已被程序用来标记文件的目录层级结构关系。

2、带有分词信息的发音文本文件,建议使用 UTF-8 编码格式,以便于 Praat 程序能够对其进行加工处理。每个原始的声音文件都应该有一个与之相对应的发音文本文件,以文字形式记录声音文件所录制的发音内容,用户应事先检查文本内容与声音内容之间的一致性。除扩展名不同外,发音文本文件与声音文件的原始存放路径和文件名均应完全相同,例如“../0001.txt对应于../0001.wav”。

发音文本文件中的文字内容应遵循以下格式:

(1)发音文本内容之中不可换行,前后词语之间必须用英文空格分开,以便于切分和提取词语,并在此基础上进行相应的拼音转写;如何分词,由用户自行决定,只要在相应的发音词典里能够给出发音文本中所出现的全部词条及其拼音即可。

(2)除了标点符号和文字内容之外,发音文本之中不要使用其他特殊符号,而且所有标点符号(除英文的单引号之外,如 I'll,此时程序会把I'll当做一个词语来处理)均会被程序用空格代替,这步操作不会影响到用户的原始发音文本数据。如果发音文本中出现的英文单引号不是用作英语词语拼写中的上述功能,请用户事先在原始发音文本文件中自行替换。

(3)发音文本中凡是包含在“< >”、“[ ]”或“{ }”之中的文本内容会被自动剔除,不对其进行拼音转写。这步操作不会影响到用户的原始发音文本数据。

发音文本中无需包含拼音内容,其基本格式如下:

我 是 学生,他们俩 也是 学生,我们 都是 安徽人。

我 是 学 生,他 们 俩 也 是 学生,我 们 都 是 安 徽 人。

3、发音词典文件,应给出发音文本文件中所出现的全部词条及其发音形式,发音内容可细分到音素或声韵母,容许带有声调或重音等韵律特征信息。发音词典里容许出现多音词,多个条目分行书写即可,常用的发音形式写在前面。由于声学模型只考虑了音段的频谱特征,而对于音高、音长、音强等方面的韵律特征在建模时没有考虑,因此能较好地区分“大 da4”和“大 dai4”这类多音词,而处理不了“好 hao3”和“好 hao4”这类只是声调差异的多音词。发音词典应包含用户发音文本中出现的所有词条,并应符合以下基本格式:

(1)词语内部不能出现空格,词语与读音之间用英文空格分隔;

(2)相邻音素或声韵母之间用英文空格分开,音节之间用“|”分开;

(3)重音或声调等韵律信息可在音素末尾用0-9等数字标示,儿化韵可以用“r”直接标记在韵母之后。但需要注意的是,a 和 ar 会分别建立声学模型,有可能导致数据稀疏;

(4)字母不区分大小写;

(5)虽然此程序可以支持采用国际音标符号来标记词语读音,但建议尽可能使用26个英文字母及其组合形式来标记词语读音,并尽可能避免使用那些不能用于文件名命名的特殊符号;

(6)一行一个词条。

发音词典条目示例如下:

中国 zh ong1 | g uo2

人民 r en2 | m in2

朝阳 zh ao1 | yang2

朝阳 ch ao2 | yang2

他们俩 t a1 | m en0 | l ia3

安徽人 an1 | h ui1 | r en2

关门儿 g uan1 | m enr2

……

xSegmenter 程序会基于发音文本中的英文空格符号提取出所有词条,并在发音词典中查找其相应的拼音内容,然后在此基础上将每个发音文本文件转写成相应的拼音序列,用于语音声学模型训练。对于那些在发音词典里找不到的词条,程序会自动采用“unk”来标记其发音形式,并在运行过程之中会提醒用户加以修改。为了提高声学模型的精度,词典中的拼音内容应尽可能做到准确无误:一音一符号用户可以自由定义自己的拼音标记系统,词典内容只要能够满足上述格式即可。

建议用户采用 ANSI 编码格式保存发音词典文件,并应确保所有字符(包括词条及其拼音)在记事本程序中打开时无任何乱码。如果在 ANSI 编码下会出现字符乱码,则可采用 UTF-8 格式去保存发音词典文件,在此情况下,运行 xSegmenter 程序之前需要使用下文第四节提到的字符编码转换方法对全部发音文本文件以及发音词典文件进行预处理,将它们统一转换成 ANSI 编码状态下能够正常显示的字符编码形式。这一操作不会影响到用户的原始数据。

准备好上述三类文件之后,请点击运行 xSegmenter 程序。如果是首次运行该程序,系统会自动生成一个名为 setting.ini 的参数配置文件,用户应认真阅读其中的内容,并在该文件中填写好相应的配置参数。如果已经存在 setting.ini 文件,则可直接修改其中的相应参数,然后再次运行 xSegmenter 程序。

二、参数配置

用户在正式运行 xSegmenter 程序之前,需要事先在 setting.ini 文件中设定以下运行参数,setting.ini 文件由系统运行时自动生成,会存放在 xSegmenter.exe 文件所在的文件夹之中:

1、设定存放声音文件和发音文本文件的原始路径如 C:/SOUNDS/PTH该路径下可以包含多级子目录,程序会执行遍历搜索,找到该路径下(含各个子目录)的全部声音文件并建立声音文件名列表,如果某个声音文件没有相应的发音文本文件则会被剔除

dataFilePath=

2、设定用户词典文件的文件名及其路径,如 C:/xSegment/Tools/wordList.dict。

dictFileName=

3、设定发音文本文件的扩展名,如 txt 或 rec(默认值为:txt)。

extOfRecFile=

4、设定发音文本文件的编码类型,如 ANSI 或 UTF8(默认值为:UTF8)。

recTextCode=

用户应认真填写好这4项参数,以确保程序在运行时能够调取到相应的数据资源,其他配置参数采用默认值即可。

三、程序运行

在 setting.ini 文件中设置好参数之后,双击 xSegmenter.exe 即可开始运行,但建议在 Dos 命令行窗口中执行此程序,以便于观察程序的运行情况,特别是程序运行出错的各类提示信息。在执行 xSegmenter.exe 过程中会自动创建以下三个临时文件夹,程序运行进程之中,请勿删改其中内容:

TEMP 文件夹:用于存放训练过程中所产生的一些临时文件,不用时可以删除。程序会根据这些临时文件来自动确定其相应的运行步骤,跳过已经执行完的步骤,以提高运行效率。所以在完成切分与标注任务之前,最好不要删改该文件夹中的任何内容。如果全部删除该文件夹中的内容,下次再运行 xSegmenter.exe 程序时,便会从第一步开始重新运行。

HMM 文件夹: 用于存放最终生成的单音素声学模型文件及其相关的数据资源文件,包括音素列表文件和发音词典文件,不用时可以删除。如果 HMM 文件夹中已经存放了这三个文件,程序在运行时则会自动跳过中间的声学模型训练过程,直接调用这几个文件进行音段强制对齐与标注操作。所以建议用户将这几个声学模型文件打包保存起来,以便于后期直接调用,也可以将其打包分享给其他用户,用于同类语料的切分与标注操作。

DATA 文件夹:用于拷贝存放用户的声音文件及其相关的频谱参数文件,不用时可以删除,删除操作不会影响用户的原始数据。该文件夹中存放的频谱参数文件,扩展名为 *.plp或 *.mfc,声音文件的扩展名为 *.raw。

一般而言,在程序执行过程之中,仅需要用户干预的地方是检查 segment*.dict 文件中的词条内容,该文件由程序根据用户提供的发音文本和发音词典自动生成。如果程序发现未登录词,则会在某个阶段暂停程序的执行过程,提醒用户去检查和修改 segment*.dict 文件中被标记为 “unk” 的发音条目,并等待用户的按键操作。如果用户给定的发音词典包含了发音文本中的所有词条及其读音形式,则不会出现此提示信息。用户修改完 segment.dict 文件之后,按 “y” 键即可继续运行程序。当程序运行全部结束之后,用户在各个声音文件的原始路径下应该就可以看到相应的语音标注文件,其扩展名为*.TextGrid。

据笔者测试,如果提供的数据文件没有问题,程序执行过程中一般就不会出现什么问题。容易导致程序出错的原因主要有两个方面:一是发音词典文件,如出现未登录词,或者出现词条格式问题、编码问题等。二是声音文件太少或者声音质量太差,导致某个或某些音素的声学模型建立不起来。也就是说,如果程序运行出错了,可以先从这两个方面去找找原因。

四、字符编码转换

如果在发音文本或发音词典中出现了一些必须在 UTF-8 编码格式下才能正常显示的字符,则应进行字符编码转换操作,将全部文本内容转换成特定的编码形式。下面举例加以简要说明。


图1:蒙文字符的文件编码与显示结果

在上图的第一个文件里,选择保存为 UTF-8 编码格式,打开之后,蒙文字符可以正确显示;而在第二个文件里,选择保存为 ANSI 编码格式,打开之后就全部变成了乱码。在此情况下,我们可以采取 Tools 文件夹中给出的 Praat 脚本程序“转换至ANSI字符串编码.scp”将发音文本文件以及发音词典文件的所有内容进行重新编码处理,得到一系列新的发音文本文件(与原文件不冲突,文件扩展名不同)。结果如下所示:


图2:对文本进行编码处理后的结果

这个脚本程序不仅会对发音文本文件进行处理,还会对发音词典文件进行同样处理,所有以空格分隔的字符串均会得到一个唯一的编码,并生成一个字符转换时所用到的对应编码表,如下所示:


图3:字符转换编码表

字符编码转换结束之后,用户可以通过 setting.ini 文件中的参数配置,让 xSegmenter 程序针对新生成的发音文本文件和发音词典文件进行操作,从而可以避免因为字符编码而产生的问题。等到程序完成音段切分与标注,并生成TextGrid 文件之后,用户可以调用 Tools 文件夹中所给出的 Praat 脚本程序“转换至UTF8字符串编码.scp”将 TextGrid 文件中的字符串编码替换回原来的字符串形式,此时还会用到上图所示的字符转换编码表。

特别提示:如果原发音文本文件中用到的标点符号不是中文或英文的标点符号,应将字符转换编码表文件(*.bma)中所对应的新字符修改成为中英文标点符号形式,以便于程序能够正确断句和确定词语分界。

五、结果示例

下面给出了几个自动切分与标注的实际样例,从中可以看出,自动对齐的音素或声韵母边界在时间精度上还有待进一步提高。这主要是与训练材料和发音词典等因素有关。通常而言,训练用的语音材料越多,各个音素的上下文语音环境越均衡、越丰富,其声学模型就会越有效。另外,发音词典的系统性和科学性也会影响到声学模型的精度。当然,我们也不能奢望音段的自动切分能带代替人工的精细标注。但利用自动处理的技术,一方面能够提高效率,避免了手工录入的费时费力,另一方面能够避免手工录入错误,提高数据的一致性。所以还是值得推荐的。


图4:普通话语句的切分结果示例


图5:粤语材料切分结果示例


图6:蒙语材料切分结果示例


图7:英语材料切分结果示例

从以上结果数据可以看出,标注内容分为三个层级:词语层、音节层(词典内容中含有音节分界符“|”时会输出音节层)和音素层,并支持声调或重音等标记符号的输出。通过训练声学模型,完成音段的自动对齐,这无疑能够在一定程度上促进语音语料库的建设进度,减少人力资源的投入。但是,要建设较高质量的语音语料库,后期的手工校准工作仍然是必不可少的。

六、提高模型精度

默认情况下,xSegmenter 程序在训练声学模型时并不需要用户提供已经切分好的、带有时间标记信息的语音材料,而是采用 HCompV 工具获得全部训练样本的总体均值和方差等数据,并以此初始化各个音素的声学模型,然后直接执行 HERest 过程。这样处理的好处是简便,缺点是容易造成声学模型的精度不足,特别是面对小样本的训练数据时,声学模型的精度可能会比较糟糕。为了能够获得相对较好的语音声学模型,此程序也容许用户提交含有时间点信息的语音标记材料,并根据音段标注内容及其时间信息执行 HInit 和 HRest 等操作,以获得相对较好的语音声学模型。

如果希望提高模型的精度,建议用户先训练一个小样本量的模型,并在得到相应的自动切分结果文件 *.TextGrid 之后,基于 Praat 程序手工校准一些 TextGrid 标注文件中的音素边界,然后再使用 Tools 文件夹里面的 “TextGrid2xLab.scp” 脚本程序,基于检校后的 TextGrid 文件去自动生成带有时间点信息的发音文本文件(*.xLab),并将这些 xLab 文件放在原始声音文件所在的相同目录之中,然后删除 TEMP 文件夹中的全部内容并重新运行 xSegmenter 程序,此时程序会自动检测并调用 *.xLab 文件以用于音素模型的初始化过程。通过这样处理,通常能够在一定程度上提高声学模型的精度,但最终的标注结果仍然还是需要用户去手工校准的。

七、程序下载

xSegmenter.rar 程序的下载地址如下,请在电脑上进行下载操作:

http://iword.cass.cn/SOURCE/TOOLS/xSegmenter.rar

请注意不要将其内容解压到带有汉字或其他特殊字符的文件夹之中,解压之后的文件目录如下:


图8:解压之后的文件目录

请勿修改或删除 Tools 文件夹中的文件内容,以免程序出错。EXAMPLES文件夹中包含有普通话、粤语、蒙语和英语的一些样例数据,内含声音文件、发音文本文件以及词典文件,用户可据此了解运行此程序所需要的数据文件内容和格式,也可在此基础上进行模型训练和音段切分的操作练习。

需要略加注意的是,普通话和粤语材料的发音词典为 ANSI 编码格式,蒙语和英语的发音词典为 UTF-8 编码格式,在使用操作上会略有不同,后者需要采取上面第四小节所说到的字符编码转换方法对发音文本和词典内容进行相应的预处理。

按照系统自动生成的 setting.ini 文件中的默认参数,直接运行 xSegmenter 程序可以对EXAMPLES文件夹中的普通话数据进行模型训练和切分操作。如果需要对其他数据进行操作,则应修改 setting.ini 文件中的相应参数。建议用户在使用之前,进一步认真阅读该程序所生成的setting.ini文件,内有较为详细的参数配置和程序使用说明。


Copyright © 温县电话机虚拟社区@2017