gruut

gruut

多语言文本处理与IPA音素转换开源库

Gruut是一个开源的多语言文本处理库,提供分词、文本清理和IPA音素转换功能。该工具支持SSML标记处理,可自动扩展数字、日期和货币表达式,并具备命令行接口。Gruut目前支持多种语言,包括英语、法语和德语等。作为一个versatile的文本处理工具,Gruut适用于语音合成和自然语言处理等领域的开发任务。

GruutIPASSML语言处理文本清理Github开源项目

Gruut

Gruut是一个支持多种人类语言的分词器、文本清洗器和国际音标(IPA)音素转换器,支持SSML

from gruut import sentences text = 'He wound it around the wound, saying "I read it was $10 to read."' for sent in sentences(text, lang="en-us"): for word in sent: if word.phonemes: print(word.text, *word.phonemes)

输出结果如下:

He h ˈi
wound w ˈaʊ n d
it ˈɪ t
around ɚ ˈaʊ n d
the ð ə
wound w ˈu n d
, |
saying s ˈeɪ ɪ ŋ
I ˈaɪ
read ɹ ˈɛ d
it ˈɪ t
was w ə z
ten t ˈɛ n
dollars d ˈɑ l ɚ z
to t ə
read ɹ ˈi d
. ‖

注意,"wound"和"read"在不同(语法)上下文中有不同的发音。

还支持SSML的子集

from gruut import sentences ssml_text = """<?xml version="1.0" encoding="ISO-8859-1"?> <speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="en-US"> <s>Today at 4pm, 2/1/2000.</s> <s xml:lang="it">Un mese fà, 2/1/2000.</s> </speak>""" for sent in sentences(ssml_text, ssml=True): for word in sent: if word.phonemes: print(sent.idx, word.lang, word.text, *word.phonemes)

输出结果如下:

0 en-US Today t ə d ˈeɪ
0 en-US at ˈæ t
0 en-US four f ˈɔ ɹ
0 en-US P p ˈi
0 en-US M ˈɛ m
0 en-US , |
0 en-US February f ˈɛ b j u ˌɛ ɹ i
0 en-US first f ˈɚ s t
0 en-US , |
0 en-US two t ˈu
0 en-US thousand θ ˈaʊ z ə n d
0 en-US . ‖
1 it Un u n
1 it mese ˈm e s e
1 it fà f a
1 it , |
1 it due d j u
1 it gennaio d͡ʒ e n n ˈa j o
1 it duemila d u e ˈm i l a
1 it . ‖

更多详细信息请参阅文档

安装

pip install gruut

除英语外的其他语言可以在安装时添加。例如,添加法语和意大利语支持:

pip install -f 'https://synesthesiam.github.io/prebuilt-apps/' gruut[fr,it]

额外的pip仓库是为了使用更新的num2words分支,其中包含对更多语言的支持。

你也可以手动下载语言文件并将它们放在$XDG_CONFIG_HOME/gruut/目录下(默认为$HOME/.config/gruut)。

如果未安装相应的Python包,gruut将在$XDG_CONFIG_HOME/gruut/<lang>/目录中查找语言文件。注意,这里的<lang>完整的语言名称,例如de-de而不是仅de

支持的语言

gruut目前支持:

  • 阿拉伯语 (ar)
  • 捷克语 (cscs-cz)
  • 德语 (dede-de)
  • 英语 (enen-us)
  • 西班牙语 (eses-es)
  • 波斯语 (fa)
  • 法语 (frfr-fr)
  • 意大利语 (itit-it)
  • 卢森堡语 (lb)
  • 荷兰语 (nl)
  • 俄语 (ruru-ru)
  • 瑞典语 (svsv-se)
  • 斯瓦希里语 (sw)

目标是支持所有voice2json的语言

依赖项

  • Python 3.7或更高版本
  • Linux
    • 在Debian Bullseye上测试通过
  • num2words分支Babel
    • 货币/数字处理
    • num2words分支包括额外的语言支持(阿拉伯语、波斯语、瑞典语、斯瓦希里语)
  • gruut-ipa
    • IPA发音操作
  • pycrfsuite
    • 词性标注和音素到音素模型
  • pydateparser
    • 多语言日期解析

数字、日期等

gruut可以自动将数字、日期和其他表达式转换为文字。这是以区域感知的方式进行解析和转换的,因此"1/1/2020"可能会被解释为"月/日/年"或"日/月/年",具体取决于单词或句子的语言(例如,<s lang="...">)。

gruut可以自动将以下类型的表达式扩展为文字:

  • 数字 - "123"转换为"一百二十三"(使用verbalize_numbers=False--no-numbers禁用)
    • 依赖Babel进行解析,num2words进行转换
  • 日期 - "1/1/2020"转换为"二零二零年一月一日"(使用verbalize_dates=False--no-dates禁用)
    • 依赖pydateparser进行解析,Babelnum2words进行转换
  • 货币 - "$10"转换为"十美元"(使用verbalize_currency=False--no-currency禁用)
    • 依赖Babel进行解析,Babelnum2words进行转换
  • 时间 - "12:01am"转换为"凌晨十二点零一分"(使用verbalize_times=False--no-times禁用)
    • 仅支持英语
    • 依赖num2words进行转换

命令行使用

gruut 模块可以通过 python3 -m gruut --language <语言> <文本> 或使用 gruut 命令(来自 setup.py)执行。

gruut 命令是面向行的,消耗文本并生成 JSONL。 你可能需要安装 jq 来操作 gruut 输出的 JSONL

纯文本

接收原始文本并输出带有清理过的单词/标记的 JSONL

echo 'This, right here, is some "RAW" text!' \ | gruut --language en-us \ | jq --raw-output '.words[].text' This , right here , is some " RAW " text !

完整的 JSON 输出中提供了更多信息:

gruut --language en-us 'More text.' | jq .

输出:

{ "idx": 0, "text": "More text.", "text_with_ws": "More text.", "text_spoken": "More text", "par_idx": 0, "lang": "en-us", "voice": "", "words": [ { "idx": 0, "text": "More", "text_with_ws": "More ", "leading_ws": "", "training_ws": " ", "sent_idx": 0, "par_idx": 0, "lang": "en-us", "voice": "", "pos": "JJR", "phonemes": [ "m", "ˈɔ", "ɹ" ], "is_major_break": false, "is_minor_break": false, "is_punctuation": false, "is_break": false, "is_spoken": true, "pause_before_ms": 0, "pause_after_ms": 0 }, { "idx": 1, "text": "text", "text_with_ws": "text", "leading_ws": "", "training_ws": "", "sent_idx": 0, "par_idx": 0, "lang": "en-us", "voice": "", "pos": "NN", "phonemes": [ "t", "ˈɛ", "k", "s", "t" ], "is_major_break": false, "is_minor_break": false, "is_punctuation": false, "is_break": false, "is_spoken": true, "pause_before_ms": 0, "pause_after_ms": 0 }, { "idx": 2, "text": ".", "text_with_ws": ".", "leading_ws": "", "training_ws": "", "sent_idx": 0, "par_idx": 0, "lang": "en-us", "voice": "", "pos": null, "phonemes": [ "‖" ], "is_major_break": true, "is_minor_break": false, "is_punctuation": false, "is_break": true, "is_spoken": false, "pause_before_ms": 0, "pause_after_ms": 0 } ], "pause_before_ms": 0, "pause_after_ms": 0 }

对于整个输入行和每个单词,text 属性包含处理后的输入文本(带有规范化的空白),而 text_with_ws 保留原始空白。text_spoken 属性仅包含可发音的单词,因此不包括标点符号和断句。

每个单词内部包含:

  • idx - 单词在句子中的从零开始的索引
  • sent_idx - 句子在输入文本中的从零开始的索引
  • pos - 词性标签(如果可用)
  • phonemes - 单词的 IPA 音素列表(如果可用)
  • is_minor_break - 如果"单词"分隔短语(逗号、分号等),则为 true
  • is_major_break - 如果"单词"分隔句子(句号、问号等),则为 true
  • is_break - 如果"单词"是主要或次要断句,则为 true
  • is_punctuation - 如果"单词"是周围的标点符号(引号、括号等),则为 true
  • is_spoken - 如果不是断句或标点符号,则为 true

有关更多选项,请参阅 python3 -m gruut <语言> --help

SSML

支持 SSML 的一个子集:

  • <speak> - 包裹 SSML 文本
    • lang - 设置文档的语言
  • <p> - 段落
    • lang - 设置段落的语言
  • <s> - 句子(禁用自动断句)
    • lang - 设置句子的语言
  • <w> / <token> - 单词(禁用自动分词)
    • lang - 设置单词的语言
    • role - 设置单词角色(参见单词角色
  • <lang lang="..."> - 设置内部文本的语言
  • <voice name="..."> - 设置内部文本的语音
  • <say-as interpret-as=""> - 强制解释内部文本
    • interpret-as 可以是 "spell-out"、"date"、"number"、"time" 或 "currency" 之一
    • format - 根据 interpret-as 格式化文本的方式
      • number - "cardinal"、"ordinal"、"digits"、"year" 之一
      • date - 包含 "d"(基数日)、"o"(序数日)、"m"(月)或 "y"(年)的字符串
  • <break time=""> - 暂停给定的时间
    • time - 秒("123s")或毫秒("123ms")
  • <mark name=""> - 用户定义的标记(单词/句子的 marks_beforemarks_after 属性)
    • name - 标记的名称
  • <sub alias=""> - 用 alias 替换内部文本
  • <phoneme ph="..."> - 为内部文本提供音素
    • ph - 内部文本每个单词的音素,以空白分隔
  • <lexicon id="..."> - 内联或外部发音词典
    • id - 词典的唯一 id(用于 <lookup ref="...">
    • uri - 如果为空或缺失,则词典为内联
    • 一个或多个带有以下内容的 <lexeme> 子元素:
      • 可选的 role="..."(以空白分隔的单词角色
      • <grapheme>单词</grapheme> - 单词文本
      • <phoneme>音 素</phoneme> - 单词发音(音素以空白分隔)
  • <lookup ref="..."> - 为子元素使用发音词典
    • ref - 来自 <lexicon id="..."> 的 id

单词角色

在音素化过程中,使用词语角色来消除发音歧义。除非手动指定,词语的角色是根据其词性标签派生而来的,形式为gruut:<TAG>。对于首字母缩写词和拼读,使用gruut:letter角色来表示例如"a"应该发音为/eɪ/而不是/ə/

对于en-us,词性标注器还提供以下额外角色:

  • gruut:CD - 数词
  • gruut:DT - 限定词
  • gruut:IN - 介词或从属连词
  • gruut:JJ - 形容词
  • gruut:NN - 名词
  • gruut:PRP - 人称代词
  • gruut:RB - 副词
  • gruut:VB - 动词
  • gruut:VB - 动词(过去时)

内联词典

通过<lexicon><lookup>标签支持内联发音词典。gruut在这里与SSML标准略有不同,允许在SSML文档内定义词典(url为空或缺失)。此外,<lexicon>元素的id属性可以省略,表示一个"默认"的内联词典,不需要相应的<lookup>标签。

例如,以下文档将产生"tomato"一词的三种不同发音:

<?xml version="1.0"?> <speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="en-US"> <lexicon xml:id="test" alphabet="ipa"> <lexeme> <grapheme> tomato </grapheme> <phoneme> <!-- 各个音素用空格分隔 --> t ə m ˈɑ t oʊ </phoneme> </lexeme> <lexeme> <grapheme role="fake-role"> tomato </grapheme> <phoneme> <!-- 为假设的词语角色创造的发音 --> t ə m ˈi t oʊ </phoneme> </lexeme> </lexicon> <w>tomato</w> <lookup ref="test"> <w>tomato</w> <w role="fake-role">tomato</w> </lookup> </speak>

第一个"tomato"将在美式英语词典中查找(/t ə m ˈeɪ t oʊ/)。在<lookup>标签的作用域内,第二个和第三个"tomato"将在内联词典中查找。第三个"tomato"词附加了一个角色(在本例中选择了一个虚构的发音)。

gruut甚至允许完全省略<lexicon>的id。没有id时,就不再需要<lookup>标签,这样你可以覆盖文档中任何词的发音:

<?xml version="1.0"?> <speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="en-US"> <!-- 没有id意味着改变所有没有lookup的词 --> <lexicon> <lexeme> <grapheme> tomato </grapheme> <phoneme> t ə m ˈɑ t oʊ </phoneme> </lexeme> </lexicon> <w>tomato</w> </speak>

这将使文档中所有"tomato"的发音为/t ə m ˈɑ t oʊ/(除非它们有<lookup>)。

目标受众

gruut适用于将原始文本转换为语音发音,类似于phonemizer。与phonemizer不同,gruut在预先构建的词典(发音词典)中查找单词,或使用预先训练的字形到音素模型来猜测单词发音。每种语言的音素来自精心选择的音素目录。

对于每种支持的语言,gruut包含:

  • 基于开源数据构建的单词发音词典
    • 参见pron_dict
  • 用于猜测单词发音的预训练字形到音素模型

一些语言还包括:

  • 基于开源数据构建的预训练词性标注器:
    • 参见universal dependencies

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多