概要
前回はMP3にエンコードして文字起こしの処理を実施しましたが、「AmiVoice APIを実行してみた Webページ編」にdecodeAudioDataのモノラル変換処理が書かれているのをみまして、これは使えそうだということでFLACでのデータ受け渡しを試してみました。
decodeAudioDataのモノラル変換
Whisperの発話データの前処理では「PCM 16kHz 16bit モノラル」に変換が行われます。
mp3をエンコードするときは、劣化対策として「44.1khzをステレオ」で処理してましたが、「PCM 16kHz 16bit モノラル」でかつ、FLACで処理した方が軽いし高音質に決まっているやろと思い至りましたので実現可能性について評価しました。
なので今回は、精度比較は行なっておりません。気が向いた時にやろうと思います。
他にも、「PCM 16kHz 16bit モノラル」をmp3で処理した場合とFLACで処理した場合での違いも気になりますね。
さて、処理方法ですが、5. 複数チャンネルの音声データをモノラルへ変換に書かれているモノラル変換の通りです。
他にもやり方があると書かれていますが、複数チャンネルをモノラルにまとめる方法を知らなかったので勉強になりました。
「長時間でかつ2チャンネルの音声データ」を扱う時にdecodeAudioDataを単純にひとつの変数に格納しますと、変数から溢れるのでどうするのかと思っていたのでなるほどなぁと思いました。
flacのエンコード(JS)
JSでのflacのエンコードは、libflacのexample/encode-func.jsを参照して組みこみました。
利用方法は、package/libflacjsにある通り、npmでインストールするか、vanillajsで扱いたい場合は、distのフォルダをローカルに展開して利用します。
$ curl -LO https://github.com/mmig/libflac.js/archive/refs/tags/5.4.0.tar.gz
$ tar xvzf 5.4.0.tar.gz
$ cp libflac.js-5.4.0/dist/libflac.wasm.* ./js
libflac.min.wasm.js
はwasmが今のブラウザに対応していないのかエラーが出るのでlibflac.wasm.js
を利用しました。
※ libflacjsの最終リリースは2020年
exampleは古いお作法で書かれており、例外処理をtry-catchで括って欲しかったり、今風にAsyncで書ける実装にして欲しかったりと思うところは多々ありました。
flacのデコード(Python)
Whisper load_audioのffmpegを利用するやり方でflacは簡単に読み込めます。
幾つかのpythonのオーディオライブラリを試して見たのですが、何故か読み込みに失敗します。
Pythonでバイナリをバラして処理すると遅い(途中まで試してやめた)のでffmpeg
を使うのが無難そうです。
思うところは多々ありますが、一応動いてはいるし何処まで調べるかは悩ましいところです。
サンプルコード
とりあえず動かしたサンプルコードを貼っておきます。適宜修正は必要です。