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
420
自由を求めて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
For a Future-Friendly Web
brad_frost
175
9.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
1
120
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Building Adaptive Systems
keathley
38
2.3k
The Cult of Friendly URLs
andyhume
78
6.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
4 Signs Your Business is Dying
shpigford
182
21k
How to train your dragon (web standard)
notwaldorf
88
5.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Building Your Own Lightsaber
phodgson
103
6.1k
Practical Orchestrator
shlominoach
186
10k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
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の話をしてるほぼ唯一のサイト