タイミングの調整方法

この記事ではタイミングの調整方法について説明します。
こちらの記事を参考にしています。
タイミング調整の基本的な流れ
- MusicXMLからlabelファイルと音声を合成
- Wavesurferでタイミングラベルを修正
- 修正したラベルを元に音声を合成
- 2~3の繰り返し

WaveSurferとは
- 複数のプラットフォームに対応したフリーの音声解析ソフト
- 音声にラベル付けができる
- F0,パワー、フォルマントといった音声特徴量を表示しながら作業ができます
参考ページ
WaveSureferガイド – Waseda
WaveSurferの使用方法
ダウンロード
こちらから最新版をダウンロードします。
適当なフォルダに解凍してください。
下準備
まずはMusicXMLからlabelファイルと音声を合成しておきます。
この後はscore\label以下のラベルファイルとoutput以下のwavファイルを用いてタイミングの調整をしていきます。
画面の設定

WaveSurferを起動し、[File] -> [Open…] からNEUTRINO\output以下のwavファイルを開きます。設定ダイアログが出ますが、とりあえずそのままOKを押してください。
そのままだと使いづらいのでペインを追加していきます。
右クリック -> [Create Pane] -> [Waveform]を選択すると、一つ上に新しくPaneが追加され詳細な音声波形が表示されます。
同様に[spectrogram]、[waveform]、[transcription]、[transcription]、[time-axis]の並び順で追加します。
画面設定の保存
納得のいくペイン構成にしたら、その状態を保存し次回以降ワンタッチで適用させることができます。右クリック->[Save Configuration …]を選び、テンプレート名を入力して保存してください。次回以降はファイル読み込み時の設定ダイアログか、右クリックメニューの[Apply Configuration…]で適用することができます。
タイミングの修正
次にラベル情報を読み込みます。
上側のtranscription上で右クリック -> [Load Transcription] -> NEUTRINO\score\label\mono\*.labを選択。
下側のtranscriptionで右クリック -> [Load Transcription] -> NEUTRINO\score\label\timing\*.labを選択。
上手くいくと下記のようにラベル情報が追加されます。

上部のtranscriptionは音符の開始タイミング、下部のtranscriptionは音素の開始タイミングを表しています。
音声の指定した区間に手動によるラベルを付けることができます。
例えば「こんにちは」という波形のどこからどこまでが「k」なのか、「o」なのかといった視覚的な印を付けることができます。
こちらを利用して調整したい箇所のタイミングを調整します。
調整の仕方
下部のTranscriptionの修正したい音素の縦ラインを選択しながら左右に移動することで修正できます。
基本的には母音は音符の開始タイミング辺りに合わせ、子音は少し前に出すと安定した音声が出力されやすいです。
学習データの関係上、ロングノートの子音、高速歌唱、促音「っ」辺りなどはタイミングの推定をミスしていることが多いです。音を聞いて違和感を感じたらタイミングがずれていないか確認してみて下さい。
たまに隣の音素を飛び越えたりして、表示が潰れている場合もありますので適宜調整してください。
(飛び越えるのはバグなのでその内直します…。)
データの保存
各ペインに表示されているデータは一部を除いてテキストデータとして保存できます。
上記タイミング情報を保存する際は[Save Transcription As …]を選択すれば保存できます。NUTRINO\score\label\timing以下に保存してください。
音声の合成
タイミングの修正が終わりましたら、次に音声を合成します。
そのままRun.batを回すと上書きされてしまいますので、設定を変更します。
- Run.batをコピーしてTiming.batを作成
- musicXMLtoLabel.exeの行をコメントアウト(先頭に:を付けます)
bin\musicXMLtoLabel.exe score\musicxml\%BASENAME%.%SUFFIX% score\label\full\%BASENAME%.lab score\label\mono\%BASENAME%.lab
↓
:bin\musicXMLtoLabel.exe score\musicxml\%BASENAME%.%SUFFIX% score\label\full\%BASENAME%.lab score\label\mono\%BASENAME%.lab
- NEUTRINOにtiming推定スキップのオプションを追加(-sを付けます)
bin\NEUTRINO.exe score\label\full\%BASENAME%.lab score\label\timing\%BASENAME%.lab output\%BASENAME%.f0 output\%BASENAME%.mgc output\%BASENAME%.bap model\%ModelDir%\ -n %NumThreads% -t
↓bin\NEUTRINO.exe score\label\full\%BASENAME%.lab score\label\timing\%BASENAME%.lab output\%BASENAME%.f0 output\%BASENAME%.mgc output\%BASENAME%.bap model\%ModelDir%\ -n %NumThreads% -t -s
- コマンドプロンプト上でTiming.batを実行
以上で一連の流れは終わりです。ある程度直感的に音声が変化するようにしていますので、何度かやれば傾向は掴んでいただけるかと思います。
上級者向け
タイミングラベルには時間情報と音素のみが記述されています。楽譜のキーをシフトした場合など音素・音符の変更が無い場合はタイミングラベルを使いまわすこともできますので、 キー変ピッチ変ガチャにぜひご活用ください。
サンプルを下に書いておきます。fullはbasename_take.labなのに対し、timingはbasename.labなのがポイントです。
set TAKE=key1
set PitchShift=0.944
: NEUTRINO
bin\NEUTRINO.exe score\label\full\%BASENAME%_%TAKE%.lab score\label\timing\%BASENAME%.lab output\%BASENAME%_%TAKE%.f0 output\%BASENAME%_%TAKE%.mgc output\%BASENAME%_%TAKE%.bap model\%ModelDir%\ -n %NumThreads% -t -s
: WORLD
bin\WORLD.exe output\%BASENAME%_%TAKE%.f0 output\%BASENAME% _%TAKE%.mgc output\%BASENAME%_%TAKE%.bap -f %PitchShift% -m %FormantShift% -o output\%BASENAME%_%TAKE%_syn.wav -n %NumThreads% -t
set TAKE=key0
set PitchShift=1.000
: NEUTRINO
bin\NEUTRINO.exe score\label\full\%BASENAME%_%TAKE%.lab score\label\timing\%BASENAME%.lab output\%BASENAME%_%TAKE%.f0 output\%BASENAME%_%TAKE%.mgc output\%BASENAME%_%TAKE%.bap model\%ModelDir%\ -n %NumThreads% -t -s
: WORLD
bin\WORLD.exe output\%BASENAME%_%TAKE%.f0 output\%BASENAME% _%TAKE%.mgc output\%BASENAME%_%TAKE%.bap -f %PitchShift% -m %FormantShift% -o output\%BASENAME%_%TAKE%_syn.wav -n %NumThreads% -t
set TAKE=key-1
set PitchShift=1.059
: NEUTRINO
bin\NEUTRINO.exe score\label\full\%BASENAME%_%TAKE%.lab score\label\timing\%BASENAME%.lab output\%BASENAME%_%TAKE%.f0 output\%BASENAME%_%TAKE%.mgc output\%BASENAME%_%TAKE%.bap model\%ModelDir%\ -n %NumThreads% -t -s
: WORLD
bin\WORLD.exe output\%BASENAME%_%TAKE%.f0 output\%BASENAME% _%TAKE%.mgc output\%BASENAME%_%TAKE%.bap -f %PitchShift% -m %FormantShift% -o output\%BASENAME%_%TAKE%_syn.wav -n %NumThreads% -t