Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
オーディオ処理入門 ボイスチェンジャーを作ろう
Search
hotwatermorning
July 19, 2025
5
890
オーディオ処理入門 ボイスチェンジャーを作ろう
C++ MIX #15 (
https://cppmix.connpass.com/event/359098/
) 登壇資料
hotwatermorning
July 19, 2025
Tweet
Share
More Decks by hotwatermorning
See All by hotwatermorning
Rust の中で TypeScript を書くには
hotwatermorning
0
490
Rust×mediasoupで作るビデオチャットシステム.pdf
hotwatermorning
0
1.1k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Visualization
eitanlees
146
16k
Code Review Best Practice
trishagee
69
19k
Navigating Team Friction
lara
188
15k
Writing Fast Ruby
sferik
628
62k
GitHub's CSS Performance
jonrohan
1031
460k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
110
20k
Six Lessons from altMBA
skipperchong
28
4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Embracing the Ebb and Flow
colly
86
4.8k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Transcript
オーディオ処理⼊⾨ ボイスチェンジャーを作ろう C++ MIX #15 @hotwatermorning
⾃⼰紹介 @hotwatermorning (ほっと) 株式会社LabBase 所属 C++ポケットリファレンス (技術評論社)共著
サンプルプログラムについて https://github.com/hotwatermorning/formant-and-pitch
⽬次 • オーディオ処理の基礎 • C++でのオーディオ処理 • ボイスチェンジャーの作り方
オーディオ処理の基礎
オーディオ処理の基礎 • 音は空気中の分子の粗密波 ◦ 分子の疎密波が耳の鼓膜を振動させ、 それが内耳に伝わって蝸牛管の 神経がそれを検知する https://www.nikkei.com/nstyle-article/DGX MZO40860360U9A200C1000000/
オーディオ処理の基礎 • 波の信号はアナログなのでコンピュータでは扱いにくい • 波の信号を時間的に、また信号の強さ的に区切って数値の 列として扱うようにする → デジタル信号処理 ◦ アナログなオーディオ信号をそのまま処理する回路もある
(ギターのエフェクターなど)
オーディオ処理の基礎 • 時間方向の分割の細かさ → サンプリングレート • 強さ方向(音量)の分割の細かさ → ビット深度
https://unison.audio/sample-rate/
マイク⼊⼒とスピーカー出⼒ • コンピュータに音声を入出力するにはアナログ信号をデジタ ル信号に変換する必要がある • マイクから入力したアナログ信号はA/D変換器によってデジ タルな信号としてコンピュータに取り込まれる • 逆にコンピュータで処理したデジタル信号をD/A変換器でア ナログ信号に変換してスピーカーに送れば音が鳴る
◦ A/D 変換・D/A変換は、コンピュータに内蔵されている オーディオデバ イスやオーディオインターフェース という機材がやる
マイク⼊⼒とスピーカー出⼒ https://www.researchgate.net/figure/Audio-processing-for-digital-signal-processing_fig3_375879233
オーディオ処理の基礎 • 音量を操作するのに整数のままだと扱いにくい ◦ 細かい変化を表現できない • なので float や double
に変換して処理する ◦ OS やライブラリが提供している関数から float の配列が渡されてき て、それを読み書きする
オーディオ処理のサンプル
リアルタイム処理とマルチスレッド • 連続した音声信号は数百〜数千個の音声信号のブロックに 分けられて、そのブロックごとに処理を行う • この処理が間に合わないと、スピーカーで鳴らすはずの次の ブロックの音声がないことになってノイズになる ◦ 描画処理で言うところのフレーム落ちみたいなもの ◦
音声の場合にはかなり気づかれやすい ので問題になる • なのでリアルタイム性が重要
リアルタイム処理とマルチスレッド • 例)48000Hz の信号を 256 サンプルずつのブロックで処 理するように設定している場合、1ブロックが表す音の長さ → 256 /
48000 = 0.0053… (約5.3ミリ秒) • マイクからの信号を受け取って処理し、スピーカーに返すと いう処理を毎回この時間内に完了させる必要がある
リアルタイム処理とマルチスレッド • リアルタイム性を確保するために以下のような点に気をつけ る ◦ オーディオ処理は専用のスレッドで実行し、その中でユーザーの操作 を待ったりしない ◦ オーディオ処理を行うスレッドでは システムコールを呼び出さない
(ファ イル読み書き、メモリの確保/解放など) ◦ ミューテックスによるロックは避ける
リアルタイム処理とマルチスレッド • 参考になる動画 ◦ CppCon 2015: Timur Doumler “C++ in
the Audio Industry” ◦ Dave Rowland & Fabian Renn-Giles - Real-time 101 - Part II: The real-time audio developer’s toolbox
C++でのオーディオ処理
C++でのオーディオ処理 • オーディオ処理にはリアルタイム性が必須 • そのため、低レイヤな処理を記述できるC++がいまでもよく 利用されている ◦ ゲームエンジンのオーディオ処理 ◦ 音楽制作ソフト(DAW)用のプラグイン
◦ 音声合成処理のアプリケーション
どんなライブラリが使われるか • JUCE (https://juce.com/) ◦ C++のマルチメディアアプリケーション用のフレームワーク ◦ オーディオデバイス/DSP/UIあたりまで手広くカバーしている • PortAudio
(https://www.portaudio.com/) ◦ オーディオデバイスを扱うための軽量なライブラリ • ゲームエンジン ◦ ゲームエンジンが用意しているオーディオ処理のライブラリを利用すること もある
JUCEを使ったオーディオ処理 • JUCE 独自のプロジェクト管理ツール(Projucer)か、 CMake でのプロジェクト生成をサポートしている • JUCE を組み込んだプロジェクトを生成し、それを Visual
Studio や Xcode で開いてアプリケーションをビルドできる • オーディオデバイスを扱う処理をデフォルトで JUCE が用意 してくれている
JUCEを使ったオーディオ処理 • processBlock という関数に juce::AudioBuffer<float>& 型の引数が渡される。 • ここに入力されたオーディオデータが書き込まれているの で、これを好きに操作して上書きする •
上書きしたデータが次の処理に流れていき、スピーカーから 音が鳴る
JUCEを使ったオーディオ処理
ボイスチェンジャーの 作り⽅
⾳声信号とフーリエ変換 • 音声信号にはいろいろな周波数の波が含まれる • この波の含まれ方が変わると違う音に聞こえる https://www.nti-audio.com/ja/サポート/ 測定ノウハウ/高速フーリエ変換
⾳声信号とフーリエ変換
⾳声信号とフーリエ変換 • 波のまま信号を扱うのは複雑で難しい ◦ 単なる音量の操作とかは波のまま処理できる ◦ 聞こえ方に関わる周波数の情報をいじるのは難しい
⾳声信号とフーリエ変換 • 複雑に見える音声信号に対して、その波形にはどんな周波 数の音がどれくらい含まれているかを解析して、さらにそれ を操作できれば音声を変化させられる • ここで使われるのがフーリエ変換 ◦ 一般的にはデジタル信号処理用に高速に処理できるように改良された FFT
(Fast Fourier Transform) というのが使われる 余談:このフーリエ変換は、 18世紀にフランス人のフーリエが発見したフーリエ級数が元になっている。フーリ エ級数はやがてフーリエ級数で表せる関数ってどんなものだろう、そもそも関数ってなんだろうという問題を提 起して、現代の数学の基礎になった集合論にまで発展する。
フーリエ変換の性質 • フーリエ変換で得られた周波数のデータをもう一度フーリエ 変換処理すると、音声信号に戻る • これを逆フーリエ変換という ◦ FFT に対して IFFT
(Inverse Fast Fourier Transofrm) という • つまり、FFT したあとの周波数のデータをいじって IFFT す れば元の音を改変した音声波形が得られる
フーリエ変換の性質 https://watlab-blog.com/2019/10/12/fft-ifft/
短時間フーリエ変換について • フーリエ変換は音声信号全体を処理して周波数の情報を得 るのでそのままではリアルタイム処理に向かない ◦ 実際データ量的にも処理するのが大変 • 短く区切った時間ごとにフーリエ変換を行ってオーディオ処 理を行うことが多い。これを短時間フーリエ変換 STFT
(Short Time Fourier Transform) と呼ぶ ◦ 短い区間ごとに FFT する
短時間フーリエ変換について
FFTのまとめ • 連続したオーディオデータを短い時間に区切り、それぞれ FFT 処理して周波数のデータに変換する • その周波数のデータをうまいこといじる • IFFT で短時間の音声信号に戻す
• その波形をつなげて連続したオーディオデータに戻す
声のスペクトルの特徴 • 声の高さを変化させても、スペクトルの概形はあまり変わら ない • それに対して声の高さが一定でも口の形を変えるとスペクト ルの概形が変わる
声のスペクトルの特徴 すべて「あ」
声のスペクトルの特徴 「あ」 「い」
声のスペクトルの特徴 • 声帯から発生したブザーのような音が声道(喉や口や鼻)と いうチューブで複雑に共鳴して変化することで普段聞いてい る声になると考える → ソースフィルタモデル ◦ 声帯が音源(ソース)であり、声道がその音を変化させるフィルタである というモデル
https://www.es-jpn.jp/blog/テクノロジー/133/
微細構造∕スペクトル包絡 • スペクトルには声帯の情報と声道の情報が両方含まれてい る • 声帯の情報はスペクトル中の細かく変化する成分として含ま れていて、声道の情報は緩やかに変化する成分として含ま れている。 • 前者を微細構造、後者をスペクトル包絡
と呼ぶ
微細構造∕スペクトル包絡 https://www.fun.ac.jp/~kawagoe/lee.pdf
スペクトル包絡の特徴 • スペクトル包絡は声道の形状による共鳴を表す ◦ この共鳴する周波数のピークをフォルマントと呼ぶ。 • 男性のほうが声道が広くて共鳴する周波数が低くなるため、 フォルマントが低い方に寄る • 逆に女性/子どもの場合は男性よりも声道が狭いので、より
高い周波数で共鳴し、フォルマントが高くなる
スペクトル包絡の伸縮 • なので、スペクトル包絡を縮めればより男性的な声になり、 スペクトル包絡を伸ばしてフォルマントをより高い位置に移動 させればより女性的/子ども的な声に音声を変換できる • この操作をフォルマントシフト と呼ぶ ◦ ヘリウムを含んだ空気を吸ったときにもこれが起きる。(音速が変化して
共鳴する周波数が変わるため)
フォルマントシフトとピッチシフトとの違い • ピッチシフトは音の長さを変化させずに音の高さを変える処 理を表す ◦ レコードの早回しみたいにならないようにしながら音の高さを変える ◦ TD-PSOLA や Phase
Vocoder などの手法がある • フォルマントシフトは音の高さを変えずに、そのスペクトル包 絡のみを伸縮させる ◦ 音の高さは変わらないのに声の聞こえ方が変わる
フォルマントシフトとピッチシフトの組み合わせ • フォルマントシフトとピッチシフトを組み合わせると、声の高さ と声の太さを独立して操作できる • 極端にシフトさせることで機械のような音声にすることもでき る
参考⽂献 • プログラム101付き 音声信号処理 • サウンドプログラミング入門 • 言語情報処理論 2007-11-21 •
音・声の認識技術とその応用 • やさしく音声分析法を学ぶ: ケプストラム分析とLPC分析 | PDF • 「音響学入門ペディア」作成に向けて Q4: ケプストラムって要するに何ですか ?
ありがとうございました