Google製音声圧縮用超低ビットレートコーデック「Lyra」を試してみた
はじめに
面白そうだったので試してみました。その過程でDockerfileが出来上がったのでここに置いておきます。なお私は機械学習はおろかIT全般に対してド素人ですので、その点はあらかじめご了承ください。
Lyraについて
「Lyra」はGoogleによって開発された音声コーデックで、機械学習を活用して音声を圧縮します。最低で3.2kbpsという超低ビットレートにできるとのことです(Opusは最低で6kbps)。ローエンドの携帯電話上でもリアルタイムで処理できるよう、計算の複雑さを軽減する工夫がなされているようです。
どのくらい「聞ける」音声になるのかは、下記リンク先のサンプルから実際に聞くことで確かめてください。
このLyraですが、GitHub上で公開されています。
Dockerを使ってビルドする
GitHubのLyraのリポジトリをclone
して、READMEにある通りにビルドするだけなので難しいことはありません。私は下のようなDockerfileを作って使いました。
FROM python
WORKDIR /app
COPY . .
RUN pip install numpy
ADD https://github.com/bazelbuild/bazelisk/releases/download/v1.16.0/bazelisk-linux-amd64 bazel
RUN chmod +x bazel
RUN ./bazel build -c opt lyra/cli_example:encoder_main
RUN ./bazel build -c opt lyra/cli_example:decoder_main
使い方
実際に使うには、ビルドしたDockerイメージから作ったコンテナ内で次のようにします。ここではホスト・コンテナ間のファイル共有のために、/data
へのbind mountをしています。
入力には、モノラルかつサンプリングレートが16kbpsなwavファイルを使います。次のように作成してください。
$ ffmpeg -i audio -ac 1 -ar 16k audio.wav
エンコードとデコードは次のようにします。
# エンコード
$ /app/bazel-bin/lyra/cli_example/encoder_main \
--model_path=/app/lyra/model_coeffs \
--output_dir=/data \
--input_path=/data/audio.wav
# デコード
$ /app/bazel-bin/lyra/cli_example/decoder_main \
--model_path=/app/lyra/model_coeffs \
--output_dir=/data \
--encoded_path=/data/audio.lyra
--model_path
オプションを指定しないとエラーになります。また、--bitrate
オプションでは3200から9200の数値で、ビットレートを変更できます。デフォルトは最低の3200です。
試した感想
試しに自分の声(ライセンス的にこれ以上ないほど真っ白)を使ってエンコード/デコードを試してみたところ、容量は次のようになりました。単位はバイトです。
386468 input.wav
4824 encoded.lyra
385964 decoded.wav
9269 audio.opus
input.wav
をエンコードして作成したencoded.lyra
をデコードすることでdecoded.wav
となります。decoded.wav
の音質としては、流石に音がザラザラとしていて聞き取りづらさはありましたが、まったく問題なく聞き取れるレベルでした。
比較のために6kbpsなOpusファイルも作成しました(opusenc --bitrate=6
)。容量はLyraファイルの倍近くありますが、聞き比べたところその音質は、Lyraをデコードしたdecoded.wav
の方がずっとよいと感じられるものでした。
また--bitrate
を上限の9200に設定した場合のencoded.lyra
は13869バイトでした。opusenc --bitrate 9.2
で作成したOpusファイルの容量は14177バイトと同程度。どちらも普通に聞き取れるレベルで、そこまで違いはないように感じられました。
適当な音楽ファイルを入力してみたところ、とても聞けたものではないファイルが出力されました。面白いです。
おわりに
変換後のファイルを公開したい気持ちは山々ですが、私の滑舌の悪い様子をインターネットに公開する勇気が出なかったので断念しました。GoogleのLyra紹介記事では様々なシチュエーションでの例を聞くことができますので、そちらからお願いします。
Lyraを使うことで、低帯域幅なネットワークで、これまでできなかった多くのことができるようになりそうだと感じました。今後、リアルタイム処理がどの程度の性能になるかにもよりますが、IoTにも活用できたら楽しそうです。
余談
似たようなコンセプトの音声コーデックとしては、EnCodecやSatinがあります。FacebookによるEnCodecでは、ステレオで48kHzな音声ファイルを扱えるようにしようとしているようです。使ってみたかったのですが、私の環境ではエラーが出てしまったのであとで再挑戦してみるつもりです。MicrosoftによるSatinは、少なくとも現時点ではクローズドソースなようなので試せませんでしたが、注視していきたいと思います。
Discussion