ソフトな忘却力(25) WSL2とWindows11連携でサウンドファイル生成なんのその

Joseph Halfmoon

新PC(Windows11)は便利。今回はWindows10で消えていたSound Recorder が復活しているのに気づきました。10のVoice Recorderは、wavフォーマット対応せずで難渋しました。WSL2とWindows11間は相互乗り入れ。音声ファイルの加工はLinux側のライブラリでさくさく?

Windows11 Sound Recorder復活

その昔のWindowsには長らくSound Recorderが付属していました。言っちゃ悪いですが大した機能もない「録音ツール」でした。しかしながら、最大の利点はWAVファイルに対応していたことです。「素の」非圧縮の音声フォーマットですが、各種「開発用」ソフトウエアが読み書きに対応しております。例えばMATLAB、Octaveなど。なにか音声信号相手に作業しようとするときにはファイルがデカくなるとかは別にして「素の」データがお好み。

しかしWindows10に至って Sound Recorderが消え、Voice Recorderが登場しました。カッコよくはなっていましたが、長時間録音可能な圧縮フォーマットのみ。「伝統の」WAVEフォーマットには非対応。しかたがないので、私は外部ツール使ってました。メンドイ(Windows10でもSound Recorderを復活させる方法もあるようですが。)

そうしたらWindows11ではSound Recorderあり、設定画面をみて喜びましたです。こんな感じ。Win11SoundRecorder

これでパソコンのマイク(マイク端子)からの入力をファイルに落とすことが楽。よかった。

libsndfile

音声ファイルをパソコン側のソフトで読み書きするだけならば上記だけで万歳だったのですが、音声ファイルを「生成」「加工」するにあたって、Linuxのツールを使いたいな、と思っておりました。

Windowsの「上の」Linux環境であるWSL2は、ネットワークやUSBには対応し、仮想GPUドライバを導入すればGUIも使えるなどモノホンのLinuxとほぼほぼ同等に近くなってます。しかし、ご存じのとおりサウンド入出力関係はWindows側に握られているみたいっす。まあ無理やりやって混乱するよりはましか。だいたいLinux側からもWindows側からも相互にファイルが見え、プログラムも起動しあえる関係なのでLinuxで処理したデータをWindowsで鳴らすなど「おちゃのこさいさい」ホントか?

さてそこで、使用したいLinux側のライブラリが以下であります。

https://github.com/libsndfile/libsndfile

上記のGithubへ行けば、当然ソースからのビルド方法が説明されておるのですが、正直お楽なのが一番。使用しておりますのは、Ubuntu 20.04LTS、パッケージマネージャで調べてみました。こんな感じ。UbuntuSndfile
上記のように、ライブラリ本体は何も言わないでも install済でした。開発用のヘッダファイルなどのパッケージはインストールされていないみたいです。

そこでlibsndfile1-devパッケージを追加することにいたしました。なお、中の人のホームページが以下に。

libsndfile

以下はapt info でみたパッケージの説明です。libsndfile1devInfo

上記の開発用のパッケージに加えて、以下の2つのパッケージも追加することといたしました。

    1. sndfile-programs
    2. sndfile-tools

最初の方は、libsndfile ライブラリを使ったユーティリティ的なツール群です。後のtoolsの方が「ちょっち複雑な」お道具類です。

sndfile-programsの内容は以下のようです。後で sndfile-infoを使ってみます。

sndfile-programs

 

一方、sndfile-toolsの内容は以下です。後でsndfile-spectrogramを使ってみます。

sndfile-tools

さてapt を使ったインストールのコマンドラインが以下に

$ sudo apt install libsndfile1-dev sndfile-programs sndfile-tools
開発用ライブラリの動作確認

開発用ライブラリのインストールができたので「簡単な動作確認」をいたしました。多分、どこかにフルセットのテストとかあるのだと思いますが、1個動けば、まあいいか、というお楽(手抜き。)

使わせていただいたのは、前述のlibsndfileのGithubの以下のサンプルプログラムのソースです。44.1kHzのサンプリングレートで、左344Hz、右466Hzの正弦波4秒分を生成し、WAV形式でファイルに落とすもの。

examples/make_sinc.c

上記のサンプルプログラムのビルドは以下で行いました。最初、-lsndfileだけつけてエラーになり、あれれということになって SIN()関数使っているのに -lmしてないことに気づきました。いつものトホホ。

$ gcc make_sinc.c -lm -lsndfile

上記で生成された a.outを走らせると、sine.wavファイルができてます。早速さきほどインストールした sndfile-infoで確認してみると以下のようでした。sndfile-info

いい感じでないかい。

しかし音を聞かないと。前述のごとくWSL2からは直接音声出力できないと思われるので、Windows側の chrome.exe に「御発声」をお願いいたしました。chrome.exe 様は wav ファイルを渡せばちゃんと再生してくれるのであります。こんな感じ。ChromeAsSoundPlayer

プーというか、ポーというか、鳴りましたぞ。

さて、先ほど予告したとおり、sndfile-spectrogramも使ってみます。これは音声ファイルを解析しSpectrogramにして画像ファイルに落としてくれるコマンドラインのプログラムです。出力はPNG形式。

WSL2でGUIは使えるようにしてありませんが、Windows側の NkV.exeという画像ビューワーを即座に呼び出せるようにしてあります。NkVでなく、Nkv.exe というお名前で呼び出さねばならないことを除けばLinux側からGUIが使えるごとし。こんな感じ。

sndfile-spectrogram

 

なんだかな~なグラフですが、下の方に見えている横線2本が344Hzと466Hzの信号だと思われます。中央部ではそれ以外の周波数は非常に低いと。ただ、開始と終了のところに「切断面」があるのでここに各種周波数が観察されておる、と。そういう理解で良いですかね?知らんけど。

まあ、新PCでも音声関係の処理はできそうな感じにセットアップ済?大丈夫か。

ソフトな忘却力(24)久しぶりのgprof、簡単なところから思い出す。へ戻る