音声合成作るよ #音声合成

音声合成作るよ #音声合成
1: 名無しさん@おーぷん 2016/03/30(水)12:11:21 ID:55H

もう旬は過ぎたと思うけど音声合成作ろうと思うんだ
どうかな?
多分のんびりベースなので数ヶ月かかると思う


2: 酢酸イオン◆CH3COOHLDA 2016/03/30(水)12:14:39 ID:KXQ

がんばあ


3: 名無しさん@おーぷん 2016/03/30(水)12:16:05 ID:55H

応援あった!
やりまする
基本はsin波合成というかフォルマント合成でいこうと思うよ
元音声からフォルマント抜き出してパラメータとして合成するよ


4: 名無しさん@おーぷん 2016/03/30(水)12:35:25 ID:55H

波形の分析は普通FFTとか使うけど今回は使いません
というか使うけど時間分解能がいまひとつなので簡単なDFTを改造して使うよ
DFTもFFTも中身は同じだけど、位相成分があると嘘の周波数を出力するね
だから、一波形を切り出してDFTするよ
ゼロクロスからの一波形をDFTするとcos成分が小さくなるんだよね
この結果の虚数部が周波数特性を表しているよ


6: Awn◆AwnAwnAwnA 2016/03/30(水)13:49:07 ID:bwA

なんというDSPスレ!これは期待age


7: 名無しさん@おーぷん 2016/03/30(水)14:05:49 ID:55H

まず足回りから作るよ
https://ideone.com/lKFPcX
これがPCMクラス
MONO_PCM pcm1;
MONO_PCM pcm2;
pcm1.clear();
pcm1.add(0);
pcm1.add(1);
pcm1.add(2);
pcm1.add(1);
pcm1.add(0);
pcm1.write("test.wav");
pcm2.write("test.wav");
こんな感じで自由にwavファイルが出来るよ。
途中の要素は
for( size_t i = 0 ; i < pcm1.s.size() ; i++ ){
pcm1.s[i] *= 2;
}
みたいにいじれるよ
今回はライブラリとか使わないつもりなので、ゴリゴリ書くよ


9: 名無しさん@おーぷん 2016/03/31(木)13:12:15 ID:gUR

次にDFTします。なぜFFTじゃないかというと周波数分解能が十分じゃ
ないと思っているから。1024サンプルでn/1024という周期を持っていて
なおかつ先頭が0からはじまって、最後が0で終わる周波数以外は
COS成分が出ちゃいます。
これは位相が0じゃないからです。先頭が0から始まる波なら
f(x)=αsin(θ)という関数の合成で表せるのですが、
f(x)=αsin(θ+β)だと加法定理でsin(θ)cos(β)+cos(θ)sin(β)と
分解されてしまってcos成分が出てしまいます。

よってすごくシンプルに考えて1波形切り出してDFTしてCOS成分
ネグっちゃえば周波数成分じゃん!となりそうです


10: 名無しさん@おーぷん 2016/03/31(木)13:26:42 ID:gUR

それでcos成分をネグるとか色々弄りたいので自分でも直せるDFTにします。
コードはこれです。
https://ideone.com/OXlWXi
簡単に説明すると前のPCMクラスのstからedまでの場所について
dftすると結果がグローバルのRe,Imに格納されます。
で結果をN=ed-stとしてidft(逆デジタルフーリエ変換)を
呼び出すと元の波形に戻ります。
これもれなく元に戻ります。
idftすごいですね。前も後ろもどこも抜けません。


11: 名無しさん@おーぷん 2016/04/02(土)15:37:49 ID:o5g

では早速wavファイルを読んでみますよ
結構ソースがスパゲティですが大体次の流れでいきます
無音領域を検知してファイル内の先頭、最後を求める
求めた領域から1波形を抽出しDFTにかける
求まったデータの虚数部のみから最大値をいくつかもとめて逆DFTする
その時の虚数部の値をグラフ化する

虚数部は元に戻す時にSINの係数になります。よってこれを使いますよ

さて問題は一波形の抽出ですね。波形を見てみると微小範囲ではそれほど変わっていません
よってDFTと同じ原理で直前の波形と重ねあわせて一番マッチするところを
一波形とします。サンプリング数1からnまで値をずらして掛けあわせて
最大となるところが一波形となりますよ、多分。

でこれで「ひ」という音声を解析します。

とりあえずDFTで20個フォルマント合成したのがこれ
http://neon.cx/up/NEONUjdL5y.wav
そのフォルマント周波数の時間推移がこれです。
http://neon.cx/up/NEONU9XNGQ.gif


12: 名無しさん@おーぷん 2016/04/04(月)17:21:01 ID:qu8

読み込みのソースです。
ideoneでは動かないですが、だいたいこういう処理してます。
https://ideone.com/i7HDZ0

パラメータは得られましたがこれを定式化したいと思います。
ちょっと行き詰まってます。参考でRosenberg波というのを見つけました
これを使って同じく特性を取ってみると下のようになります。
ちょっと似ていますね

Rosenberg波を使ったフォルマント合成では、これをフィルタリング
してフォルマントを作っています。借りてきたサンプルで
作ってみるとこうなります。ソースはRosenbergでググるとあると思います。
少し手を入れて実行してます。子音はノイズで作ってあります。
http://neon.cx/up/NEON4XNBHl.wav
やはりフィルタリングでは望む波形を成型するのは無理なんでは
ないでしょうかね。

ちなみに波形の長さをそのまま変える方式だとこうなります。
http://neon.cx/up/NEONyFq4Xh.wav
これもオクターブ変わるとちょいと辛いですね。
http://open2ch.net/p/tech-1459307481-12-490x200.png


13: 名無しさん@おーぷん 2016/04/10(日)08:02:29 ID:OLN

なんかとてつもなく難しそうなことやってる!


14: 名無しさん@おーぷん 2016/04/11(月)17:03:10 ID:FWQ

友達の声をサンプリングしてフォルマント周波数を収集してます
分かったのは上の図で4kHzあたりにも波がありますが、
これは低い方の波形と同一だということです

EXCELでプロットするまで分からなかったですよ

しばらく波形とにらめっこしますよ


15: 名無しさん@おーぷん 2016/04/12(火)13:36:37 ID:J3A

やっとデータの解析の仕方がわかってきたよ
F2とF3の「あ」の音が取れた。もっと高い音もあるけど
よくある第5フォルマントまでで表示してみるよ

概ね音源が180Hzと360Hzくらい
これはF2の方
http://open2ch.net/p/tech-1459307481-15-490x200.png


16: 名無しさん@おーぷん 2016/04/12(火)13:44:29 ID:J3A

そしてこれがF3…じゃなくて上がF3でこれがF2だった
F2だと第7フォルマントまで確認できるけど、F3では
せいぜい第6フォルマントしか確認できなくて
逆に第3と第4の間に倍音が確認できるよ

あとF2の6倍音1080Hzの倍、2160HzはF3では殆どでてないよ
単純にピッチを倍にしたときに聞こえ方が不自然なのは
こういう問題なんだろうね
ピッチを変えて
http://open2ch.net/p/tech-1459307481-16-490x200.png


17: 名無しさん@おーぷん 2016/07/11(月)21:30:59 ID:myE

何やってるか高レベルすぎてわからんぞい


引用元: http://toro.open2ch.net/test/read.cgi/tech/1459307481/

ボーカロイド技術論~歌声合成の基礎とその仕組み~ボーカロイド技術論~歌声合成の基礎とその仕組み~
剣持 秀紀 藤本 健

ヤマハミュージックメディア
売り上げランキング : 200969

Amazonで詳しく見る

わんわん
はてなブックマークに追加する この記事をツイートする
Pocketに保存する この記事にコメントする
同人音声ちゃんねる をフォロー
Feedly Mastodon Misskey.io Bluesky

コメント