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
自由を求めてWindowsオーディオプログラミング
Search
ryoha
March 27, 2022
0
440
自由を求めてWindowsオーディオプログラミング
Audio Processing Object の話です
ryoha
March 27, 2022
Tweet
Share
More Decks by ryoha
See All by ryoha
Windowsで関数フック
ryoha
0
66
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
39
1.9k
GitHub's CSS Performance
jonrohan
1030
460k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Code Reviewing Like a Champion
maltzj
521
39k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
520
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
The Language of Interfaces
destraynor
156
24k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Visualization
eitanlees
146
15k
We Have a Design System, Now What?
morganepeng
51
7.4k
Transcript
自由を求めて Windows オーディオプログラミング @ryoha000
2 自由 感じてますか?
3 自由 感じてますか?
自己紹介 4 ▣ りょは □ Twitter, GitHub @ryoha000 ▣ 趣味
□ 美少女ゲーム □ 麻雀 今やってるゲームの好きなキャラ (かわいい)
1. Motivation 5
ピー音を消したい 6
ピー音を消したい 7 ▣ そもそも存在が悪 ▣ 現代のソフ倫はそもそも規制してない □ 昔は規制してた □ 日本ビデオ倫理協会(解散済み)が美少女ゲームに参入
□ それを受けてコンピュータソフトウェア倫理機構も規制緩和 あだ名がソフりん
おおざっぱな方針 8 ▣ ぶっこ抜いてそれを改ざん □ 犯罪かもしれん ▣ ユーザーモードで動くアプリの権限だけでなんとか □ システムへの影響が小さい
□ 失敗 ▣ カーネルモードでやってる処理に差し込む □ C++を書く必要 □ なんか大変そう □ 最終的にはこの方針
2. In User Mode 9
ユーザーモードでの前提 ▣ 「今から再生する音」はいじれない ▣ 「今再生してる音」は拾える ▣ IAudioCaptureClient::GetBuffer() ▣ ピー音は基本的に決まった振幅・周波数の正弦波 10
処理の流れ 11 出力 プログラム + - 他アプリからでる音 消したい周波数の 同じ振幅の逆位相を流す 消したい周波数の振幅・位相と
今プログラムで流してる振幅・位相が 実際どのくらいずれてるか計算
発想 ▣ ピー音がある程度の間続いて、1ループが十分短い ▣ 自分で出してるピー音と、消したいピー音の位相差は 結果的に再生された音からわかる ▣ フィードバック制御で逆位相にしてピー音を打ち消す 12 出力
プログラム + - 他アプリからでる音 消したい周波数の 同じ振幅の逆位相を流す 消したい周波数の振幅・位相と 今プログラムで流してる振幅・位相が 実際どのくらいずれてるか計算
▣ 1回のフィードバックループだけで20ms以上かかる ▣ 処理の重さじゃなくAPIのレイテンシーの問題 ▣ ピー音は80msくらいだからほとんど聞こえる ▣ 結構がっつりコード書いちゃったけどプロトタイプで試 すべきだった 失敗!
13
3. In Kernel Mode? 14
Windowsの 音関連アーキテクチャ 15
16 普通にイメージする 「アプリケーション」の領域 「アプリケーション」が叩く OSのAPIの領域 「ドライバ」の領域 http://frchick.blog129.fc2.c om/blog-entry-733.html
「ドライバ」の領域 ▣ ユーザーモード ▣ APOが動いてる ▣ 署名はいらない(ただしDRMコンテンツは再生不可) ▣ カーネルモード □
ハードウェアとのつなぎこみをしてる □ 署名が必要(法人じゃないと無理?) ▣ どっちでも「今から再生する音」に触れる 17
Audio Processing Object ▣ 実態はCOMコンポーネント ▣ ドライバがCLSIDを指定して起動させる ▣ ある程度のフレーム数(10ms?)が渡されて、同じ長さ のフレームを返すとそれが再生される
▣ IAudioProcessingObjectRT::APOProcess() 18
Audio Processing Object 19 DLLとしてビルドした、 APOとしての要件を満たすCOMコンポーネントをWindowsに登録
Audio Processing Object 20 登録したDLLはレジストリの、 コンピューター¥HKEY_LOCAL_MACHINE¥SOFTWARE¥Classes¥CLSID¥{${CLSID}} に参照先とかが書き込まれる
21 登録したDLLのCLSIDをデバイスのレジストリで指定する デバイスのレジストリは↓パス以下にある コンピューター¥HKEY_LOCAL_MACHINE¥SOFTWARE¥ Microsoft¥Windows¥CurrentVersion¥MMDevices¥Audio¥Render Audio Processing Object
4. Filtering 22
▣ 2.でも述べたように、ピー音 はある周波数の正弦波 ▣ パワースペクトルがピークに なってる部分をフィルタする とピー音は聞こえなくなる ピー音 23
▣ ←みたいな2次の再帰的な線 形フィルタ ▣ 適切な𝑎1 , 𝑎2 , 𝑏0 ,𝑏1
, 𝑏2 を与え ると特定の周波数をカットで きる □ Notch Filter ▣ フーリエ変換とかせずにでき てすごい(どの周波数をカット するかで必要ではある) Biquad Filter 24 https://jp.mathworks.c om/help/control/ug/di scretizing-a-notch- filter.html https://en.wikip edia.org/wiki/Di gital_biquad_fil ter
Biquad Filter ▣ 伝達関数からわかるように前の状態を使う ▣ APO内で状態を持たないとプツプツ音がする 25
5. Next Step 26
ピー音の種類 ▣ 「おだんご」の「ん」をピー音が対象にしてるとする ▣ 「ん」の音にピー音を重ねてるだけ ▣ メーカー例) アトリエかぐや ▣ 「ん」の後にピー音を入れてるだけ(「ご」には重ねない)
▣ メーカー例) アストロノーツ ▣ 「ん」の音を消してピー音を重ねてる ▣ メーカー例) スミレ ▣ このとき「おだ_ご」になる 27
音抜けも許さない ▣ ピー音なしに「おだ_ご」と修正してるメーカーもある ▣ 無論これも悪 ▣ 悪・即・斬 28
試したアプローチ ▣ 結構な精度でBGMと声を分けられる OSS(spleeter) ▣ 声だけにした音声なら簡単に直前の 音素が分かる? ▣ 例えば「t」や「m」なら特徴的でわかるかも? ▣
「t」は破裂音でスペクトルがかなり特徴的 ▣ 「m」は有声音で母音が強く出ててフォルマン ト周波数が目立つ ▣ spleeterのピークが重くてリアルタ イムで処理できず 29 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0 500 1000 処理時間[s] 試行回数[回]
考えてるアプローチ ▣ spleeterにピークが立ってる原因調査 ▣ それなりに軽い音声認識モデルをつくる ▣ データは用意できる ▣ 母音や吐息だけの無意味な音声の扱いをどうするか ▣
「おだ_ご」→「おだんご」は生成するなり、いくつかの パターンに分類して決まった音声で置換なりどうとで もなりそう ▣ 来月末にリリースしたい! ▣ アイディア募集中! 30
6. Appendix 31
▣ 【最重要】Program Files以下に置かないと動かない ▣ DebugViewでデバッグするときは、管理者権限で起 動してGlobal Win32 debug outputを拾う ▣
プロセス間通信はできない ▣ ソケット通信 ▣ 共有メモリ ▣ 名前付き/匿名パイプ APOを作ってみたい人向け1 32
▣ Windows11だとLFX/GFXは動かない。 SFX/MFX/EFXを使う ▣ SFX/MFX/EFXは↓のキーでレジストリに指定する {d04e05a6-594b-4fb6-a80d-01af5eed7d1d},(13|14|15) ▣ 公式のdriver sampleに入ってるAPOは、ドライバを インストールする前提だから、単体で入れるとちゃんと
動かない ▣ {d3993a3f-99c2-4402-b5ec-a92a0367664b},(5|6|7) はとりあえず{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3} APOを作ってみたい人向け2 33
7. Reference 34
参考文献 35 ▣ MSDN □ https://docs.microsoft.com/en-us/windows- hardware/drivers/audio/audio-processing-object- architecture □ 文句は無限にあるけどないと始まらない
▣ フラキチさんブログ □ http://frchick.blog129.fc2.com/blog-entry-733.html □ 公式以外でAPOの話をしてるほぼ唯一のサイト