韵律学:用python编写的韵律语音分析器。适用于英语和芬兰语,并提供灵活的语言支持。

prosodic的Python项目详细描述


韵律

韵律是用python编写的韵律语音分析器。它根据特定的语言规则扫描诗歌的韵律。弥尔顿《失乐园》的第一行

Of man's first disobedience, and the fruit     

变成

of|MAN'S|first*|DIS|o|BE|dience|AND*|the|FRUIT

韵律扫描显示为大写。星号(*)表示的是与scansion不一致、偏离其理想模板或违反其语言规则的音节。

韵律将每个单词从语音词典或从文本到语音算法转换为重音、音节、语音转录。为了以最优性理论的方式扫描文本,它为每一行文本找到了最佳可用的语法分析:几乎所有可能的语法分析都是尝试的;最佳的语法分析是那些最不偏离一组可定制的语言规则或约束的。默认情况下,约束条件是kristin hanson和paul kiparsky在他们的论文"诗意韵律的参数理论"(language,1996)中提出的那些约束条件。

目前,prosodic可以解析英语和芬兰语文本,但是通过发音字典或自定义python函数添加其他语言很容易。韵律是由Ryan Heuser、Josh Falk和Arto Anttila于2010年夏天开始制作的。josh还维护了另一个存储库,其中他重写了这个项目中为英语和芬兰语进行语音转录的部分。sam bowman也对代码库做出了贡献,添加了一些新的度量约束。

安装

安装韵律

从PIP安装(首选):

pip install prosodic

或安装最新源(高级):

git clone git@github.com:quadrismegistus/prosodic.git
cd prosodic
python setup.py develop

这两种方法都将在主目录中创建一个文件夹韵律数据,您可以在其中配置韵律、存储文本和保存结果。有关详细信息,请参见下面的("配置韵律"。

安装文本到语音转换软件

韵律使用tts软件来读出不熟悉的单词:否则,在cmu发音词典中找不到的单词将缺乏音韵学,因此将剥夺它们出现的行进行韵律分析的可能性。

espeak是用于Windows和Unix系统(包括Mac OS X)的开源TTS引擎。要安装espeak,请在这里为您的操作系统下载它。或者,如果您运行的是Mac OS X,请使用自制包管理器安装espeak

brew install espeak

<;small>;注意:espeak生成任何给定(真实或不真实)单词的音节化ipa转录。为了对这些进行提纲,使用了宾夕法尼亚州语音工具包(p2tk)中的提纲器。此管道的另一个优点是一致性:此同一个音节生成器负责CMU发音词典中的音节边界,韵律在使用TTS引擎之前(如果可能)从中提取音节边界。<;/small>;

快速启动

以交互方式运行韵律

从命令行运行:韵律

################################################
## welcome to prosodic!                  v1.2 ##
################################################


	[please type a line of text, or enter one of the following commands:]
		/text	load a text
		/corpus	load folder of texts
		/paste	enter multi-line text

		/eval	evaluate this meter against a hand-tagged sample
		/weight	run maximum entropy on a hand-tagged sample

		/mute	hide output from screen
		/exit	exit

粘贴到文本中:/paste

>> enter or paste your content here. press Ctrl-D when finished.

Turning and turning in the widening gyre   
The falcon cannot hear the falconer;
Things fall apart; the centre cannot hold;
Mere anarchy is loosed upon the world,
The blood-dimmed tide is loosed, and everywhere   
The ceremony of innocence is drowned;
The best lack all conviction, while the worst   
Are full of passionate intensity.

按度量分析:/parse(根据/meter中指定的度量)

显示结果:/scan(每行,仅显示最佳解析)

text                                                        	parse                                                       	meter	num_parses	num_viols	score_viols	[*footmin-f-resolution]	[*footmin-w-resolution]	[*strength.w=>-p]	[*stress.s=>-u]	[*stress.w=>-p]
Turning and turning in the widening gyre                    	TURN|ing.and*|TURN|ing|IN|the|WIDEN|ing|GY|re               	swwswswswsw	3	1	5	0	0	5	0	0
The falcon cannot hear the falconer;                        	the|FAL|con|CAN|not|HEAR|the|FAL|coner                      	wswswswsw	1	0	0	0	0	0	0	0
Things fall apart; the centre cannot hold;                  	things*|FALL|ap|ART|the|CEN|tre|CAN|not|HOLD                	wswswswsws	2	1	1	0	0	0	0	1
Mere anarchy is loosed upon the world,                      	mere*|AN|ar|CHY*|is|LOOSED|up|ON|the|WORLD                  	wswswswsws	4	2	2	0	0	0	1	1
The blood- dimmed tide is loosed, and everywhere            	the|BLOOD|dimmed*|TIDE|is|LOOSED|and|EV|ery|WHERE           	wswswswsws	1	1	1	0	0	0	0	1
The ceremony of innocence is drowned;                       	the|CER|e|MO|ny.of*|IN|no|CENCE*|is|DROWNED                 	wswswwswsws	6	2	6	0	0	5	1	0
The best lack all conviction, while the worst               	the|BEST|lack*|ALL|con|VIC|tion|WHILE|the|WORST             	wswswswsws	3	1	1	0	0	0	0	1
Are full of passionate intensity.                           	are|FULL|of|PAS|sion|ATE*|in|TEN|si|TY*                     	wswswswsws	2	2	2	0	0	0	2	0

保存统计信息:/stats all

将韵律作为python模块运行

# importimportprosodicasp# create a Text objecttext=p.Text(string_or_filename)`# parse metricallytext.parse()# save statstext.save_stats()# iterate over featuresforlineintext.lines():best_parse=line.bestParse()# most plausible parseall_parses=line.allParses()# all plausible parsesfirst_word=line.words()[0]last_syllable=line.syllables()[-1]last_syllable_rime=line.rimes()[-1]last_syllable_rime_phonemes=last_syllable_rime.phonemes()

配置

prosodic的所有配置都在主目录中的~/prosodic_data文件夹中进行,该文件夹在安装时创建(通过pip install prosodicpython setup.py install从源代码)。

主要设置

  • 要配置韵律,请将"config_default.py"复制或重命名为"config.py",并根据其说明编辑该文件。
  • [注意:如果更新prosodic,"config_default.py"将被覆盖,但"config.py"不会被覆盖。]

此文件配置以下选项:

  • 有关韵律工作原理的技术选项:

    • 用于语料库、结果和标记样本的路径
    • 使用的语言(当前为英语或芬兰语)
    • 哪种文本到语音引擎(如果有)用于解析未知英语单词
    • 是否将输出打印到屏幕
  • 有关单词和标记化的选项:

    • 用于单词标记化的正则表达式
    • 对于具有多个应力分布的单词(例如"in to"和"into"),是否允许度量分析器根据行中最适合度量的词来选择应力分布
    • 是否允许省略发音(例如"plu-ton-i-an"的"plu-ton-i-an")作为韵律可能性也
    • 如何显示单词的语音输出(IPA、正字法、CMU表示法)

  • 若要编辑或创建您自己的仪表,请将"meters/meter_default.py"复制或重命名为"meters/your_meter_name.py",然后根据其说明编辑该文件。
  • 然后考虑将config.py中的默认"meter"设置更改为"your_meter_name"。
  • 您也可以从韵律中选择"您的仪表名称"。
  • [注意:如果更新prosodic,"meters/meter_default.py"将被覆盖,但"meters/your_meter_name.py"不会被覆盖。]

这些文件配置以下选项:

  • 韵律位置的最小和最大大小:从一个音节(甚至半个音节,或mora)到两个或多个音节。
  • 度量分析中使用的约束,其中一些是:
    • Kiparsky和Hanson在《诗意韵律的参数理论》(1996)中提出的限制条件:
      • 强度:弱/强音节不应处于强/弱韵律位置。
      • 重音:非重音/重音音节不应位于强/弱韵律位置。
      • weight:轻/重音节不应处于强/弱韵律位置。
      • 最小英尺:双音节韵律位置不应包含超过最小英尺(仅当音节为加权的轻-重或轻-轻时,才允许使用双音节位置)。
    • 调节双音节韵律位置的其他约束条件
    • 允许线的初始部分是超测量的约束
    • 约束词省略(例如,"plu-ton-i-an"变成"plu-ton-ian")
  • 传递给度量分析器的内容:文本文件中的一行、标点符号之间的一行等。

标记样本

  • 要对自己的标记示例运行prosodic,请创建一个类似"tagged_samples/tagged-sample-litlab-2016.txt"的文件,其中至少有一列用于该行(例如,"来自我们希望增加的最美丽的生物")和一列用于分析(例如"wswswswsws")。
  • [注意:如果更新prosodic,将覆盖"taged_samples/taged-sample-litlab-2016.txt",但不会覆盖您自己的文件。]

结果

  • 默认情况下,结果将保存到此处的"结果"文件夹中。
  • 您可以在"config.py"的"folder_results"选项中更改此选项。

语料库和文本

  • 默认情况下,韵律将在此处的"corpora"文件夹中查找文本。
  • 您可以在config.py中的"folder_corpora"选项中更改此选项。

有关详细信息

有关详细信息,请参阅~/prosodic_data/readme.txt~/prosodic_data/config.py和~/prosodic_data/meter/meter_default.py中的文档。

用法

使用prosodic有两种主要方式:在交互模式下,对于更多的python高级用户,使用prosodic作为python模块。

交互模式

您可以通过运行python prosodic.py进入prosodic的交互模式。这将使您进入如下界面:

Of man's first disobedience, and the fruit     
0

加载文本

使用韵律的第一件事就是给它一些文本。有几种方法可以做到这一点。最简单的方法是简单地在一行中输入一个,一次一个。也可以键入/paste,然后一次输入或复制/粘贴多行。也可以键入/text加载文本,或键入/corpus加载文本文件文件夹。如果您这样做了,您将得到如何指定prosodic的corpus文件夹中的相对路径,或磁盘上另一个文件或文件夹的绝对路径的说明。还可以将要使用的文本定义为用于启动prosodic的命令的参数:python prosodic.py/path/to/my/file.txt

检查语音/语音注释

甚至在对加载的文本进行韵律分析之前(见下文),您还可以运行一些命令来测试韵律是如何从语音和语音方面解释文本的。命令/show将显示每个单词的语音转录、重音和重量分布:

Of man's first disobedience, and the fruit     
1

命令/tree显示每个单词语音的分层描述,因为它嵌入到文本的分层组织中。例如,此行从/tree输出的开头是:

Of man's first disobedience, and the fruit     
2

最后,使用/query命令可以查询这些语音注释。输入/query后,查询语言分析器启动(键入/退出,或按ctrl+d)。课文中哪些是重读音节?(音节:[+prom.stress])。哪些是语音音素?(音素:[+语音])。有声母和密码的音节都有哪些?(音节:(起始音:[+语音])(尾音:[+语音])。等

语法分析文本

命令/parse将按节拍分析当前加载到韵律中的任何文本。一旦文本被解析,就可以执行进一步的命令,所有这些命令都可以查看或保存从解析器收集的数据。

命令/scan打印每行的最佳解析,以及违反的约束的统计信息。[此输出与任何其他输出一样,可以使用/save命令保存到磁盘(然后使用Excel打开)。]例如,下面是Paradise Lost的前四行,使用/scan命令:

Of man's first disobedience, and the fruit     
3

命令/report是一个更详细的/scan版本,为每一行打印每个可能的(即非和谐有界的)解析。例如,对于每一行,它都会产生如下输出:

Of man's first disobedience, and the fruit     
4

最后,您还可以通过运行/stats命令以制表符分隔的形式保存度量分析器中的各种统计信息。

根据手工分析的样本评估仪表

当韵律分析与人类读者注释的韵律分析相比较时,韵律效果如何?上面"Metric Parser的准确性"中的统计数据是从evaluation命令生成的:/eval。从那里,您可以选择一个电子表格(以制表符分隔的文本文件或xcel文档)保存在taged_samples/文件夹中,用作"基本事实",人工注释的解析。/eval命令将询问文件中的哪些列对应于行("人类的第一次反抗和果实")、语法("wswswswwsws")和(可选)行的米("iambic")。prosodic将解析"line"列下的行(一如既往地使用config.py中度量约束的当前配置),并以制表符分隔的形式将统计信息保存到同一文件夹中。

扩展韵律

添加语言

韵律语言有两种可能的理解方法:

  • 使用以下格式的词典:

    • {单词标记}[制表符]{重音,音节,IPA格式}
    • eg:
      • 迷惑[标签]b_'f_.d_l
      • 糊涂[表]b_'f_.d_ld
      • 迷惑[tab]b_'f_.d_lz
  • 使用python函数,该函数接受一个单词标记作为输入,并使用一个重音、音节化的ipa格式作为输出。

目前,Finnish是通过后一种方法实现的;English是两种方法的组合,使用字典来识别单词,使用Python函数来识别单词。

要向语言词典添加条目,只需将上述格式的条目添加到词典[语言名称].tsv文件夹下的[韵律目录]/dicts/[语言双字母代码]

要完全添加新语言,可以按照上述格式创建一个新字典,并将其放在[prosodic_dir]/dicts/[language_twoletter_code]/[language_name].tsv下。或者,可以在[prosodic_dir]/dicts/[language_twoletter_code]/[language_name].py下创建一个python文件,该文件具有get(token,config={})函数。此函数必须接受word token作为其唯一的参数,prosodic的配置设置作为可选的关键字参数,并且必须以以下格式返回元组列表:

Of man's first disobedience, and the fruit     
5

例如,get("into",config={添加省略的发音:1})可能返回:

Of man's first disobedience, and the fruit     
6

请参见dicts/en/english.pydicts/fi/finnish.py中的get()函数以获取示例。

为代码库做出贡献

请随意拉和推回到这里的代码库!在您的项目中可以随意使用此代码:它是由gplv3授权的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java linkedlist字符串排序算法   枚举类上出现maven错误的java ProGuard   java如何将ActionBar徽标设置为文本(TextView)?   swing当剪贴板内容在java之外发生更改时,是否可以得到通知   javascript从网络摄像头拍摄照片并保存到服务器上   java如何使用流将列表中的选定元素复制到另一个列表   使用eBay API获取产品详细信息的java   java ANTLR树中的子级数未知   java Selenium:访问'file:///C://Users//DELL//Desktop//Project%20UI//FastHome.html“剧本被拒绝了   如何在Java web项目中抛出一个无法捕获并结束执行的异常?   java有人能解释强引用、软引用、弱引用和虚引用之间的区别以及它们的用法吗?   java根据父级Android Studio的维度设置宽度和高度   包含对象数组列表的java序列化对象   返回奇怪字符的java libimobiledevice   java数据库无法以html格式存储   java Google play服务查找我的位置很慢   GCC原生Java编译器作为典型开源Java项目的平台有多实用?   java如何将从Web服务接收的二进制64格式的图像转换为实际图像?   java访问Tomcat 8上的属性文件