JavaでWavをVocaloid MIDI(VSQ)にするアプリを作ろう (理論編)
Wav音声を解析して、ピッチと音量を含む、Vocaloid MIDIデーター(VSQ)を作るアプリケーションの作り方を説明します。
ここでは、読むと何となく作れそうな気になる内容を書いてみたいです。
ただ、実際に作るところまでには進みません。
そのため、Java言語の知識無くても読めると思います。
情報
実際にWavをVSQに変換するソフトはは、akJ WavToVSQという名で、akJBetasの0.6.9.3以降に含まれています。
http://circle.zoome.jp/akj/topic/2/で情報をまとめています。
注意
Javaで作ると言っていながら、音声解析部分には外部ライブラリーpythonのThe Snack Sound Toolkitを使っています。
私が生成物はまだライブラリーとしてまとまっていないので利用時には注意(次回の実践編でまとめます)
作り方の理論
音声ファイルを解析して、ピッチ情報と音量情報を取り出します。
これを別途用意した、音の範囲と発話記号 データーから、各音を作ります。
それをVocaloid MIDI(VSQ)で保存します
pitchの取得には、The Snack Sound Toolkitやakjsnack(pitch2.exe)が便利かも
vsqの書き出しにはakJ libvsqなどのライブラリーを使うといい
音声ファイルを解析
以下の知識が役に立つかも
曲からボーカル音声だけ抜き出す・Wav 音声のノイズを除いて綺麗な音にする・動画や音声をWavにする
音声のピッチと音量の解析は、音声処理としてはそれほど難しくないみたいです。
純Javaでもあったと思います。(失念)
でもここでは、The Snack Sound Toolkitを使った方法を説明します。
snackを使った、pitchの取得は簡単で、以下のようなコードだけで
mysound=Sound(load=path); mysound.convert(encoding='Lin16',channels='1'); resultList=mysound.pitch(method='ESPS',minpitch=10,maxpitch=400); for i in resultList: print i;
0.01秒 単位でピッチ情報が返ってきます
(ただし、先頭の0.0075秒は欠ける)
データーは、以下のようになります
ピッチ,有声音なら1.0,音量(最大10000?),correlation(謎)
(382.4168701171875, 1.0, 0.0, 0.94537132978439331) (382.38626098632812, 1.0, 6141.89990234375, 0.97832769155502319) (379.42950439453125, 1.0, 6767.0283203125, 0.97941821813583374)
このピッチ取得で重要なのは、最低と最大ピッチ指定しないと、うまく取れないことが多いです。
また、音の単位を0.01から変更できるのを、うまくつかうと解析しやすいです。
Snackで作ったプログラムは、他からも使いやすい、Exeにすることもできます。
私も、ライブラリー akJ Friends中にakjsnack/pitch2.exe として配布しています。
これを呼び出すJavaコードならば
jp.sourceforge.akjrcp.snack.PitchExecuter を見てみてください
各音を作る
音声認識は、いまだ難しいので、どの範囲がどの音なのかを、指定する必要があります。
akJ WavToVSQでは、編集のしやすさから、SRT字幕形式で、指定しております。
実際には、あとでVocaloid MIDIを作るときに、発話記号を指定する必要もあります。
テキストを発話記号にする方法があります
これは、akJ libvsqのコードを参考にしてみてください。
先ほど得られたピッチを音符的な位置に変換する必要があります。
これは、A3の音が、440hzで、あとは、1.06倍ごとに、半音あがって行くという決まりがありますので、
ピッチから音程に変化させるのはそれほど、難しくありません。
波形は変化していますので、位置を決めるため、平均を取ります。
ただし、気をつけたいのは、PitchBendBP値がデフォルトの1のままだと半音単位でしか、ピッチの変化をつけれません。
これを、24まで指定すると、音程はC3のままで、ピッチの波形だけ変化させることも可能です。
VSQファイルに書き出し
MIDIの書き出しAPIがあれば、VSQの出力は難しくありません。
akJ libvsqのコードを参考にしてみてください
ただ、波形部分は、ノートとは別に変化の開始する位置と変化する値を指定する必要があります。
[DynamicsBPList] 7700=64 8500=96 9500=127
説明が不十分なところが多いと思います。質問などはこの掲示板でどうぞ
サイト
Android情報サイト
|
Youtube サイト
| Java サイト
| Google 活用サイト
| Google 情報サイト
| 無料ソフト活用 サイト
|写真活用のPicasa2 サイト
|新サイト
Blog
Android ブログ
Copyright (c)2004 - 2012 Aki. All rights reserved.