2009年03月06日

フォルマント変えずにピッチシフト? うるせぇ人力だ!

最近では REAPER のシェアウェア版に élastique(※ACIDMusicMakerについているものと同じエンジン。リンク先に飛ぶと使われているソフトウェア一覧を見ることができる)のフォルマント維持ピッチシフト機能がついていて、フォルマントを維持したピッチシフトが出来る環境が少しずつ確実に身近になりつつある。
Auto-TuneMelodyneSonar 付属の V-Vocal、Cubase 5 にも組み込まれた Pitch Fix など色々なメーカーが同じ技術を開発しているが、その中でも élastique はソフトウェアに組み込んで使用することが前提の商品なので、これからもっと色々なソフトに組み込まれていきそうな気配がある(ただし音質に関しては「それなり」だと個人的には思う)。

で、そういうのを一切利用せずにそれっぽくピッチシフトしてやるぜ、というのが今回のテーマ。
本来この手の処理にはリアルタイムな解析処理が必要だと思うが、今回は無視する。

まずは調べることから始めてみる。
今回参考用に使ったのはメソ神水羊羹ボーカルソロデータ。元々はミックス遊びをするために貰ったデータなのだが、曲の全長が短く実験をするために使うデータとして都合がいいので、非可逆形式の圧縮テストに使ってみたりと色々重宝している(メソ神いつもありがとう大好き☆)。

調べるにあたり短い範囲で同じ高さの音を発音している部分のみを取り出して、それに対して普通のピッチシフト、élastique のピッチシフトをかけそれぞれをスペクトルアナライザで比較してみた。

span.png

■1.基本周波数を含む 200 〜 1500Hz 近辺ぐらいまでは通常どおりピッチシフトされている。周波数が低い部分は通常どおりピッチシフトされなければピッチシフトとしてまともな結果が出てこなくなるので当然ではある。
■2.第一フォルマントの範囲と言われる 500 〜 1000Hz の範囲については、750Hz より上あたりからオリジナルデータと重複する部分が割と多い。ただしこれは普通のピッチシフトとも重なるので単なる偶然のように思える。
■3.第二フォルマントの範囲と言われる部分を含む 1500Hz 以降のデータは周波数が上がるほどオリジナルと élastique で一致している部分が多くなってくる。無声音をそのまま残しているのかも。
■4.1000 〜 2000Hz 近辺のデータがごちゃごちゃしてて非常に読み解くのが難しい。もう考えるのが嫌になってきた。

まとめると、無声音の部分はそのまま残すようになっていて、基本周波数とその倍音とかが細かく絡んでくるであろう中盤辺りはもうカオス、基本周波数周辺は普通にピッチシフト、といった感じだと思われる。

ある程度わかったのでこのデータを参考にしつつ、実際にオリジナルデータと単純にピッチシフトしたデータの二つを上手くフィルタで切り分けて再現してみることにした。
ただし-4で試すとあまりにデータとして微妙なものが出来上がる気配があったので、今回は+2で実験した。

eq.png

フィルタと言いながらイコライザを使っているのは細かく弄りやすいから。-96db モードなので普通のフィルタのように動く。
フォルマントを無視してピッチシフトしたトラック側は、元々ロクな音が入っていない低音をカットし、1500Hz 近辺までを残すようにした。
ピッチシフトしていないトラック側はほとんど無声音を残すように切り分けた。カオス化していた中央部分は思い切って両方ともカットするようにしてみた。

では聴いてみましょう。






大失敗ヘッドホンで聴くともう明らかに2つのトラックが鳴ってる感じがするが、スピーカで聴くと単純にキーを上げるよりは多少自然に聴こえるかな? という気がしなくもない程度に上手くいった。
参考用の élastique のデータの綺麗さを考えると大きな隔たりを感じるところではあるが、少なくとも実験は無駄になってはいないと思いたい。
ちゃんとリアルタイムに変化するピッチに追従するように処理をすることと、基本周波数の倍音もちゃんと処理してあげるようにすればもっと自然な感じになるのかな、とは思うものの FFT とか逆 FFT とか使うような処理を書いたこともない自分にとっては理解の範疇を超える。

誰かやってみてちょ。どうですか?
posted by oov at 08:01| Comment(13) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
イケメンの声はどういじってもイケメンなのだと思い知った

イケメンの声をブサメンの声に変換するソフトとか作れないの?
ねえ、ロック屋さん、どうなの?
Posted by トドロキ at 2009年03月06日 18:10
※超長文注意!!
--------
この手のは絶対的な周波数で見るよりも、倍音列ごとの音圧比で差を
見るのが手っ取り早いです。

■各倍音列のデシベル差

(1)Original 260-520-1040-2080  720(3),1440(6)
1(F0):-20 2:-15 3:-13 4:-23 5:-20 6:-12 7:-25
・第1フォルマント(F1)は3倍音付近で、若干2倍音寄りのところに中心の
帯域があると考えられる。680Hz前後。
・第2フォルマント(F2)はほぼ6倍音を中心とした帯域にあると考えられる。
→この時間軸上で発音している母音は「ア」と推測できる。

(2)-4(80%) 208-416-832-1664  624(3),1248(6)
1(F0):-23 2:-17 3:-15 4:-25.5 5:-21.5 6:-13.5 7:-28
・単純なピッチシフトなので、基本的な倍音の音圧は(1)と同じ。
若干の差異はDSPのアンチエイリアス処理とか、その辺のせい。

(3)-4(elastique) ※-4と一緒 624(3),832(4),1456(7),1664(8)
1(F0):-22.5 2:-25.5 3:-16 4:-15.5 5:-25 6:-22.5 7:-17 8:-17
→F1とF2の中心位置を推定してみる。
・F1は3と4のほぼ間。725Hz。
・F2はほぼ7の位置。1456Hz。
8も音圧的に高いが、ほぼ上の2点で母音のキャラクタが決定されるので、
問題になる差異ではない。
→(1)のF1とF2の位置と大体一緒であることが分かる。

(2)と(3)を比較する。
2(416Hz)では(2)が高く、(3)が低い
4(832Hz)では(2)が低く、(3)が高い
6(1248Hz)では(2)が高く、(3)が低い
7(1456Hz)では(2)が低く、(3)が高い

→つまり、(1)のF1とF2の位置に近いところを意図的に持ち上げ、
それ以外で出っ張っているところを意図的に下げていることが分かる。
なので、あらかじめF1とF2の位置を元波形から読み取って、
それをリニアに反映させているわけですよね。当然でしょうけど。

F1とF2ってこれだけ差があるわけで、単純に周波数帯域だけで処理しても
うまくいかないわけです。

ア 650〜750 1250〜1450
イ 250〜350 2150〜2350
ウ 270〜400 750〜850
エ 500〜650 1900〜2100
オ 450〜550 650〜800

で、F1とF2が離れ過ぎている「イ」段音や、F1とF2が近い「オ」の音
なんかは、フォルマント情報を特定しづらいことがある。だから、昔の
簡素なフォルマント修正DSPだと、音が変になったりする。ピッチ修正が
倍音成分に直結する5半音、7半音に合わせたりすると一層不具合が
出やすい。
ということで、最近のピッチ修正ソフトは、その辺についても個別に
うまいこと処理するルーチンが加えられているはず。

あと、二重母音がどうだとか、わたり子音([y],[w]など)や鼻音でフォルマント
変化がどうのだとか、いろんな音声事象にも対応しないと、やっぱり
不自然になってしまったりする。
Posted by quicksilver at 2009年03月06日 19:18
あ、ちょっとごめんなさい。
上のFFTスペアナのグラフって、同じピッチの音を発音形態に関係なく
いくつか集めた上で、全体の平均として出してるのか。
それだったら事情は結構変わってきます。
Posted by quicksilver at 2009年03月06日 19:52
> イケメンの声をブサメンの声に変換するソフトとか作れないの?
自分の声に入れ替えるっていう名案があるよ!

> 銀さん
えーと、まず
> いくつか集めた全体の平均?
「あ」を発音しているの部分で聴覚上にも似ていると思える部分のみを選択した範囲の平均ですので大丈夫です。そうやって集めようと思うとデータ集める作業の時点で既に結構面倒くさいので遊びとしては結構苦しい……。

帯域切り分けだけで上手くいかないのはもちろんわかってはいたんですが(それでいいなら大量にフリーウェアで転がってると思うので)、フォルマント維持するということは変化していない部分が一部あると思うので元データをある程度参照すればそれっぽくなるだろうと思い単純にどの程度のものになるか興味があってやってみました。

F1とF2で母音、F3とF4も見ればある程度子音も区別できるみたいですね。
もうちょっと真面目にやるなら WaveSurfer あたりを使えばフォルマント検出したデータリストなんかも出力可能なので、これも利用して処理するとこんな適当な処理でももう少しマシな感じに仕上がりそうな気がします。
まあでも、ちょろっと遊びでやってみる分にはいいところで手を引いたと思います。
そして人に丸投げという。

WaveSurfer 自体は BSD ライセンスらしいので今後何か作る際の参考にもなりそうです。

最近 Melodyne は DirectNoteAccess とかいってギターなんかの和音分解らしきものにまで手を出しはじめたし、この辺の解析技術もいよいよ来るところまできたなという感じがしますねー。
和音分解はまあ同時に複数の音鳴らされると誤検出だらけになりそうですけども。発売後の世間の反応が楽しみです。
Posted by oov at 2009年03月06日 22:23
人力wwwwって来てみたらまさかのご指名ですかwwwwww
残念ながら最近コーディング力が低下してるんでちょっと話すだけで。

まず、俺もFFTとかした事無いんで分からんです。
でも、基音さえ分かればあとはFFTして基音と倍音成分だけ抽出して、その情報を基に波形を最初から生成し直せればある程度は行ける気がしますけど、仮にできたとしてもそれらの周波数帯にも声以外の空気感・ノイズも混ざっちゃってるでしょうから完璧には行けないと思います。それらを分離して音声だけピッチシフトしてからミックスすると行ける気もしますが、そんな高度な事wwwww無理ぽwwwwwwwwwって気分になってきます。
更に、出す声の高さによって音色も変わってくるから実際は更に難しいかと。(その人の声の倍音の変化パターンさえ分かればなんとかなるかもしれませんが分かりやすい法則性ってあるんですかね?)
馬鹿なんでこれ以上は分からんので何とも言えんですorz

>トドロキさん
音色の決定要素は(確か)倍音の音量のバランスだった気がするんで、それのバランスをチョチョイと弄っちゃえば行ける気がしますけど、
基音の特定がだいぶ難しそうな気が・・・

・・・あれだ。とりあえずフーリエ変換とかラプラス変換とか勉強してきます!
Posted by ロック屋 at 2009年03月06日 22:35
あ、発音の要素忘れてた。
音色変化もそう簡単にいきそうに無いですね。
てか勉強不足杉ですねサーセン
Posted by ロック屋 at 2009年03月06日 22:42
皆さん日本語を使いましょう、日本語をね。
Posted by meso at 2009年03月07日 01:00
F3やF4の周波数帯域は、母音成分だとその人のパーソナリティに関わる音と言われてますね(イケメン声かそうでないかも、ここで何割かは決まってくるかと)。
ただ、もともと音圧が高く出ずに埋もれてしまいやすいのと個人差が大きいのと、あとやっぱり子音成分と重なってしまうことが多いので、反映させるのは難しいみたいです。

F1F2だけ優先で、ある帯域より上の子音成分はそのまま的なやり方をしているエンジンでは、何だか微妙に変な仕上がりになる人と全然違和感が出ない人と、両方出てくるのはこのせいでしょうね。
同時に、無声破裂子音の[p][t][k]が曖昧な響きになったり入れ替わって聞こえるような仕上がりになるのも、この辺がらみです(マイキングひとつで結構デリケートに変化する音でもあって、一概にDSPのせいにも出来ないのですが…)。

Auto-TuneやMelodyneは単音なら楽器音の修正にも使えるというだけあって、全帯域完全サポートなんでしょうね。その割にAuto-Tuneは軽いので、相当アルゴリズムが優秀なんだろうなあ。

DirectNoteAccessの和音分解は実用化されたら凄いですね。生弾きしたものがピアノロールで表示されて自由にいぢれるようになったりした日にゃアナタ、夢ひろがりまくりんぐですよ。
Posted by quicksilver at 2009年03月07日 11:08
> ロック屋
コメントを斜め読みする限りとってもやる気があるように見えました!
歌の下手な俺の声がまるでプロのように聴こえる日を楽しみにしています。

> meso
メソポタミアのくせに日本語でとは何事ですか。
似非メソポタミアンめ。

> quicksilver
Melodyneは重いんですけど、それ以上になんかウィンドウの挙動がおかしい気がするんですよね。
高価なソフトってなんか妙にインターフェイスのつくりがよくなかったりするのが不思議です。
IntelMac も普及してきてこれからは処理の最適化の負担減ると思うので、今後が楽しみです。
まずはアルゴリズムの見直しが先だとは思いますが。

DirectNoteAccess はなんか分析終了した時に1本の線が上下に広がってピアノロールになっていくアニメーションが無駄で好きです。
インパクトも重要ですけどその前に直すべきところが色々あると思いました。
Posted by oov at 2009年03月08日 18:37
( <●>ω<●>)おっぱい!!
Posted by うぃりりん at 2009年03月10日 22:00
なんですか? ねこぢるなんですか?
Posted by oov at 2009年03月12日 06:33
解読班……!
Posted by にから始まる擬音の人 at 2009年03月12日 09:33
解毒班きました!
Posted by oov at 2009年03月12日 14:56

この記事へのトラックバック