名曲『花』でベタ打ち同時比較【初音ミク NT, V4X】


はじめに

以前、vocaloidを使用しベタ打ちで入力した『花』と、そのスペクトラムの動画をYouTubeに投稿し、このブログでも紹介させていただきました。

今回は、これらのスペクトラムを合成し、初音ミクNTとV4Xを同時に比較できるような内容の動画を作成しました。

尚、記事の内容については正確性を保証致しません。「解説」ではなく、個人のメモ、備忘録のような情報としてお読みください。


完成品

歌声ライブラリのパンはセンター

Blenderで作成した各スペクトラム動画を、VisualStudioを用いてプログラミングで合成し、StudioOneで出力した音声を動画編集で重ね合わせました。

以前と同様に歌声ライブラリの入力はベタ打ちであり、イコライザー等の効果は使用しておりません。

スペクトラムに伴奏は含まれておらず、歌声ライブラリのみを反映した波形です。

参考にさせていただいた楽譜は『大きな音符で弾きやすいはじめてピアノ 童謡・日本のうた編』の『花』です。

こちらの歌詞のメロディーを各歌声ライブラリで、伴奏をStudioOneのピアノで打ち込みました。
楽譜の通りだとちょっと高く感じたので、メロディー・伴奏ともに1オクターブ下げています。


2023/2/19追記

比べるのなら、左右で分かれていた方が聴きやすいのではないか?と思い、音源の歌声ライブラリのパンを変更したものを作成しました。
NTをいちばん左まで、V4Xをいちばん右まで振りました。音量が下がった分、左右同量だけ上げて調整しました。

L:初音ミクNT R:初音ミクV4X

製作過程

スペクトラムの製作過程

Blender上で各スペクトラムを作成し、VisualStudioでスペクトラムを合成しました。

Blender:スペクトラムの作成

概要

Blender及びBlenderのプラグイン『Bizualizer』を用いて作成しています。

操作方法が分かっていないだけかもしれませんが、『Bizualizer』では同時に複数の音楽ファイルのスペクトラムを生成することはできないようです。

それぞれのスペクトラム動画を出力し、合成作業が必要になります。

ここでは、合成後に各スペクトラムを視認しやすくなるような工夫をし、動画を出力しました。

手順

『Bizualizer』のプロパティから、生成されるバーの大きさや間隔を設定し、トランスフォームの編集でふたつの歌声の波形が各周波数帯で隣り合うように位置を調整しました。

後で伴奏とメロディーを合わせた音源と合成するので、「オーディオ」「音声コーデック」「音声なし」でそれぞれ波形の動きのみを出力しました。

アドオンでシーンプロパティに『Bizualizer』項目が追加されている
原点のカーソルを基準に青と緑のバーが重ならないよう調整した

VisualStudio:スペクトラムの合成

概要

開発環境はVisualStudioを使用し、OpenCVライブラリを用いたC++プログラミングでスペクトラムを合成しました。

参考にさせていただいた書籍は『実践OpenCV3forC++画像映像情報処理』です。

問題点

使用したのはOpenCV4.5.1です。

ちょっと問題がありまして、以下の.dllが存在しませんでした。

  • opencv_videoio_ffmpeg451_64d.dll

わたしが誤って削除してしまったのか、あるいはDLした時点から元々ないのか、それはわかりません。

このファイルがないとVisualStudioのDebugモードで今回のプログラムを実行できなくなってしまいます。

実際に、Debugモードで実行すると特にエラーが出る訳でもないのにプログラムが即終了し、動画ファイルが出力されない、という事態に遭遇しました。
何故?と思い、よくよくコンソールの出力内容を読むと、上記のファイルの読み込みに失敗しているようでした。

 cv::impl::DynamicLib::libraryLoad load 
 ~中略~ \opencv_videoio_ffmpeg451_64d.dll => FAILED

指定されているディレクトリを確認すると、たしかに該当するファイルは存在していません。


ただ、幸いながら、下記の.dllは存在しました。

  • opencv_videoio_ffmpeg451_64.dll

Releaseモードなら実行できそう、と考え試してみたところ、うまくいきました。


余談ですが、一度Releaseモードでプログラムの実行に成功すると、Debugモードでも実行は可能でした。
以下の出力が確認できました。

 cv::impl::DynamicLib::libraryLoad load opencv_videoio_ffmpeg451_64.dll => OK

推測に過ぎませんが、VisualStudioが以前読み込んだ.dllを記憶していて、一度「d」有り「d」無しどちらかのファイルを読み込めば、どちらのモードでも実行は可能、なのかもしれません。

ただ、実行終了後に以下のような内容の出力がありました。

  • OpenCV APIのレベルが一致していない
  • プラグイン実装によるサポートが不足し、いくつかの機能が利用できない

Releaseモード実行時にはこのような出力はされないので、やはり現状は適切な環境ではない、ということだと思います。

画像オブジェクトの加算

大雑把な方法ですが、今回は背景がほぼ黒色であるため、単純に画像クラスオブジェクト間の演算で画像の合成は可能ではないか?と考えました。

スペクトラムの各バーは隣り合う位置ですから、多少の誤差はあれど、各演算は黒色の値「0」との間でしか行われません。
また、各歌声ライブラリの名称とチャンネルのロゴは片方の動画にしか存在しないため、ここも「0」との演算なので配色の変化は見られないはずです。

であれば、そのまま加算しても大丈夫ではないか?と考え、試してみたところ、とりあえず大きな問題はないだろう、と感じられる程度の出力結果が得られました。

ちょっと背景が荒い気がしますが、今回はこれで良し、とします。

以下、コードです。
尚、リンカーの追加の依存ファイルはVisualStudioのプロパティで指定しています。

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{

  Mat src1, src2;

    VideoCapture cap1("V4X_background_2.mp4");
    VideoCapture cap2("NT_greenback_2.mp4");
    if (!cap1.isOpened()) cout << "No Video.";
    if (!cap2.isOpened()) cout << "No Video.";

    int width, height;
    width = cap1.get(CAP_PROP_FRAME_WIDTH);
    height = cap1.get(CAP_PROP_FRAME_HEIGHT);

    VideoWriter rec("SprectrumMix.avi",
                    VideoWriter::fourcc('X', 'V', 'I', 'D'),
                    24,
                    Size(width, height));

    while (1) {
        cap1 >> src1; if (src1.empty()) break;
        cap2 >> src2; if (src2.empty()) break;

        Mat mix = src1 + src2;
        imshow("Mix", mix);

        rec << mix;

        if (waitKey(20) == 27) break;
    }
    return 0;
}

今、読み返してみると、.mp4ファイルが見つからない場合、おそらく動画のサイズを取得する行でエラーが出てしまいますね。

余談:マスクとクロマキー合成

書籍『実践OpenCV3forC++画像映像情報処理』の第5.3章「マスクとクロマキー合成」を参照してスペクトラムの合成を行おうとしましたが、うまくできませんでした。

背景が黒色であったためか「色相」によるマスク作成に無理があったように思います。
「明度」ではどうか、と考え、そちらでもマスク作成も試みましたが、出力結果は芳しくなかったです。

結果としては、今回は第3章のVideoCapture及びVideoWriterクラスの扱いについて参照させていただきました。


尚、こちらの書籍の例題に沿ってプログラミングを行えば、「マスクとクロマキー合成」について、書籍の記載通りの結果になります。

ですので、失敗の原因はわたしの画像処理の知識・経験の不足に違いありません。今回のような画像・動画に対して行う合成手法の選択としては正しくなかった、ということだと思います。

要勉強です。


楽曲の製作過程

以前作成したものをそのまま使用しています。

使用しないトラックをミュートに設定し、伴奏及びNTとV4Xの歌声ライブラリのみ出力しています。


動画の製作過程

Blenderで作成した各スペクトラム動画をVisualStudioで合成して.aviファイルを出力し、StudioOneで.wavを出力しました。

windowsの『フォト』アプリを使用し「ビデオ エディター」機能でこれらのファイルを合成し、.mp4で出力しました。


終わりに

≪音楽面の感想≫

作ってはみたものの、この動画から何か得られる情報はあるのか?という疑問を感じてはいます。スペクトラムの差を見て、この違いがこういう特徴を生み出している、みたいなことが分かるのでしょうか?

わたしが気付くのは、以下の2点くらいです。

  • V4Xの方が同じ周波数帯で強い箇所がある
  • NTの方が音の減衰が小さい

≪プログラミング面の感想≫

プログラミングで学んだことを活かしてやりたいことが実現できたので、良かったです。

出力を読んで失敗の原因を発見できたことで、勉強が活きている実感が湧きました。


今回は以上です。

読んでくださった方、ありがとうございました。

著者・編集書籍名出版発行年月日参照頁
岩石朋美大きな音符で弾きやすいはじめてピアノ 童謡・日本のうた編ケイ・エム・ピー2019/3/1518,19
永田雅人
豊沢聡
実践OpenCV3forC++画像映像情報処理カットシステム2017/9/1061~104,
207~219
参考文献
サイト名URL参考にした日付
Blenderhttps://www.blender.org/2022/11/11
Bizualizerhttps://github.com/doakey3/Bizualizer同上
Mobile VOCALOID Editorhttps://www.vocaloid.com/mveditor/同上
初音ミクV4Xhttps://ec.crypton.co.jp/pages/prod/virtualsinger/mikuv4x同上
初音ミクNThttps://ec.crypton.co.jp/pages/prod/virtualsinger/mikunt同上
参考URL

comment