【実践編】開発を想定したTalSingの使い方解説

この記事では、替え歌合成システム「TalSing」を開発する想定で、ファイル構成からデータの追加方法までを具体的に説明する。
TalSingのシステム概要についてはこちらの記事にまとめている。そちらの記事を参照し、システムについてある程度理解してから当記事を読むことを推奨する。
目次
1. ファイル構成
システム全体のファイル構成は以下の通りである。なお、記載のファイル構成は手順(README参照)に沿って全てのインストール工程を踏んだ後の状態である。
TalSing(root)
┣ nnsvs
┃ ┗ ...(NNSVS由来のファイル, 一部当システム用に追加)
┃
┣ recipes
┃ ┣ _common
┃ ┃ ┗ ...(NNSVS由来のファイル, 一部当システム用に追加)
┃ ┃
┃ ┗ seven/dev-48k-world
┃ ┣ data/acoustic/label_phone_score
┃ ┣ dump
┃ ┣ exp
┃ ┣ forSynthesis
┃ ┃ ┣ result
┃ ┃ ┣ wav_refer
┃ ┃ ┣ xml_paro
┃ ┃ ┗ xml_refer
┃ ┣ functions
┃ ┣ images
┃ ┣ outputs
┃ ┣ run.sh
┃ ┗ talsing_gui.py
┃
┗ utils
┗ ...(NNSVS由来のファイル)
「NNSVS由来のファイル」とある部分には歌声の合成に必要な関数等が入っており、基本的には参考元のドキュメントを参照されたい。一部「synthesis_parody.py」のように当システム用に作成したフィルも存在するが、これも元のスクリプトをベースに記述したものである。
当システムのメインとなるスクリプトは seven/dev-48k-world 直下のファイル群である。
ここからはそれぞれについて簡単に説明しておく。
data/acoustic/label_phone_score
入力音声が反映された楽譜ファイル(.xml)を変換したフルコンテキストラベル(.lab)を格納。システムが自動で保存。
dump
学習結果の歌声の特徴量を格納。任意の歌声データで学習させる際はNNSVSの形式に統一させる。
exp
モデル構造・パラメータ等を記述したファイルを格納。
forSynthesis
/result
NNSVSで合成した最終的な歌声を格納。
/wav_refer
伴奏楽曲ファイルを格納。ファイル名は「数字.wav」とし、xml_referのファイル名と一致させる。
/xml_paro
入力音声を反映させた新規替え歌楽譜を格納。システムが自動で保存。
/xml_refer
各楽曲のベースとなる楽譜を格納。ファイル名は「数字.xml」とし、wav_referのファイル名と一致させる。
functions
録音や楽譜編集等を行う関数やyamlファイルを格納。主に使用するスクリプトは以下。
- rec2text.py … 収録と音声認識を行う。マイクを2本使用し独立成分分析を行うときに使用。
- rec2text_single.py … 収録と音声認識を行う。マイクを1本のみ使用し通常の収録を行うときに使用。
- makeparoscore.py … 新規楽譜ファイルを作成。
- xml2lab.py … 替え歌楽譜をフルコンテキストラベルに変換。
- playtwowaves.py … 伴奏音源と合成された歌声を並列再生。
- config.yaml … 諸々の設定ファイル。ファイル内のManualセクションは必要に応じて使用者が変更可能。Autoセクションは複数スクリプト間のデータ共有用でありシステム側が自動で変更。
- colorpreset.yaml … 設定画面で選択可能なデザインのカラープリセット(後述)。
run.sh
歌声合成時の最初に実行するスクリプト。
このスクリプトから TalSing(root)/recipes/_common/spsvs/synrthesis_parody.sh へ移行し一連の処理が行われる。
talsing_gui.py
TalSingのGUIに関して記述されたメインスクリプト。このファイルを実行することでシステムが起動。
2. 楽曲追加方法
TalSingでは、楽曲ファイルとそれに対応するベースとなる楽譜を用意することで簡単に楽曲を追加することができる。この章ではその追加方法を順に説明する。
① ベースとなる楽譜を用意する
XML形式の楽譜ファイルを用意する。作成時のポイントは以下。
- メロディは最低8分音符とする。(推奨。楽曲のBPMにもよる。)基本的に替え歌作成時にはノートが分割されるため、元の楽譜のノートが短いと替え歌楽譜のノートはさらに短くなり、とても早口な歌、最悪の場合合成不可能になる。
- 8分音符と4分音符を適度に混ぜたメロディが良い。上記と同様の理由で、あらかじめ適度に長いノート(4分音符以上)を含ませておくと分割に余裕が生まれる。
- 歌詞は任意のひらがなで全て埋める(GitHubにアップロードしたものは「ら」で埋めている)。入力テキストがベース楽譜の歌詞のモーラ数に満たないとき、このひらがなで歌声が合成される。
- 「上げ弓記号 v 」を付けたノートは分割されない。フレーズの最後など、分割せずに伸ばした方が自然だと思われるノートに付けると替え歌の自然性が向上する。
- 「ブレス記号 ’ 」を付けると、そこが文節の区切れ目として扱われる。ひとつの単語が休符を跨ぐ歌詞は自然性が損なわれる傾向にあるため、適度に休符に付けると良い。しかし、極端に短い文節が生まれると少ないノートに長い文節が割り当てられる可能性が高まるため、区切り過ぎに注意。
② 伴奏楽曲を用意する
WAV形式の楽曲ファイルを用意する。作成時のポイントは以下。
- 楽譜と時間をリンクさせる。
例) メロディの最初のノートが2小節目1拍目の場合、楽曲もそれに合わせ1小節目は短いイントロ的なものを入れる - 各楽曲ファイルの音量を揃える。
③ ファイルを格納する
①, ②で作成した各ファイルを下記フォルダに配置する。
- 楽譜(.xml): TalSing(root)/recipes/seven/dev-48k-world/forSynthesis/xml_refer
- 楽曲(.wav): TalSing(root)/recipes/seven/dev-48k-world/forSynthesis/wav_refer
なお、ファイル名はジャンル選択画面で表示したい順番の番号とし、対応するファイルは同名にする。例)01.wav, 01.xml
④ 楽曲名を追加する
最後にジャンル選択画面で表示したい名前でリストに追加する。
./dev-48k-world/functions/config.yaml を開き、16行目からのgenreリストに名前を追記する。
例)01: アニソン風,02: ロック,03: バラードのとき
genre:
- “アニソン風”
- “ロック”
- “バラード”
以上で楽曲の追加は完了である。
3. カラープリセット追加方法
この章では設定画面から選択することのできるカラープリセットの追加方法について説明する。
といっても編集するファイルはひとつだけである。…/seven/dev-48k-world/functions/colorpreset.yaml を開くと以下のようにリストが並んでいる。
Green:
- '#2CC985' # main color
- '#0C955A' # hover color
- '#edffdb' # background color
Blue:
- '#3B8ED0'
- '#36719F'
- '#eaffff'
・
・
・
この例に倣って任意のカラーコードを追加すれば完了である。
一応リストの各要素について触れると、
- main color … ボタンの色
- hover color … カーソルを合わせたときのボタンの色
- background color … その他の領域(=背景)の色
である。また、このファイルに表記する色の名前(上図だとGreenとBlue)がそのまま設定画面のプリセットの名前として表示される。
4. 最後に
以上がTalSingの主な使い方です。
もちろん、ここからさらにシステムを開発することになれば実際にソースコードを見ていく必要がありますが、当記事と前回の【概要編】を読み終えた頃には幾分システムが理解しやすくなっていることでしょう。
前回の記事にも書きましたが、現状のシステムは現段階での姿であって、完成形ではありません。
私の所属研究室の後輩をはじめ、(もしいるのであれば)当システムに興味をもっていただいた全ての方に積極的にシステムを進化させていってほしいと思います。
そしてもしその中で分からないこと、相談したいことがあればいつでも遠慮なく連絡をください。(このシステムがいつまで使われるか分かりませんが、私が卒業した後でも大歓迎です。)
年を重ねるごとに実感しますが、「知らないこと(無知の無知)」よりも「知らないことを知った上で知らないままでいること(無知の知)」の方がよっぽど罪が重いと思います。
そしてそれが自分の興味のあることであるなら尚更。
「知ること」の過程がどのような道につながっているかなんて「知って」みなきゃ誰も分かりません。
もしその過程に少しでも関わることができるのであれば私は喜んで協力します。
これにて替え歌合成システム「TalSing」に関する記述は一旦終わります。
今後システムがアップデートされたとき、もしくは別のネタを思いついたとき、また文字に起こしたいと思います。
ここまでお付き合いいただきありがとうございました。