将音素转换为整数ID
项目描述
phonemes2ids
为音素分配整数ID的灵活工具。
适用于文本到语音或语音到文本应用,在这些应用中,文本被音素化,转换为整数向量,然后用于训练网络。
安装
phonemes2ids可在PyPI上使用
pip install phonemes2ids
如果安装成功,您应该能够运行
phonemes2ids --version
学习音素ID
cat << EOF |
a b c
b a a b
EOF
phonemes2ids --write-phonemes phonemes.txt
它将打印出
0 1 2
1 0 0 1
查看phonemes.txt,我们得到
0 a
1 b
2 c
重要的是,音素ID的分配是确定的。它基于观察到的最终音素集合的排序顺序。因此,改变输入行的顺序
cat << EOF |
b a a b
a b c
EOF
phonemes2ids --write-phonemes phonemes.txt
不会改变与每个音素相关的ID
1 0 0 1
0 1 2
预分配音素
我们可以在事先为一些(或所有)音素预分配ID,其余的允许学习
echo '0 c' > assigned_phonemes.txt
cat << EOF |
b a a b
a b c
EOF
phonemes2ids --read-phonemes assigned_phonemes.txt \
--write-phonemes phonemes.txt
输出现在是
2 1 1 2
1 2 0
并且phonemes.txt显示了新的分配
0 c
1 a
2 b
音素/单词分隔符和空格
默认情况下,假设音素之间没有分隔,单词由空白分隔。让我们指定音素由'_'分隔,单词由'|'分隔
echo 'a|b|a_b|b_a' | phonemes2ids -p '_' -w '|'
0 1 0 1 1 0
其中 a
是 0,b
是 1。
单词分隔符在您想要在单词之间插入空白标记时特别有用
echo '0 #' > assigned_phonemes.txt
echo 'a|b|a_b|b_a' | \
phonemes2ids -p '_' -w '|' --blank '#' \
--read-phonemes assigned_phonemes.txt
0 1 0 2 0 1 2 0 2 1 0
其中 #
是 0,a
和 b
分别是 0 和 1。请注意,a_b
和 b_a
在输出中被 #
(0) 包围,因为它们是单词。
空白标记对于某些机器学习模型很有用,例如 GlowTTS。默认情况下,它们在单词之间插入,包括在第一个单词之前(使用 --no-blank-start
修改)和最后一个单词之后(使用 --no-blank-end
修改)。
可以在每个音素之间(而不是仅在单词之间)包含空白标记
echo '0 #' > assigned_phonemes.txt
echo 'a|b|a_b|b_a' | \
phonemes2ids -p '_' -w '|' --blank '#' --blank-between tokens \
--read-phonemes assigned_phonemes.txt
0 1 0 2 0 1 0 2 0 2 0 1 0
现在输出中的每个其他音素/标记都是空白(#
= 0)。
填充/BOS/EOS 符号
通常包括填充(pad)、BOS(句子开头)和EOS(句子结尾)符号。这些通常占据前几个音素ID,尤其是填充符号几乎总是0。
可以使用 --auto-bos-eos
自动添加 bos/eos
echo 'a b c' | \
phonemes2ids --auto-bos-eos \
--pad '_' --bos '^' --eos '$' \
--write-phonemes phonemes.txt
1 3 4 5 2
查看 phonemes.txt,我们可以看到 pad、bos 和 eos 已经被自动分配了ID(按此顺序)
0 _
1 ^
2 $
3 a
4 b
5 c
第一个命令(1 3 4 5 2
)的输出现在可以解释为 ^ a b c $
。
重音/声调分离
根据您的使用情况,重音标记和声调被分离到不同的音素中可能很重要。
默认情况下,重音被认为是音素的一部分
echo "ˈa a cˌ c" | phonemes2ids -p ' '
3 0 2 1
注意每个音素都收到了一个独特的ID。为了将 IPA 的一级/二级重音字符(U+02C8 和 U+02CC)分离
echo "ˈa a cˌ c" | \
phonemes2ids -p ' ' --separate-stress \
--write-phonemes phonemes.txt
0 2 2 3 1 3
查看 phonemes.txt,我们可以看到首先分配了重音标记的ID
0 ˈ
1 ˌ
2 a
3 c
如果需要,声调也可以被分离。这些表示为跟随音素后面的数字([0-9]+
)
echo 'a123 b45 c6' | \
phonemes2ids -p ' ' --separate-tones \
--write-phonemes phonemes.txt
3 0 4 1 5 2
声调被分配了单独的ID,并放置在相应的音素之后(使用 --tone-before
进行更改)
0 123
1 45
2 6
3 a
4 b
5 c
高级分离
可以使用 --separate-graphemes
标志和 --separate <string>
选项进一步控制音素的部分分离。
--separate-graphemes
标志将导致所有 Unicode 字符在分配 ID 之前被分解为码点
echo 'ɑ̃' | \
phonemes2ids --separate-graphemes
0 1
其中 U+0251(ɑ
)是 0,U+0303(鼻音)是 1。
使用 --separate <string>
(一次或多次)指定要分离的确切字符
echo 'aː' | \
phonemes2ids --separate 'ː'
0 1
其中 a
是 0,ː
是 1。如果分隔符出现在音素中间,则音素将分为三部分(之前、分隔符、之后)
echo 'aːb' | \
phonemes2ids --separate 'ː'
0 2 1
其中 a
是 0,b
是 1,ː
是 2。
标点简化
如果您只关心句子中的短停顿和长停顿,那么 --simple-punctuation
标志就是您的选择!它将常见的标点符号替换为 ,
(短停顿)或 .
(长停顿)
echo ', . : ; ! ?' | \
phonemes2ids --simple-punctuation
0 1 0 0 1 1
其中 ,
是 0,.
是 1。使用 --phoneme-map
进行更多控制。
音素计数和映射
phonemes2ids 的学习功能可以帮助您减少音素集。一个典型的流程是
- 在您的输入数据上运行
phonemes2ids
并使用--write-phoneme-counts
- 查看音素计数文件,并决定哪些音素应该重新映射(通常是例子很少的音素)
- 创建一个音素映射文本文件,其中每行是
<FROM> <TO>
,例如ʌ ə
(每个ʌ
的出现都替换为ə
)<TO>
可以是多个音素,如aɪ a ɪ
,这将分解双元音
- 重新运行
phonemes2ids
并使用--phoneme-map
和--write-phonemes
确保将音素映射与您的 phonemes.txt 文件一起保留!
将音素转换为ID
一旦您设置了所有设置,就是时候转换一些输入数据了!这通常会看起来像
phonemes2ids --read-phonemes phonemes.txt \
--phoneme-map map.txt \
[other settings] \
< input_phonemes.txt \
> output_ids.txt
其中 phonemes.txt
包含您在学习阶段的所有音素/ID对,而 map.txt
包含您希望自动替换的音素/音素对。输出文件的每一行(output_ids.txt
)将包含输入文件(input_phonemes.txt
)中对应行的ID。
如果您的输入文件有分隔符,您可以保留每行输出的额外信息
echo 's1|a b c' | phonemes2ids --csv
s1|a b c|0 1 2
使用 --csv
标志表示输入数据由 '|'(可使用 --csv-delimiter
修改)分隔。每行的最后一列被认为是输入音素,而ID则简单地附加为新的列。这允许您将任意元数据传递到输出文件。
Python 库
您可以直接从 Python 使用 phonemes2ids
from phonemes2ids import phonemes2ids
word_phonemes = [["a"], ["b"], ["c"], ["b", "c", "a"]]
phoneme_to_id = {"a": 1, "b": 2, "c": 3}
ids = phonemes2ids(word_phonemes=word_phonemes, phoneme_to_id=phoneme_to_id)
assert ids == [1, 2, 3, 2, 3, 1]
有关 phonemes2ids
和 learn_phoneme_ids
的更多信息,请参阅文档字符串。
项目详情
phonemes2ids-1.2.2.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8e3e9e0723215c7187b56276bb053688a43851d8deb9948432e793262551c2ac |
|
MD5 | ade80bfa91c00615a512768fa4371585 |
|
BLAKE2b-256 | 276f0cf0746d02a356103b7c3a065dbc188d8b5092e58bb363d74aa668ee1ad1 |