大きい話のオーディオの声変わりの原理は簡単な例のコードを付け加えます.

8287 ワード

音声変声アルゴリズムについては、多くの人が特に興味を持っている話題です.
もちろん、多くのオープンソースアルゴリズムは学習を参照することができます.時間領域に基づいて、周波数領域に基づくアルゴリズムもあります.
最終的なアルゴリズムが達成したい目的は一致する.
最近では、多くのネットユーザーが声変わりアルゴリズムの詳細について質問し、メールで私に尋ねました.
合理的な説明や分かりやすい説明をするのは、簡単に見えますが、実は難しいです.
大体の論理的な考え方によって、少し理にかなっていますので、このテーマには必ず「大話」というプレフィックスを付けなければなりません.
特に深いことを言うつもりはないです.もちろん、話せないからです.
画像アルゴリズムの分野では、非常に重要なアルゴリズムはガウスぼかしであり、
畳み込みとも考えられますが、ガウスぼかしは畳み込みの特例です.ここでは展開しません.
オーディオでは、おそらくあなたも、時間ベースの、間違いなく再サンプリングアルゴリズムを当てることができます.
音声サンプリングレートとは、録音装置が1秒間に音声信号をサンプリングする回数を指します.
サンプリング周波数が高いほど音の還元は真実であるほど自然である.
現在の主流の採集カードでは、サンプリング周波数は普通22.05 KHz、44.1 KHz、48 KHzの3つの等級に分けられます.
22.05 KHzはFM放送の音声品質しか達成できません.
44.1 KHzは理論的にCDの音質限界で、48 KHzはもっと正確です.
ここを見ると、多くの人はサンプルの周波数が大体どういう意味なのか理解できないかもしれません.
角度を変えれば、「こんにちは」と一人で言ったら、20ミリ秒かかりますが、マシンはこの20ミリ秒以内です.
採取したデータの数だけがサンプリングレートの高低と理解できる.
つまり、20ミリ秒以内に採取されたデータ量は、現在のサンプリングレートよりもデータ量が大きいほど精度が高く、サンプリング率が高いと考えられます.
じゃ、もう一つの考えを変えて、問題を考えましょう.
同じ速度の場合、
一人の語速が速くて、一人の語速が遅くて、サンプリングデータの分布が一致しないかもしれません.
ここでオーディオアルゴリズムを展開できます.変速です.
はい、変速です.
原理的に言えば、変速は同じサンプリングレート環境でサンプルデータを引張または圧縮することです.
アルゴリズムの観点から言えば、内挿または引出し値と考えられます.
もしあなたが一人で話すスピードを速くしたらどうすればいいですか?
明らかに,同じサンプリングレートでいくつかのサンプルを抽出した.
逆に、速度を下げるといくつかのサンプルを挿入します.
最終的にシフト効果を決定するのは、サンプルを挿入することとサンプルから離れることの重み計算です.
例えば元にサンプリングしたデータは
1234
加速するとサンプル1と4が外れます.
23
速度を下げる時、サンプルを追加します. 
1122344
もちろん例を挙げるだけで、この概念ロジックを理解しやすくなります.
ここを見たら、きっとだれかが聞きます.
その音の大きさは?それとも信号の強さが弱いですか?
実は、音量を上げたり、音量を下げたりします.これは説明しなくてもいいと思います.
変速は時間領域が変わるので、空間は不変です.
音量は逆で、時間領域は不変で、空間は変化します.
簡単に粗暴に理解できるのが、リニアストレッチです.
例えば元にサンプリングしたデータは
1234
各サンプル+4、直接に
5678
掛け算で引き伸ばす場合もあります.
例えば2を掛ける
2468
上は音量を大きくして、音量を下げるのは逆でマイナスとマイナスです.
最終的には変速も音量調節も問わず、
最終的なアルゴリズムは、対応する位置の対応する重みを決定することである.
もちろん最終的にどのような効果を達成したいかによって、重みが適応されます.
こんなに大きな丸を許しても、やはり声が変わる問題には触れていません.
実は、変声は変速+音量調節です.
以上の変速も音量調節も、比較的直線的に引張ります.
直接加減乗除して補間して値を引くと達成できます.
変声の概念も実際には似ています.
つまり、同じ時間領域において、対応する時間領域の音量重みを同時に調節するということです.
つまり、同じサンプリングレートで、特定の重みの中で、音声速度と音量を同時に制御することである.
実は時間領域と空間の二次元引張である.
この論理を理解するのは確かにおかしい.
サンプルアルゴリズムを用いて簡単な例を示した.
前の記事「簡潔明瞭な補間オーディオ再サンプリングアルゴリズム例(完全Cコード付き)」を参照してください.
この例のサンプル関数は、
void resampler(char *in_file, char *out_file) {
    //     
    uint32_t in_sampleRate = 0;
    //      
    uint64_t totalSampleCount = 0;
    int16_t *data_in = wavRead_int16(in_file, &in_sampleRate, &totalSampleCount);
    uint32_t out_sampleRate = in_sampleRate * 2;
    uint32_t out_size = (uint32_t) (totalSampleCount * ((float) out_sampleRate / in_sampleRate));
    int16_t *data_out = (int16_t *) malloc(out_size * sizeof(int16_t));
    //      
    if (data_in != NULL && data_out != NULL) {
        resampleData(data_in, in_sampleRate, (uint32_t) totalSampleCount, data_out, out_sampleRate);
        wavWrite_int16(out_file, data_out, out_sampleRate, (uint32_t) out_size);
        free(data_in);
        free(data_out);
    } else {
        if (data_in) free(data_in);
        if (data_out) free(data_out);
    }
}
サンプリング速度を設定して、音の速度を調節しながら、サンプリングレートを一定にします.
void resampler(char *in_file, char *out_file) {
    //     
    uint32_t in_sampleRate = 0;
    //      
    uint64_t totalSampleCount = 0;
    int16_t *data_in = wavRead_int16(in_file, &in_sampleRate, &totalSampleCount);
    float speed = 0.88;//        
    uint32_t out_sampleRate = in_sampleRate * speed;
    uint32_t out_size = (uint32_t) (totalSampleCount * ((float) out_sampleRate / in_sampleRate));
    int16_t *data_out = (int16_t *) malloc(out_size * sizeof(int16_t));
    //      
    if (data_in != NULL && data_out != NULL) {
        resampleData(data_in, in_sampleRate, (uint32_t) totalSampleCount, data_out, out_sampleRate);
        //out_sampleRate          in_sampleRate
        wavWrite_int16(out_file, data_out, in_sampleRate, (uint32_t) out_size);
        free(data_in);
        free(data_out);
    } else {
        if (data_in) free(data_in);
        if (data_out) free(data_out);
    }
}
修正後はこのようになります.
心ある友達が見つけました.out_size値は増大または縮小する可能性があります.
上記のコード例は、簡単な変速アルゴリズムです.
変速はこのような原理で、音量を大きくして低くするのは例を作りません.
声が変わるのはどんな計算方法ですか?
はっきり言って、変速と同時にoutを保証します.sizeは元のtotal SampleCountです.
どうやって保証しますか?
答えは補間です.簡単で乱暴なら、0を補ったり、0を削ったりすればいいです.
もちろんそうすると、音量が合わなくなり、最終的には発声が違ってしまう場合があります.
これは科学的ではないに違いない.最終的な内挿時の重みと対応内容は、それぞれの家柄によって効果が現れる.
以上の原理も似ています.具体的にどうやって実現すればいいですか?
皆さんは自分で関連のソースコードを参照して理解してください.
また、前の『音声変換アルゴリズムPitchift(トム猫をシミュレートする)完全C++アルゴリズム実装コード』を添付します.
この記事のsinとcosは有効区間にないので、fastsin fastcosの計算結果に問題があります.
詳細はやはり著者のアルゴリズムを参照してください.
もちろん、後に時間があれば放出します.
単純明瞭な音響変換アルゴリズムの完全なcコードと対応する例示的なコード.
フーリエ変換に基づく再サンプリングアルゴリズムについては、「フーリエ変換に基づく音声再サンプリングアルゴリズム(完全なcコード付き)」
対応するgithubプロジェクトのfftResampleでは、アルゴリズムの論理的な修正もしました.
発表された文章は普通はめったに二回編集しません.
後期の修正と変更については、まだgithubプロジェクトの更新に注目してください.
具体的な声変わりの実現原理、
この文章を通じて、
音声変声アルゴリズムは、より直感的に理解し、認識することができます.
以上、レンガを投げて玉を引く権利があります.
楽しいより一緒に遊ぶほうがいいです.
他の関連問題や需要があればメールで連絡して検討してもいいです.
メールアドレスは: [email protected]