第528回:「Windowsオーディオエンジンで音質劣化」を検証

~ASIO/WASAPI利用時と比較。劣化回避の方法は? ~


  Windowsでオーディオを再生するのにいつも問題視されるオーディオエンジン。Widows XP世代まではカーネルミキサーと呼ばれていたが、「Windowsカーネルミキサを通すと音質が劣化する」というのが定説であり、それを避けるためにASIOドライバやWASAPIを用いている人が多い。でも、音質が変化するというのは本当なのだろうか、またわざわざASIOやWASAPIを利用しなくても音質劣化を防ぐ方法はないのだろうか? これについてWindows 7 PCを使って実証実験を行なってみた。

 なお、Windows Vista以降はカーネルミキサーではなく「オーディオエンジン」という呼称に改められているが、この記事ではWindowsがOSシステム上持っているオーディオミキサーの呼称として「カーネルミキサー」という用語を使用する。

一部カーネルミキサーの表現を改めたほか、「カーネルミキサー」についての説明を追加しました(11月19日追記)


■ カーネルミキサーを通して生まれたノイズを確認

 この実証実験を思い立ったのは、サウンド・オーディオ関連のプログラム開発を行なっているフリーのエンジニア、「ありぱぱ」氏とのやり取りがきっかけ。4月にDigital Audio Laboratoryで「MP3圧縮で、どんな音が失われるのか」という記事を書いたが、そのときCubaseを用いて実験した話をしたところ、Sound Forgeのほうが使いやすいし、似た実験をよく行なっているという。

 自分でも改めてSound Forgeを試してみようと思っていたところ、メールで「やっぱりカーネルミキサーを通した音は変なので、SoundForgeで解析したところ、決定的な証拠をつかんだ」という連絡をもらったのだ。そこから、筆者も一緒に実験をしつつ、議論を重ねていったところ、さまざまな問題が見えてきた。

 たとえばWindows 7上でWindows Media Playerで鳴らす音は、劣化するというか変化してしまう。これは仕様とか、性能とかいうよりは、バグなのではないか、と思ってしまうほどの内容だった。また、このことはWindows Media Playerに限らず、iTunesを使った場合でもまったく同様だったのだ。

 こうした音の劣化・変化を分かっている人たちは、こうした現象を避けるためASIOやWASAPIを使っている。プラグインを組み込まなくてはならないので多少面倒ではあるが、プレーヤーソフトとしてfoober2000やWinAmpの人気が高いのはこのためだろう。

 一方、マニアの方の中にはこうしたプレーヤーソフトではなく、DAWでオーディオを聴く人が少なくない。「Cubaseがいい」とか、「SONARのほうがいい」、「StudioOneがベストだ」といった議論がされているので、個人的には訝しく思っていたというのが正直なところ。DAWを本来の目的とはまったく違う使い方をしていることにも違和感を持っていたわけだが、実験を進めて行くうちに、彼らがDAWを評価する理由も少し見えてきた。というのも、DAWでオーディオ再生している人に限って、その多くがASIOドライバではなく、MMEドライバで再生していたからだ。確かにUSB-DACでASIOドライバに対応しているものは少ないし、ASIO4ALLなどのコンバータを入れるとマシンが不安定になるというのも実情。結果としてカーネルミキサーを通すMMEドライバを使っていたのだが、その場合は確かにWindows Media Playerなどで再生するのと比較して問題が少なくなり、結果としていい音での再生ができることも見えてきたのだ。

 では、ここからもう少し具体的にその現象について見ていくことにしよう。今回、実験に使ったのはWindows 7の64bit版をインストールしたPCで、オーディオインターフェイスにはRolandのQUAD-CAPTUREを利用した。このQUAD-CAPTUREはASIO、WASAPIが利用できるのと同時にもちろん、MME、DirectXが利用できる上、再生した音をそのままリダイレクトで録音できてしまうからだ。

Windows 7 64bit版のPCを用意Roland QUAD-CAPTURE

 ただし、各種実験結果がQUAD-CAPTURE固有の問題でないかの検証のため、マザーボードのS/PDIF出力を別のオーディオインターフェイスでデジタルのまま取り込むという方法も試してみたが、まったく同じ結果となったことも記しておこう。また検証に使ったのは前述のSound Forge。正確にはSony Creative SoftwareのSound Forge Pro 10だ。

テストに使ったWAVファイル

 そして、もうひとつ用意するのがオーディオ素材。何でもいいのだが、分かりやすいのは、音圧を高めに設定した曲。先日購入したCDからリッピングしたWAVファイルをひとつ生成しておいた。また実験時間節約のため、曲は頭から1分程度に予めカットしておいた。

 今回の実験では、オリジナルの音源と再生した結果にどんな違いが出るかを調べるのだが、基本的には以前の記事「MP3圧縮で、どんな音が失われるのか」で使ったのと同じ方法。つまり再生した結果の音の位相を反転したものをオリジナルとミックスし、差分を浮かび出させるという手法である。以前苦労したのは、その2つのタイミングを合わせることだったが、曲の頭に1サンプル分のクリックを入れておき、そこに合わせ込めばピッタリ合う。確かに、こうしたことはSound Forgeの得意とするところなので、予めこうした目印をつけておいた。

 準備ができたら、プレーヤーソフトで再生したものを、そのままSound Forgeで録音する。この際、Windowsの「サウンド」で、QUAD-CAPTUREを「既定のデバイス」として設定しておく。またこの際、別の音が紛れ込まないように、QUAD-CAPTURE側のデジタルミキサーで完全にシャットアウトしておいた。

曲頭に目印をつけておく再生音をSound Forgeで録音別の音が紛れ込まないように、QUAD-CAPTUREのデジタルミキサーで遮断

 また、ここで非常に重要なのがサンプリングレートについて。カーネルミキサーには自動でサンプリングレートをコンバートする機能があるが、そんな重要なことをMicrosoftが作ったカーネルミキサーに任せたくないというのも事実。オーディオ機器メーカーも、レコーディング機器メーカーもサンプリングレートコンバートのために、さまざまなアルゴリズムを開発し、それをベースにした製品が存在している。したがって、カーネルミキサーにサンプリングレートコンバートをさせると問題が発生しそうではある。しかし、今回はその問題には触れないようにするため、QUAD-CAPTURE側のサンプリングレートを44.1kHzに設定し、サンプリングレートコンバート機能が働かないようにしておいた。

 2つ目に重要なのがカーネルミキサーの音量レベル設定だ。できるだけストレートに音を出し、カーネルミキサーの影響を受けないようにするためには、音量変化のない0dBに設定すべきだ。ただし、カーネルミキサーのレベルは0~100というパーセント表示であり、0dBがどこになるかといった説明はない。が、これは測定してみれば分かるとおり、100%が0dBとなっている。そこで100%の設定にして、Windows Media Playerで再生し、Sound Forgeでそのまま録音してみた。

100%が0dBとなっていた100%の設定にして、Windows Media Playerで再生、Sound Forgeで録音



マーカーとして打った1サンプル分のクリックが入っている

 録音した結果の頭を見ると、確かに先ほどマーカーとして打った1サンプル分のクリックもしっかり入っていることが確認できる。これを利用し、前述の方法で位相反転・ミックスする。すると、どうだろうか見事にキレイに音が打ち消しあって消える。が、よく見ると、なにかプチプチとしたゴミのようなものが見えるのだ。

 ここで縦軸、つまりレベルを拡大表示させてみたところ、問題があることが発覚した。そう、-38dB程度のレベルであきらかな差分の波形が紛れているのだ。ためしに、これを再生してみると、チチッといったノイズが聴こえるし、音量を上げるとかなりひどいノイズとなって聴こえる。これは明らかに大きな問題である。


位相反転してミックス音が打ち消しあって消えたレベルを拡大表示したところ


■ 音質変化にピークリミッタが影響

 どこで、こうした問題が起こっているのかを確認するため、オリジナル音源と時間軸を揃えて上下に並べてみると、どうもピークリミットに当たっているところで発生しているっぽい。さらに拡大して見ると、確かにオリジナルが0dBになる前後で発生していることが分かる。また波形を見比べてみると、まさにそのピーク前後の相似形となっていることが確認できるのだ。

ピークリミットに当たっているところで発生しているようだオリジナルが0dBになる前後で発生していた

 ありぱぱ氏と話をしてみると、これはピークリミッタが効いているための現象とのこと。そう、あまり知られていないがWindowsのカーネルミキサーの後段にはピークリミッタが設置されており、すべての音がここを通るようになっているというのだ。とはいえ、この曲を再生する場合、そもそも0dBを超えるはずがないわけだから、ここでリミッタをかける必要はない。また、現在の楽曲の多くは目一杯の音圧を出すために、0dBギリギリに上げる勝負をしているわけだが、そのギリギリで作った成果をWindowsのカーネルミキサーによってぶち壊されるというのは誰もが納得のいかないところだろう。

 でも、どうしてピークリミッタなどが設置されているのか? それは、Windowsでは複数のソフトを同時に鳴らすことができるようになっているからだ。複数ソフトから音が入ってきた結果、ピークを超えてクリップしてしまうのを避けるために入れているようなのだが、1つしか鳴っていなくても、強制的にかかってしまうというのは問題。しかも、音質的に丁寧な処理がされているわけでもないから、明らかに音が濁ってしまうのだ。

 こうした現象は、Windows Media Playerに限らず、iTunesでも、foober2000やWinAmpの標準の設定で行なってもまったく同じように発生するから困ったものだ。

 では、まったく同じ実験をASIOやWASAPIで行なうとどうなるのか? これについては、foober2000にASIOプラグイン、WASAPIプラグインを組み込んだ上で再生し、先ほどと同様に位相反転・ミックスしてみた。その結果は、ASIOもWASAPIも同様で、先ほどのような差分はまった見えない。つまり、定説どおり、カーネルミキサーを通すと音が劣化するが、ASIOやWASAPIを利用すれば、そうした問題が起こらないということになる。

 それにしても、ここまでひどい音の劣化はWindowsのバグといっていいもの。Microsoftに修正をしてもらいたいところだが、そもそもオーディオ系に興味を持たないMicrosoftにこれを期待するのは難しそう。とりあえず、ちょっとでもこの問題を回避する方法はないものだろうか? ここで、ありぱぱ氏から提案があったのが出力レベルを100%ではなく99%にすればピーク問題が回避できるのではないか、ということ。そして、ありぱぱ氏自身が実験した結果、それが実証できたというのだ。

foober2000にASIOプラグイン、WASAPIプラグインを組み込んで再生ASIO/WASAPI経由では先ほどのような差分は生まれなかった出力レベルを99%に落としたところ

 もちろん、99%に落とすということは、音量変化が起こっており、ここで音質劣化を起こすということも否定できない。とはいえ、単純な音量変化だから、いくらMicrosoftのプログラムとはいえ、そこまで、ひどいことは起こらないだろう、という仮定での実験だ。また音量を下げているから、先ほどとまったく同じように位相反転してミックスしたのでは、うまくいかない。そこで、99%にした際の音量変化がどうなるのかを単純な信号を利用して測定しておいたのだ。その結果、実際には98.259%となっていることが分かった。反対にいえば、取り込んだ音にその逆数である101.772%を掛けた上で、反転させてミックスすればいいはずだ。

 ありぱぱ氏と同じ結果になるものか自分でも試してみたのだが、なぜか私のほうでは、100%のときと同様の現象が起きてしまう。さらに96%、90%、70%程度にしても変わらず、50%以下にすると、ようやく消えるという状況だった。でもなぜ、二人の間で違いが起きたのか…。当初、ありぱぱ氏が48kHzのオーディオソースを使っていて、筆者が44.1kHzのものを使っていたため、そこに問題があるのでは……と48kHzのソースを試してみたのだが、結果は同じ。おかしいと思って、お互いで確認してみたところ、再生していたソフトに違いがあったのだ。そう、筆者は前述のとおりWindows Media Playerを使っていたのに対し、ありぱぱ氏側は同じMMEドライバを使うのだからということで、DAWでの再生を行なっていたようなのだ。そこで、ありぱぱ氏にもWindows Media Playerでテストしてもらったところ、同じ結果となった。

取り込んだ音にその逆数である101.772%を掛けた上で、反転させてミックス100%のときと同様の現象が起きてしまった

 反対に筆者もソフトを変えて、SONAR X1のMMEモードで試してみた。すると100%のボリュームでは先ほどと同じ結果だが、99%にするとリミッタ問題は解消されることが確認できたのだ。さらに、ほかのソフトを試してみるとiTunesでもfoober2000の標準ドライバでもWindows Media Playerと同じ結果となってしまう。ただし、WinAmpの場合は99%にすると解消されるのだ。不思議に思っていたところ、ありぱぱ氏から思いがけない結論が持ち出された。そう、Windows Media PlayerやiTunes、foober2000が出力しているのは、MMEドライバではなく、DirectSoundであり、SONAR X1やWinAmpが出力しているのはMMEドライバだったのだ。確かにfoober2000での標準設定では頭に「DS」という文字が付いていた。

 ご存知のとおり、DirectSoundがゲーム用に作られたMicrosoftのWindows拡張機能であり、エフェクトが利用できるほか、レイテンシーも小さくすることができる。とはいえ、カーネルミキサーを通すという面では同じだから、音質面では同じと思っていたのだが、違いがあるようなのだ。ここでハッキリ確認できたのはミキサーレベルを100%にしていると、MMEもDirectSoundもほぼ同じ結果であるが、99%に設定した際はMMEでピークリミッタが効かなくなりここでの音質劣化は避けられるということだ。なぜ、こんな仕様になっているのか、ますます納得がいかないところだが、これがWindowsのバグというか仕様ということなのだろう。この状況を整理するために、ありぱぱ氏が、アプリケーションとAPI、またドライバの間でどのように信号が流れていくかの図をまとめてくれているので、これが大きな参考になるのではないだろうか?

SONAR X1のMMEモードでテストアプリケーションとAPI、またドライバの間での信号の流れをまとめたありぱぱ氏の図


■ 他にも気になる点がいろいろ

 ここまでの現象を考えると、やはりWindowsで音楽を再生するのであればASIOやWASAPIを使うべきであるということ。DirectSoundかMMEドライバかを選択可能であれば、間違いなくMMEドライバを選択すべきである。ただし、Windows 7上でWindows Media PlayerやiTunesなどを使う場合には、強制的にDirectSoundが使われるために避けようがない。Windows 7 32bit版の場合、iTunesの出力はQuickTime制御となり、ここでWASAPI共有モードというものを設定することが可能。この場合もカーネルミキサーは通るのだが、DirectSoundのような問題は避けられるのかもしれない。これについてはまだテストできていないが、近いうちに試してみるつもりだ。

 一方、幸いにしてMMEドライバが選択できた場合は、Windowsのミキサーの設定を100%ではなく99%以下に設定すべきである。これによってピークリミッタ問題は回避できるのだ。ただ多くのソフトはDirectSound経由となってしまうのが難しいところ、古いソフトやWinAmpなどではMMEドライバが選択できるようになっているので、この辺を使うのがよさそうだ。また、冒頭でDAWを再生ソフトに使っている人がかなりいる旨のことを書いたが、この場合、ASIOを選択しなければ、通常はMMEドライバ出力となる。したがって、音量レベルを100%に設定しない限りはDirectSoundでの出力よりも音がよくなりそう。この辺がマニアの方々に評価されているのかもしれない。

 以上、Windowsのカーネルミキサーにあるピークリミッタの問題について検証してみたが、いかがだっただろうか? 本来もっと各方面からこうした問題の指摘があってもよかったように思うし、Digital Audio Laboratoryとしてももっと早く見つけ出すべきだったと感じているところだ。ただ、今回の実験ですべてが分かったわけではない。OSによる違いはどうなのか、サンプリングレコートコンバートをすると、どの程度音質が劣化するのかなど、もっと検証してみたいこともいろいろある。これらについても、今後実験を重ねつつ、記事にしていきたいと思っている。


(2012年 11月 12日)

= 藤本健 = リクルートに15年勤務した後、2004年に有限会社フラクタル・デザインを設立。リクルート在籍時代からMIDI、オーディオ、レコーディング関連の記事を中心に執筆している。以前にはシーケンスソフトの開発やMIDIインターフェイス、パソコン用音源の開発に携わったこともあるため、現在でも、システム周りの知識は深い。
 著書に「コンプリートDTMガイドブック」(リットーミュージック)、「できる初音ミク&鏡音リン・レン 」(インプレスジャパン)、「MASTER OF SONAR」(BNN新社)などがある。またブログ型ニュースサイトDTMステーションを運営するほか、All AboutではDTM・デジタルレコーディング担当ガイドも務めている。EPUBマガジン「MAGon」で、「藤本健のDigital Audio Laboratory's Journal」を配信中。Twitterは@kenfujimoto

[Text by藤本健]