SHIRO/音素自動ラベリング(環境ビルド~ラベリング)

最近東北きりたんの歌声データベースが公開され、NEUTRINOがとても品質の高い歌声合成をしていました。

ですが、その歌声データベース構築にはラベリングという、音素単位で細かくラベル付けをするというとても地道で大変な作業があります

それをどうにか自動化、効率化できないかと思いSHIROという先日話題にもなっていたSynthVの開発者Kanru Huaさんのオープンソースソフトウェアを使用してラベリングを試みたというものです。

まぁ、結論から言うと歌声には全く使えず歌声データベースの効率化にはつかえなさそうでした...どうも1ファイルあたりが長い音声のラベリングには向いていないらしくまともにラベリングされませんでした。

Linux上でのSHIROビルド

基本ソースコード表示のところをコピペして実行していただければビルドできるはずです。

大前提としてCとLuaの環境やgit cloneなどができる状態であってください

まずはSHIROとcigletのクローンを作成します。

git clone https://github.com/Sleepwalking/SHIRO
git clone https://github.com/Sleepwalking/ciglet

クローン作成後cigletに移動してciglet内のsingle-fileをmakeします。

cd ciglet
make single-file

次はciglet内のmakeしたsingle-fileをSHIRO内のexternalにコピーします。

cd
cp -r ciglet/single-file SHIRO/external

SHIRO内のexternalに移動しコピーしたsingle-fileをcigletに解明して同じくexternal内でliblrhsmmをクローンします。クローン後makeします。

cd SHIRO/external
mv single-file/ ciglet/
git clone https://github.com/Sleepwalking/liblrhsmm
cd liblrhsmm
make

ついにSHIROをmakeするためのツール一式がそろったのでSHIROの構築を開始します。

cd
cd SHIRO
mkdir build
make

これでSHIROの構築が完了いたしました。

最後に、cigletのいらないファイルを消して終了です。

cd
rm -R --interactive=never ciglet

これで、SHIROの構築がかんりょういたしました。

また、今の作業はファイルの移動や削除、コピー等もすべての作業をコマンド上で実行するものなので一部は各自でGUIを使用してコマンド作業を飛ばすことができます。よくわからない人は今までの一連の流れをそのまま実行すればできます。

以下のシェルスクリプトでも構築可能だと思います(多分)

#!/usr/bin/bash

git clone https://github.com/Sleepwalking/SHIRO
git clone https://github.com/Sleepwalking/ciglet
cd ciglet
make single-file
cd
cp -r ciglet/single-file SHIRO/external
cd SHIRO/external
mv single-file/ ciglet/
git clone https://github.com/Sleepwalking/liblrhsmm
cd liblrhsmm
make
cd
cd SHIRO
mkdir build
make
cd
rm -R --interactive=never ciglet

SHIROを使用した自動音素ラベリング

これからは構築した環境を使用してラベリングをしていきたいところですが事前に注意点として、

・ラベリング対象ファイル数ができれば100個以上であること(精度が落ちる)

・ラベリング対象ファイルの長さが約10秒以下であること(精度が落ちる)

この2点を踏まえてください。

ファイル数に関しては複製などで同じファイルを量産することでも多少回避することができます。が、長さに関してはどうしようもありませんでした。

そのため歌声データベースのラベリングには使用できなさそうでした。ただし今回は紹介しませんがSHIRO上には自動で無音部を判定してラベルで有声部、無声部を分ける機能もあるためそちらを使用して有声部のみを切り出してそこをラベリングして最後に数値計算を行い分けた音声ファイルを合成することでファイル数、ファイルの長さ問題ともに解決することができる、はずです。

それと、音素定義ファイルの数値設定を詰めることで歌声ラベリングにも使用できる場合があります。

それでは、ラベリングの手順を紹介します。

最初に処理順を書いておきます。

mkpm->pm2md->fextr->mkseg->mkhsmm->rest->align->seg2lab

こちらの流れで処理をします。

まずはoto2labのtableに準した日本語の音素定義のcsvを作成してください。SHIRO/examplesにjapanese-phoneset.csvという名前で作成して改行=LFで下記の内容をコピペして保存してください。

pau
sil
cl
br durfloor 0.05
a durfloor 0.05
i durfloor 0.05
u durfloor 0.05
e durfloor 0.05
o durfloor 0.05
N durfloor 0.05
y durceil 0.3
v durceil 0.3
w durceil 0.3
k durceil 0.3
g durceil 0.3
ky durceil 0.3
gy durceil 0.3
kw durceil 0.3
gw durceil 0.3
s durceil 0.3
z durceil 0.3
sh durceil 0.3
j durceil 0.3
t durceil 0.3
d durceil 0.3
ch durceil 0.3
ts durceil 0.3
dy durceil 0.3
ty durceil 0.3
n durceil 0.3
ny durceil 0.3
h durceil 0.3
b durceil 0.3
p durceil 0.3
hy durceil 0.3
by durceil 0.3
py durceil 0.3
f durceil 0.3
m durceil 0.3
my durceil 0.3
r durceil 0.3
ry durceil 0.3

次はラベリング対象の音声ファイルをSHIRO/audioに入れます。

audioフォルダは最初からあるフォルダではないので各自で作成して入れてください。

次はラベリング対象をcsvファイルに書き出します。SHIROフォルダ直下にindex.csvという名前で作成して改行=LFでExcelならばA行にファイル名、B行に先ほどの音素定義に従い音素を書きます。(あかさたな→a k a s a t a n a)

Excelじゃなく各自のテキストエディタならば ファイル名,音素 といった風に「,」で区切ってください

また、最初と最後に自動的にsilが挿入されます。

サンプル↓

akatombo,y u u y a k e k o y a k e e n o a k a t o N b o pau o w a r e t e m i t a n o o w a a i ts u n o o h i i k a pau y a a m a n o h a t a k e e n o k u w a n o m i o pau k o k a g o n i ts u N d a a w a a m a b o r o o sh i i k a pau j u u g o d e n e e y a a w a y o m e n i y u k i pau o s a t o n o t a y o r i i m o o t a e h a a t e e t a
alps_ichimanjaku,a r u p u s u i ch i m a N j a k u k o y a r i n o u e d e pau a r u p e N o d o r i o o d o r i m a sh o pau i i w a n a ts u r u k o n i y a m a j i o k i k e b a pau k u u m o n o k a n a t a o s a o d e s a s u pau s e cl k e i h i k a r u y o r a i ch o o i z u k o n i pau e e d e r u v a a i s u s o k o k a sh i k o pau r a N r a r a r a r a r a r a r a r a N r a r a r a r a r a r a pau r a N r a r a r a r a r a r a r a r a r a r a r a r a
amehuri,a m e a m e f u r e f u r e k a a s a N g a pau j a n o m e d e o m u k a e u r e sh i i n a pau p i cl ch i p i cl ch i ch a cl p u ch a cl p u r a N r a N r a N pau k a k e m a sh o k a b a N o k a a s a N n o pau a t o k a r a y u k o y u k o k a n e g a n a r u pau p i cl ch i p i cl ch i ch a cl p u ch a cl p u r a N r a N r a N pau a r a a r a a n o k o w a z u b u n u r e d a pau y a n a g i n o n e k a t a d e n a i t e i r u pau p i cl ch i p i cl ch i ch a cl p u ch a cl p u r a N r a N r a N
antagata_dokosa,a N t a g a t a d o k o s a h i g o s a h i g o d o k o s a pau k u m a m o t o s a pau k u m a m o t o d o k o s a s e N b a s a pau s e N b a y a m a n i w a t a n u k i g a o cl t e s a pau s o r e o ry o sh i g a t e cl p o d e u cl t e s a n i t e s a y a i t e s a k u cl t e s a pau s o r e o k o n o h a d e ch o i t o k a b u s e
chatsumi,n a ts u m o ch i k a z u k u h a ch i j u u h a ch i y a pau n o n i m o y a m a n i m o w a k a b a g a sh i g e r u pau a r e n i m i e r u w a ch a ts u m i j a n a i k a pau a k a n e d a s u k i n i s u g e n o k a s a pau h i y o r i ts u z u k i n o ky o k o n o g o r o o pau k o k o r o n o d o k a n i ts u m i ts u ts u u t a u pau ts u m e y o ts u m e ts u m e ts u m a n e b a n a r a n u pau ts u m a ny a n i h o N n o ch a n i n a r a n u
donguri_korokoro,d o N g u r i k o r o k o r o d o N b u r i k o pau o i k e n i h a m a cl t e s a t a i h e N pau d o j o o g a d e t e k i t e k o N n i ch i w a pau b o cl ch a N i cl sh o n i a s o b i m a sh o pau d o N g u r i k o r o k o r o y o r o k o N d e pau sh i b a r a k u i cl sh o n i a s o N d a r a pau y a cl p a r i o y a m a g a k o i sh i t o pau n a i t e w a d o j o o o k o m a r a s e t a
furusato,u s a g i o i sh i k a n o y a m a pau k o b u n a ts u r i sh i k a n o k a w a pau y u u m e w a i i m a m o m e e g u u r i i t e pau w a s u r e g a t a k i f u r u s a t o pau i k a n i i m a s u ch i ch i h a h a pau ts u ts u g a n a sh i y a t o m o g a k i pau a a m e n i k a a z e n i ts u u k e e t e e m o pau o m o i i z u r u f u r u s a t o pau k o k o r o z a sh i o h a t a sh i t e pau i ts u n o h i n i k a k a e r a N pau y a a m a w a a a o k i f u u r u u s a a t o pau m i z u w a k i y o k i f u r u s a t o
genkotsuyamano_tanukisan,g e N k o ts u y a m a n o t a n u k i s a N pau o cl p a i n o N d e n e N n e sh i t e pau d a cl k o sh i t e o N b u sh i t e m a t a a sh i t a
haruga_kita,h a r u g a k i t a h a r u g a k i t a d o k o n i k i t a pau y a m a n i k i t a s a t o n i k i t a n o n i m o k i t a pau h a n a g a s a k u h a n a g a s a k u d o k o n i s a k u pau y a m a n i s a k u s a t o n i s a k u n o n i m o s a k u pau t o r i g a n a k u t o r i g a n a k u d o k o d e n a k u pau y a m a d e n a k u s a t o d e n a k u n o d e m o n a k u
kagome_kagome,k a g o m e k a g o m e pau k a g o n o n a k a n o t o r i i w a pau i ts u i ts u d e y a a u pau y o a k e n o b a N n i pau ts u r u t o k a m e g a s u b e cl t a pau u sh i r o n o sh o m e N d a a r e

これで、自動ラベリングの準備が完了いたしました。

以下を順番に実行してください。

mkpm(日本語音素定義を作成する)

lua shiro-mkpm.lua examples/japanese-phoneset.csv \
 -s 3 -S 3 > phonemap.json

pm2md(日本語モデル定義を作成する)

lua shiro-pm2md.lua phonemap.json \
 -d 12 > modeldef.json

fextr(特徴抽出。入力波を16000 Hzのサンプルレートにダウンサンプリングして、1次および2次のデルタ機能を持つ12次のMFCCを抽出する。)

lua shiro-fextr.lua index.csv \
 -d "./audio" \
 -x ./extractors/extractor-xxcc-mfcc12-da-16k -r 16000

mkseg(インデックスファイルからダミーのセグメンテーションを作成します。)

lua shiro-mkseg.lua index.csv \
 -m phonemap.json \
 -d "./audio" \
 -e .param -n 36 -L sil -R sil > unaligned.json

mkhsmm(空のモデルを作成します。)

./shiro-mkhsmm -c modeldef.json > empty.hsmm

rest(HMMトレーニングアルゴリズムを用いたブートストラップ/プレトレーニングを行う。)

./shiro-rest \
 -m empty.hsmm \
 -s unaligned.json \
 -n 5 -g > markovian.hsmm

align(トレーニングしたモデルに応じてアライメントを更新します。)

./shiro-align \
 -m markovian.hsmm \
 -s unaligned.json \
 -g > markovian-segmentation.json

seg2lab(トレーニングされたセグメンテーションをAudacityラベルファイルに変換します。)

lua shiro-seg2lab.lua markovian-segmentation.json -t 0.005

これで、すべての操作が完了しました。

SHIRO/audio内に.txt形式でAudacityで読み込めるラベルファイルが生成されます。

お疲れさまでした。

最後まで読んでいただきありがとうございます。

この記事が気に入ったらサポートをしてみませんか?