2023/12/17
最近 PC を更新し Windows 11 に乗り換えましたが、Windows 付属メディアプレイヤーの一時停止から再生再開するときに1秒程度音量が下がってしまうという問題があります。参考にしたサイトによると、単純に常時ひたすらゼロデータを再生し続けるオーディオアプリを実行させておくだけで解決できるようです。
たまたま 別の検討 で python-sounddevice を使ったことがあり、それを極限まで簡略化しただけのものを作ってみました。
なお、手元ではこの方法で、Windows 自身のサウンド(ダイアログ警告音など)や、Windows 付属メディアプレイヤーの再生開始がもっさりだったり一時停止の解除にワンクッション待たされる現象も、解消されました。どちらも、どうやら、再生する音声がない状態がある程度(数秒?)続くとカーネルミキサーがスリープしてしまい、一時停止解除したときにカーネルミキサーが再度アクティブになりきるまでストリームデータの送り込みが待たされる都合上で起きているように見えます。
実行には Python, sounddevice, numpy が必要です。
|
上記を Python ソースコードのファイルとして保存し、実行するだけです。効果が出るのは実行中だけです。
実行しても画面上ではうんともすんとも言いません。GUIはありません。無限ループですので、終了は Ctrl+C か、コマンドプロンプト画面そのものを終了させることで行います。
デバイスの初期化と開放が while ループの都度行われるため、CPU 負荷がいくぶん高いようです。
ほんの少しですが CPU 負荷を下げるためゼロデータ再生長さを減らすとともに sleep を入れて都合3.5~4秒に1回程度の頻度にする:
|
ストリームを使って無限に再生する。python-sounddevice の正弦波を再生し続けるサンプル https://python-sounddevice.readthedocs.io/en/0.4.6/examples.html#play-a-sine-signal を簡略化して単にデフォルトデバイスでゼロデータを再生するようにしたもの。このほうがデバイスの初期化と開放を繰り返さないので連続再生であっても CPU 負荷が軽い。
|
2024/01/28 import sys が抜けていたので修正。
なお、Realtek の PC 内臓オーディオでは PC にイヤホンを抜き差ししたときに論理オーディオデバイスそのものが変更されるようで、その切り替えのタイミングで output underflow という表示(コールバック関数の status に入れられるもの)が出ることがあります。イヤホン挿入状態でこのプログラムを起動してからイヤホンを抜くと、イヤホン用の論理デバイスが消滅するためコールバック関数の呼び出しが止まってしまうこともあるようです。この種のデバイス動的変更に追随できないのは python-sounddevice がバックエンドで使っている PortAudio の仕様制約のようです。
もう少し親切に、使用デバイス名の表示と、動作中であることがわかるようにANSIエスケープシーケンスでくるくる回す(unix系由来のダウンローダーとかによくあるやつ)のを追加。この例では main を関数に分ける意味がないのでべた書きに変更。
|
常時ひたすらゼロデータを再生し続けるのは、他にもたとえば次のような方法もあります。
トップページ /
計算機関係の雑多なこと /
Windows 11 における音声再生の自動フェードインのキャンセル(常時ゼロ再生)(Python-Sounddevice)
このサイトについて・著者連絡先