跳转到主要内容

将音素转换为整数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,ab 分别是 0 和 1。请注意,a_bb_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 的学习功能可以帮助您减少音素集。一个典型的流程是

  1. 在您的输入数据上运行 phonemes2ids 并使用 --write-phoneme-counts
  2. 查看音素计数文件,并决定哪些音素应该重新映射(通常是例子很少的音素)
  3. 创建一个音素映射文本文件,其中每行是 <FROM> <TO>,例如 ʌ ə(每个 ʌ 的出现都替换为 ə
    • <TO> 可以是多个音素,如 aɪ a ɪ,这将分解双元音
  4. 重新运行 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]

有关 phonemes2idslearn_phoneme_ids 的更多信息,请参阅文档字符串。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

phonemes2ids-1.2.2.tar.gz (12.4 kB 查看哈希值)

上传时间

由以下支持