- -pv
スレッドの閲覧状況:
現在、- がスレを見ています。
これまでに合計 - 表示されました。
※PC・スマホの表示回数をカウントしてます。
※24時間表示がないスレのPVはリセットされます。

音声合成作るよ

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成分が小さくなるんだよね
この結果の虚数部が周波数特性を表しているよ
5名無しさん@おーぷん :2016/03/30(水)13:22:15 ID:DmC
ヤフオクから
6Awn◆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;
}
みたいにいじれるよ
今回はライブラリとか使わないつもりなので、ゴリゴリ書くよ
8酢酸イオン◆CH3COOHLDA :2016/03/31(木)10:11:56 ID:2Qe
Awnが来てるよ
此れは良スレの予感
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
これもオクターブ変わるとちょいと辛いですね。

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の方

16名無しさん@おーぷん :2016/04/12(火)13:44:29 ID:J3A()
そしてこれがF3…じゃなくて上がF3でこれがF2だった
F2だと第7フォルマントまで確認できるけど、F3では
せいぜい第6フォルマントしか確認できなくて
逆に第3と第4の間に倍音が確認できるよ

あとF2の6倍音1080Hzの倍、2160HzはF3では殆どでてないよ
単純にピッチを倍にしたときに聞こえ方が不自然なのは
こういう問題なんだろうね
ピッチを変えて

17名無しさん@おーぷん :2016/07/11(月)21:30:59 ID:myE
何やってるか高レベルすぎてわからんぞい
18名無しさん@おーぷん :2017/08/04(金)23:27:54 ID:f84
続報というか、最終的に何処まで出来たか気になる

新着レスの表示 | ここまで読んだ

名前: mail:





音声合成作るよ
CRITEO