$30 off During Our Annual Pro Sale. View Details »

自由を求めてWindowsオーディオプログラミング

ryoha
March 27, 2022
150

 自由を求めてWindowsオーディオプログラミング

Audio Processing Object の話です

ryoha

March 27, 2022
Tweet

Transcript

  1. 自由を求めて Windows オーディオプログラミング @ryoha000

  2. 2 自由 感じてますか?

  3. 3 自由 感じてますか?

  4. 自己紹介 4 ▣ りょは □ Twitter, GitHub @ryoha000 ▣ 趣味

    □ 美少女ゲーム □ 麻雀 今やってるゲームの好きなキャラ (かわいい)
  5. 1. Motivation 5

  6. ピー音を消したい 6

  7. ピー音を消したい 7 ▣ そもそも存在が悪 ▣ 現代のソフ倫はそもそも規制してない □ 昔は規制してた □ 日本ビデオ倫理協会(解散済み)が美少女ゲームに参入

    □ それを受けてコンピュータソフトウェア倫理機構も規制緩和 あだ名がソフりん
  8. おおざっぱな方針 8 ▣ ぶっこ抜いてそれを改ざん □ 犯罪かもしれん ▣ ユーザーモードで動くアプリの権限だけでなんとか □ システムへの影響が小さい

    □ 失敗 ▣ カーネルモードでやってる処理に差し込む □ C++を書く必要 □ なんか大変そう □ 最終的にはこの方針
  9. 2. In User Mode 9

  10. ユーザーモードでの前提 ▣ 「今から再生する音」はいじれない ▣ 「今再生してる音」は拾える ▣ IAudioCaptureClient::GetBuffer() ▣ ピー音は基本的に決まった振幅・周波数の正弦波 10

  11. 処理の流れ 11 出力 プログラム + - 他アプリからでる音 消したい周波数の 同じ振幅の逆位相を流す 消したい周波数の振幅・位相と

    今プログラムで流してる振幅・位相が 実際どのくらいずれてるか計算
  12. 発想 ▣ ピー音がある程度の間続いて、1ループが十分短い ▣ 自分で出してるピー音と、消したいピー音の位相差は 結果的に再生された音からわかる ▣ フィードバック制御で逆位相にしてピー音を打ち消す 12 出力

    プログラム + - 他アプリからでる音 消したい周波数の 同じ振幅の逆位相を流す 消したい周波数の振幅・位相と 今プログラムで流してる振幅・位相が 実際どのくらいずれてるか計算
  13. ▣ 1回のフィードバックループだけで20ms以上かかる ▣ 処理の重さじゃなくAPIのレイテンシーの問題 ▣ ピー音は80msくらいだからほとんど聞こえる ▣ 結構がっつりコード書いちゃったけどプロトタイプで試 すべきだった 失敗!

    13
  14. 3. In Kernel Mode? 14

  15. Windowsの 音関連アーキテクチャ 15

  16. 16 普通にイメージする 「アプリケーション」の領域 「アプリケーション」が叩く OSのAPIの領域 「ドライバ」の領域 http://frchick.blog129.fc2.c om/blog-entry-733.html

  17. 「ドライバ」の領域 ▣ ユーザーモード ▣ APOが動いてる ▣ 署名はいらない(ただしDRMコンテンツは再生不可) ▣ カーネルモード □

    ハードウェアとのつなぎこみをしてる □ 署名が必要(法人じゃないと無理?) ▣ どっちでも「今から再生する音」に触れる 17
  18. Audio Processing Object ▣ 実態はCOMコンポーネント ▣ ドライバがCLSIDを指定して起動させる ▣ ある程度のフレーム数(10ms?)が渡されて、同じ長さ のフレームを返すとそれが再生される

    ▣ IAudioProcessingObjectRT::APOProcess() 18
  19. Audio Processing Object 19 DLLとしてビルドした、 APOとしての要件を満たすCOMコンポーネントをWindowsに登録

  20. Audio Processing Object 20 登録したDLLはレジストリの、 コンピューター¥HKEY_LOCAL_MACHINE¥SOFTWARE¥Classes¥CLSID¥{${CLSID}} に参照先とかが書き込まれる

  21. 21 登録したDLLのCLSIDをデバイスのレジストリで指定する デバイスのレジストリは↓パス以下にある コンピューター¥HKEY_LOCAL_MACHINE¥SOFTWARE¥ Microsoft¥Windows¥CurrentVersion¥MMDevices¥Audio¥Render Audio Processing Object

  22. 4. Filtering 22

  23. ▣ 2.でも述べたように、ピー音 はある周波数の正弦波 ▣ パワースペクトルがピークに なってる部分をフィルタする とピー音は聞こえなくなる ピー音 23

  24. ▣ ←みたいな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
  25. Biquad Filter ▣ 伝達関数からわかるように前の状態を使う ▣ APO内で状態を持たないとプツプツ音がする 25

  26. 5. Next Step 26

  27. ピー音の種類 ▣ 「おだんご」の「ん」をピー音が対象にしてるとする ▣ 「ん」の音にピー音を重ねてるだけ ▣ メーカー例) アトリエかぐや ▣ 「ん」の後にピー音を入れてるだけ(「ご」には重ねない)

    ▣ メーカー例) アストロノーツ ▣ 「ん」の音を消してピー音を重ねてる ▣ メーカー例) スミレ ▣ このとき「おだ_ご」になる 27
  28. 音抜けも許さない ▣ ピー音なしに「おだ_ご」と修正してるメーカーもある ▣ 無論これも悪 ▣ 悪・即・斬 28

  29. 試したアプローチ ▣ 結構な精度で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] 試行回数[回]
  30. 考えてるアプローチ ▣ spleeterにピークが立ってる原因調査 ▣ それなりに軽い音声認識モデルをつくる ▣ データは用意できる ▣ 母音や吐息だけの無意味な音声の扱いをどうするか ▣

    「おだ_ご」→「おだんご」は生成するなり、いくつかの パターンに分類して決まった音声で置換なりどうとで もなりそう ▣ 来月末にリリースしたい! ▣ アイディア募集中! 30
  31. 6. Appendix 31

  32. ▣ 【最重要】Program Files以下に置かないと動かない ▣ DebugViewでデバッグするときは、管理者権限で起 動してGlobal Win32 debug outputを拾う ▣

    プロセス間通信はできない ▣ ソケット通信 ▣ 共有メモリ ▣ 名前付き/匿名パイプ APOを作ってみたい人向け1 32
  33. ▣ 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
  34. 7. Reference 34

  35. 参考文献 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の話をしてるほぼ唯一のサイト