1.概要
AviUtlは映像/音声の再生速度設定を調整して倍速のビデオを作る機能はありますが、音程が高くなってしまいます。
音程が高くなるのは、音声の再生速度調整時に周波数が高くなってしまうためです。この問題の回避のために作成するビデオの速度に合わせて音程を変更するフィルタを作成しました。
2.ダウンロード
PitchControl_001.zip
3.音程を維持した1.5倍速ビデオの作り方
(1)[設定]-[フレームレート変更]-[20fps<-30fps(2/3)]を選択する
(2)[設定]-[音程の調整の設定]を選択し、設定値を150にする。
1.5倍速のビデオを作成するので150に設定しています。
(3)[編集]-[再生速度の情報を変更する]を選択する
(4)フレームレートを44.955に設定し、サンプリングレートを72000に設定する
この例は元データがビデオ29.97ps、音声48000Hzの場合です。
1.5倍速にしているので以下となっています。
ビデオ:29.97x1.5=44.955
音声 :48000x1.5=72000
(5)[フィルタ]-[音程の調整]にチェックを入れる
4.備考
x264guiexを使用してMP4ファイルを出力する場合は、qaac/refalac (AAC/ALACエンコーダ)が必要です。AviUtilで音声速度を変更するとAACの規格外の周波数になります。
このため周波数変換に対応しているAACエンコーダーが必要となります。
neroAacEncを使用すると出力時にエラーになります。
とっても便利ですね。
返信削除2倍速までしか対応していませんが、8倍速に対応予定は有りますか?
拡張編集は8倍速までできるので・・・。
よければ対応お願いします。
こんにちは。
返信削除今の時点では2倍速までの対応です。
早見視聴できるビデオを作るために、このフィルタを開発しました。
聞き取りができるのが、だいたい2倍速まででしたので、この範囲になっています。
??倍速のビデオを作るというのはどのような用途でしょうか?
もし、よろしければ教えてください。
まさかわずか2時間ほどで返信が来ているとは思わなかったので、返信が遅れました。
返信削除例えば、「Minecraft」というゲームでブランチマイニングの動画や、トラップタワーの動画や建築動画で倍速編集を使うことが有ります。例として下に、てりぃさんという方の動画のリンクを張っておきます。
例)【マインクラフト】地上なんて無かった 第04話【ゆっくり実況】There was no ground part4
http://youtu.be/aTfCHTdp61I
たしかに話し声などは2~3倍程度が聞き取りの限度ですが、mobの音や環境音が高くなりがちなこの手の動画編集でこのプラグインは有用だと思うわけです。
私自身はさほど倍速編集をしませんが、先日ミッカさんという方のニコ生を見ていた時に
http://www.nicovideo.jp/user/13116822/top
そんな話が出たので、ここで2倍速より速いものへの対応予定があるかお尋ねしました。
変更の難易度がどの程度なのか、私にはたとえソースコードが公開されていたとしても分からないのですが、時間が空いた時にでも対応が容易そうならば、対応して頂けると私以外にも喜ぶ方はいらっしゃると思うのでよろしくお願いします。
回答ありがとうございます。
返信削除8倍速での音程変更ができるか一度試してみます。
週末しか時間が無いのでなかなか進まないかもしれませんが・・・。
拡張編集で、このプラグインを試しましたが正常に動作しませんでした。
返信削除動作を確認すると音声速度時の動作が拡張編集と通常編集で異なっていました。
容易に対策ができるかと試行してみたのですが、動作させることができませんでした。
やはり時間がかかりそうですね。
拡張編集の音声速度変更機能を使用すると、フィルタに渡されるデータが通常編集と異なるようです。
返信削除拡張編集で、音程変更せずに早い再生の音声を作る場合は、少し方法を変えないといけないようです。
拡張編集でなくても、1.5倍速時に半音下がっているように感じるのは私だけなんでしょうか?
返信削除こちらの実験ファイルを上げておきます。よかったらご確認ください(141MBあるのでご注意ください)
81acbf56b17e08cbcab903afa7f7b7475b4b48fb.googledrive.com/host/0B-PAN4aatmy1ZG9pOXFpQlZjb0U/PitchControlTest.zip
共有していただきましたデータを以下の環境で確認しました。
返信削除再生プレイヤー:Media Player Classic BE
test.mp4:1.5倍速で再生されて音程は正しい
test2.mp4:1倍速で再生される
test4.mp4:1倍速で再生される
以下に私が同じデータを元に作成したデータを置きました。
http://1drv.ms/1zNHNUB
1.)m_test.mp4
拡張編集のみで1.5倍速にした
→音程が高くなっています。
2.)m_test_with_ptch.mp4
拡張編集+PitchControlを適用した
→音がぶつ切りになりノイズの様になっています。
必ず音量を小さくして再生してください。
作成に使用したのは以下です。
AviUtl Ver.0.99m
拡張編集プラグイン version 0.92
yumetodo さんの環境で拡張編集のみで音程を維持できるのであれば、
AviUtl/拡張編集プラグインのバージョンの差異の影響ではないか?
と思われます。
>拡張編集の音声速度変更機能を使用すると、フィルタに渡されるデータが通常編集と異なるようです。
返信削除うーん、いくら検証しても出力結果には両者に違いは認められなかったのですが・・・。
m_test_with_ptch.mp4
がおかしいのは、拡張編集のTLにこのプラグインのオブジェクトがある状態で、本体側でもこのプラグインが有効だからではないでしょうか?最初私が使用した時にこんな感じになった時がそんな状態でしたので(バグかと思って危うくその件でここに書き込むところだった)。
先の検証はあまりにもいい加減すぎたので、検証しなおしました。
再生環境は環境が容易に揃えられるffplay.exeです(MPCは持ってないので)。検証環境含め詳細はzipのreadmeに書いておきました。ご確認ください(今度は255MBです、すみません)。
81acbf56b17e08cbcab903afa7f7b7475b4b48fb.googledrive.com/host/0B-PAN4aatmy1ZG9pOXFpQlZjb0U/PitchControlTest2.zip
拡張編集使用の有無では音の高さは変わらないですが、やはり音程がおかしいですね。しかもどうもただ低いというものでもないようです。1.5倍速では半音低く、1.7倍速では半音高く、2.0倍速では本来ソ#の音がドの音にきこえたので。内部の計算式が違うのかな・・・。
なお、私と氏で編集方法が違ったら検証のしようもないので、編集の様子を録画したものを同封しています(一部カット、倍速編集)
拡張編集で音声フィルタを実行する場合は以下に注意する必要があるようです。
返信削除(1)入力ファイルのサンプリングレートと出力サンプリングレートを同じにする
入出力でサンプリングレートが異なると出力音声がノイズだらけになります。
(2)音声フィルタの設定は、通常の設定メニュー内のフィルタの設定ダイアログで行う。
拡張編集ので表示されるフィルタ設定で設定を行っても音声フィルタにその設定は送らてきませんでした。ただし通常メニューのフィルタを有効にすると音が壊れます。
それを踏まえたうえで音程を使用するフィルタを設定範囲を800まで広げると以下の結果でした。
×4 : 設定値が400だと音程が下がりすぎている
×8 : 設定値が800だと音が完全に壊れる
400では音が高い
500くらいが妥当かも。
フィルタは意からダウンロードできます。
http://1drv.ms/1EWG1ox
作成したサンプルは以下からダウンロードできます。
http://1drv.ms/1DEDi4F
>>拡張編集の音声速度変更機能を使用すると、フィルタに渡されるデータが通常編集と異なるようです。
返信削除>うーん、いくら検証しても出力結果には両者に違いは認められなかったのですが・・・。
入力ファイルが48khz、出力ファイルを44khzにするフィルタに送られてくるデータが48khzのデータサイズで「44khzデータ+空きメモリを0埋めのデータ」送られてきていました。
このデータにフィルタをかけていたので、見事にノイズだらけになっていました。
なんと、拡張編集側のパラメータが有効になってないとは・・・。
返信削除??1.5倍速では半音低く、1.7倍速では半音高く、2.0倍速では本来ソ#の音がドの音にきこえた
はそういうことか・・・。
3倍速300では半音さがっていて、4倍速400だとド#の音がソ#にきこえますね。
最適な設定値は
再生速度|音程の調整
200 |200
220 |220
300 |290
400 |350
500 |400
600 |440
700 |470?(なんか少し低い気がする)
800 |500(490では半音低かった)
かな、いまいち法則性が見いだせません(きっと私の頭が回ってないだけ)
なんでこんなずれるんでしょうね・・・?
どのように作ったのかを調べなおしました。
返信削除(仕様とか理屈をかなり忘れていました・・・。今更感があるのですが、申し訳ないです。)
音程変更のフィルタに入力する数値はセントという単位です。
セントは音程を示す単位で、1オクターブが1200セントと定義されています。
使用してる音程変更フィルタの仕様では-1200~1200セントで音程の変更ができます。
設定に使用するトラックバーでは、100~200で設定できます。
これは、フィルタ内で以下の様にセントに変換しています。
セント = (((設定値/100) - 1.5) / 0.5) * -400) - 800;
※設定値が150より大きいとき
この式だと設定値=200の時に-1200となり1オクターブ下がるようになります。
なので、とりあえず2倍速再生までは正常に対応できる・・・と言うことになります。
とりあえず上記の理論なんですけど、-1200以上の値を設定しても意外にも動作してしまっています。
調べなおした結果ですけど、200より大きい値での音程変化の動作についてはよくわからないという実情でした。
この音程フィルタとは別に、音声速度の変更フィルタを作ってみたのですが、AviUtlはフィルタでの音声速度の変更に対応できず、音が意図しない変化をしてしまいました。
(WAVEファイルでの変換であれば、8倍速までは綺麗に再生ができていました。)
とりあえず、実験して分かった値で補正してしまえばいいと思います。利用者としては、再生速度の設定と同じ数値を使えればいいはずなので。
返信削除再生速度,音程の調整,セント
200,200,-1200
220,219,-1352
240,238,-1504
260,256,-1648
280,274,-1792
300,290,-1920
350,320,-2160
400,350,-2400
450,375,-2600
500,400,-2800
550,420,-2960
600,440,-3120
660,460,-3280
700,470,-3360
750,487,-3496
800,500,-3600
とりあえずこれを適当にExcelで対数近似させたところ、再生速度が200を超える場合は
y = -1737ln(x) + 5.6551
となりました。再生速度200のところで連続になるように補正するとセント(仮にy)を求める式は
y = (int)(-1734ln([再生速度]/100) + 1.9172110909451)
([再生速度] > 200)
y = (((([再生速度]/100) - 1.5) * 2) * (-400)) -800
([再生速度] > 150)
となるので、フィルター内部のセントへの変換式を上記の物へ変更すればとりあえずいいのではないでしょうか?
??C99以降ではintへのキャストは0方向に丸められるから、これでいいはず、C++は知らない、内部でセントが浮動小数点型ならキャストはいらないですね)
https://pbs.twimg.com/media/B-VkjgsCAAAdcIK.png
ありがとうございます。
返信削除この数式で組み込んでみます。
当初、倍速ビデオファイルをAviUtlで作成しようと音声速度は速くするフィルタを作りました。
http://milk-tea.myvnc.com/blog/adiary.cgi/0191
このフィルタをプラグイン化して組み込みましたが、AviUtlはプラグイン内で音声長の変更を許さないようでこのフィルタは正常に動きませんでした。
教えていただいた式を組み込みました。
返信削除400,600,800の入力値で試しましたが、フィルタに入る数値はじっけち近傍となり期待される値となりました。
私の印象では、各数値で期待される音程になっていると感じています。
プラグインとサンプルデータは以下からダウンロードできます。
PitchControl_003.zip
http://1drv.ms/1LoZtOS
サンプルデータ
http://1drv.ms/1LoZClr
Readme
返信削除>yumetodoさんの書き込みを元に設定値が200より大きいとの係数を変更しました。
「大きいとの係数を」ではなく「大きいときの係数を」ですかね。
修正お疲れ様です。こちらでも確認しました。実験のし過ぎで魔法科高校の劣等生のこの曲が耳から離れない・・・。
幾つか質問です。
1.プラグインバージョンをエクスプローラーのプロパティから見られる部分や、AviUtlのプラグインフィルター情報から見られるようにする予定はあるか?
??.(大丈夫とは思いますが)
y = -1734ln([再生速度]/100) + 1.9172110909451
の方の式を使っているか
??.[再生速度] < 150の時はどういう式になっているのか(単なる好奇心からの質問です)
??.MSVCのR6002,6008-6020,6016-6019,6024-6028,6030-6033のエラーがでてる痕跡があるが、大丈夫なのか?(not enough spaceとかnot initializedとか)
時間があるときに教えて頂けると幸いです。
あと、拡張編集での使用方法がやや特殊なので、その注意も含めバージョンアップのお知らせ記事を書いたほうがいいかもしれません。拡張編集側と本体側両方で有効にしてはいけないとか、値の設定は本体側で、とか。
>音声速度を速くするフィルタを作りました
拡張編集の音声オブジェクトに対してかけられるフィルターって作れないんですかね?速度変更機能は拡張編集自体が持っているので音程補正機能のみを、ですが。
現状の、フィルターオブジェクトをTLに追加するのはやはりあまりスマートじゃない気がするので・・・。(これは拡張編集のダイアログの設定値が反映されない問題がついでに解決しないかな、という期待を込めています。)
README.TXTはこっそり直しておきました。
返信削除>1.プラグインバージョンをエクスプローラーのプロパティから見られる部分や、
>AviUtlのプラグインフィルター情報から見られるようにする予定はあるか?
バージョン情報は更新を忘れることがあるので、あまりつけたくないのです。
なので大きく困らないのであればつけないと考えています。
作成している一部のアプリはバージョン情報をテキストファイルで付けたりして更新忘れの防止をしていますが・・・。
>2.(大丈夫とは思いますが)
>y = -1734ln([再生速度]/100) + 1.9172110909451
>の方の式を使っているか
使わせていただきました。
コードは3.の回答を参考にしてください。
>3.[再生速度] < 150の時はどういう式になっているのか(単なる好奇心からの質問です)
係数計算のコードは以下の様になっています。
-------------------------------------------------------------------
int nPitch = 0;
double fRate = (double)fp->track[0] / 100.0;
if(fRate >= 1.0 && fRate <= 1.5)
{
nPitch = ((fRate - 1.0) / 0.5) * -800;
}
else if(fRate > 1.5 && fRate <= 2.0)
{
nPitch = (((fRate - 1.5) / 0.5) * -400) - 800;
}
else{
nPitch = (int)(-1734.0 * log(fRate) + 1.9172110909451);
}
-------------------------------------------------------------------
使わせていただいた数式について「適当にExcelで対数近似させた」とありましたが凄いですね。
>4.MSVCのR6002,6008-6020,6016-6019,6024-6028,6030-6033のエラーがでてる痕跡があるが、大丈夫なのか?(not enough spaceとかnot initializedとか)
AviUtlをデバッガ上で動作させて確認しました。
x264guiExを使用して出力するときに例外(=エラー)が発生するようです。
クラッシュしていないのでx264guiEx内で例外が処理されていると思われます。
(つまり正常に処理されている)
こちらで確認したのは以下です。
-------------------------------------------------------------------
例外の発生
AviUtl.exe の 0x7700f9f2 で初回の例外が発生しました: 0xC0000008: An invalid handle was specified
例外発生時のコールスタックは以下
ntdll.dll!7700f9f2()
ntdll.dll!7700f9f2()
KernelBase.dll!75e9c463()
kernel32.dll!765513e0()
> x264guiEx.auo!551dbec1()
-------------------------------------------------------------------
他のプラグインの影響が無いWAVE出力で確認しましたが例外は発生していませんでした。
少なくともデバッガ上でエラーは発生していないようです。
別の要因/箇所で発生していないとはいえませんが・・・。
>拡張編集の音声オブジェクトに対してかけられるフィルターって作れないんですかね?
何とも言えないですね。
単純に音声フィルタプラグインを作ると今の状態になってしまいます。
>係数計算のコードは以下の様になっています。
返信削除なるほど、セントは整数型でよかったんですね。あと傾きはやはり150のところで1/2になってましたか・・・。
else if(fRate > 1.5
の部分がいまいちよくわかりませんが、もし再生速度100未満に将来対応することになってもlogの式を使うみたいなので、そこそこうまいこと処理してくれる・・・のかな。
>使わせていただいた数式について「適当にExcelで対数近似させた」とありましたが凄いですね。
「いまいち法則性が見いだせません」とか言った後に脳内でプロットしてたらなんとなくlogのグラフっぽいな、とおもって近似させたらビンゴでした。「適当に近似」したファイルは
81acbf56b17e08cbcab903afa7f7b7475b4b48fb.googledrive.com/host/0B-PAN4aatmy1ZG9pOXFpQlZjb0U/AviUtl_Pitch_Control_002_calc.xlsx
です(Excel2007以降が閲覧には必要です)。最初は再生速度と音程の調整のパラメーターの相関性を調べたんですが、うまくいかず、セントとの相関性を調べたらうまくいきました。Excelの力って恐ろしい・・・。
で、グラフをよく見ると、再生速度が100~200の範囲についても教えていただいた式にかなり正確に近似してくれてます(どっちがどっちを近似したんやら)。まあ、logの計算コストのほうがif文の計算コストより重いはずなのでわざわざすべてlogを使うことはないのですが。
>少なくともデバッガ上でエラーは発生していないようです。
あ、いや、aufファイルをテキストエディタで見た時に後ろの方にエラーログ(コンパイル時?リンク時?)があったので気になっただけです。
プラグイン更新、記事更新お疲れ様でした。長々とありがとうございました。
私のブログ
http://freesofutotravel.blog94.fc2.com/
でこのプラグインの紹介を書いてもいいでしょうか?内容的にはこちらの記事とかぶってしまう部分もあると思いますが(全記事足してやっと60PV/dayくらいの弱小ブログですが)
>aufファイルをテキストエディタで見た時に後ろの方にエラーログ(コンパイル時?リンク時?)
返信削除これはどのプログラムにも入っているかと思います。
VisualC++のランライムエラーが発生時にエラー情報を表示する標準の処理が参照している箇所だと思います・・・推測ですが・・・。
>私のブログ、このプラグインの紹介を書いてもいいでしょうか?
はい。書いていただけるとうれしいです。
http://freesofutotravel.blog94.fc2.com/blog-entry-18.html
返信削除紹介を書かせて頂きました。