Monthly Hacker's Blog

プログラミングや機械学習の記事を中心に書きます。

声優統計コーパスWaveNetプロジェクトその1 前処理編

はじめに

こんにちは、@dhgrsです。以前こんな記事を書きました。
www.monthly-hack.com
本記事は、このプロジェクトの前処理編です。

プロジェクトについて

声優統計コーパスはとても面白いデータセットだと思うのですが、あまり活用例を聞きません。そこで、声優統計コーパスの布教のため、WaveNetによる音声合成をしてみようというプロジェクトです。(当初は歌声合成もやってみたいと思っていましたが、歌声データセットではないので、現実的ではないと考え対象から外しました)前処理編は以下のリポジトリが対応しています。
github.com

プロジェクトの流れ

  • 前処理編(音素アライメントの生成) 本記事はこれ
  • 学習編(音素アライメントを補助特徴量にしたWaveNetの学習)
  • 生成編(音素アライメントを与えるTTS)

手法1 CTCロスによる音素アライメントの学習

音声認識でよく使われるCTCロスというものがあります。僕にはmusyokuさんのCTCロス解説記事が分かりやすかったです。
musyoku.github.io

このロスを使えば、声優統計コーパスのような、音声と対応する文のみの(言い換えると音素アライメントがない)データセットでもアライメントを生成することができると考えました。一応コードも書いて学習も回した(5d5adde)のですが音声合成の師匠(twitterで相手をしていただいているだけですが、勝手に師匠だと思っています)から


こんな意見をいただいたので、早々に諦めました。学習結果を確認していませんが、ロスの値を見ても、それほど良い性能は出ていないと思います。もし何か知見がありましたら、コメント欄やgithubのissueやtwitterのリプライでお願いします。

手法2 Juliusによる音素セグメンテーション

juliusの説明を公式サイトより引用します。

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです. 数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持っています.

Juliusには音素アライメントの作成用に音素セグメンテーションキットというものが用意されています。様々なOSで動きますが、WindowsというOSをメインターゲットとしているようですので、もし環境を用意できるのであればWindowsでの作業をおすすめします。ちなみに、このブログの読者の方ですとWindowsを知らない方もいるかと思いますが、どうやらデスクトップOSシェアNo.1で、みなさんご存知のResNetを発表したMSが作っているOSです。

今回はこの音素セグメンテーションキットに対応した形式に変換するツールを作成しました。juliusブランチにコードを載せています。
github.com
params.pyに声優統計コーパスを保存しているディレクトリを指定して、preprocess.pyを実行するだけで、前処理(音素セグメンテーション)のための前処理ができます。同じ階層のディレクトリにpreprocessedという名前のディレクトリが作成されて、対応した形式に変換された音声ファイルとテキストファイルが生成されます。その後、音声ファイルとテキストファイルを音素セグメンテーションキットのwavディレクトリに移してからsegment_julius.plを実行すると、.labファイルができます。.labファイルはこのような形式です。

0.0000000 0.1425000 silB
0.1425000 0.2125000 m
0.2125000 0.2925000 a
0.2925000 0.3725000 t
0.3725000 0.4625000 a
0.4625000 0.5725000 t
0.5725000 0.7225000 o:
0.7225000 0.8225000 j
0.8225000 0.8525000 i
0.8525000 0.9225000 n
0.9225000 1.0025000 o
1.0025000 1.0825000 y
1.0825000 1.1925000 o:
1.1925000 1.2825000 n
1.2825000 1.4625000 i
1.4625000 1.8325000 g
1.8325000 1.9125000 o
1.9125000 1.9725000 d
1.9725000 2.0925000 a
2.0925000 2.1525000 i
2.1525000 2.3325000 my
2.3325000 2.4425000 o
2.4425000 2.4725000 u
2.4725000 2.5825000 o:
2.5825000 2.6225000 t
2.6225000 2.6525000 o
2.6525000 2.7325000 y
2.7325000 2.7725000 o
2.7725000 2.8225000 b
2.8225000 2.8925000 a
2.8925000 2.9525000 r
2.9525000 3.0125000 e
3.0125000 3.0525000 r
3.0525000 3.0825000 u
3.0825000 3.2625000 sh
3.2625000 3.2925000 u
3.2925000 3.3625000 y
3.3625000 3.4725000 o:
3.4725000 3.5325000 n
3.5325000 3.6125000 a
3.6125000 3.7525000 my
3.7525000 3.8225000 o:
3.8225000 3.9625000 o:
3.9625000 4.0325000 n
4.0325000 4.0725000 o
4.0725000 4.2225000 ch
4.2225000 4.3625000 u:
4.3625000 4.4725000 o:
4.4725000 4.5425000 n
4.5425000 4.5825000 i
4.5825000 4.6425000 h
4.6425000 4.7225000 a
4.7225000 4.7825000 i
4.7825000 4.8525000 s
4.8525000 4.8925000 a
4.8925000 4.9225000 r
4.9225000 5.0025000 e
5.0025000 5.0425000 r
5.0425000 5.0925000 u
5.0925000 5.1225000 k
5.1225000 5.2025000 o
5.2025000 5.2425000 t
5.2425000 5.2725000 o
5.2725000 5.3625000 m
5.3625000 5.5125000 o
5.5125000 5.6025000 o:
5.6025000 5.7725000 i
5.7725000 7.1425000 silE

ご覧の通り、音素アライメントが記述されています。精度がどのくらいかは、自分で確認していませんが、Twitterではまあまあな精度だと情報をいただいているので、まずはこの結果を使って学習してみようと思います。また、このあたりの手順は、近いうちにgithubのREADMEにも載せる予定です。

さいごに

本記事では声優統計コーパスWaveNetプロジェクトの前処理編でやったことを紹介しました。本当はGWを利用して時間を掛けて良い記事を書こうとしたのですが、気付いたらGW最終日でした...