🗜️

Google製音声圧縮用超低ビットレートコーデック「Lyra」を試してみた

2023/03/27に公開

はじめに

面白そうだったので試してみました。その過程でDockerfileが出来上がったのでここに置いておきます。なお私は機械学習はおろかIT全般に対してド素人ですので、その点はあらかじめご了承ください。

Lyraについて

「Lyra」はGoogleによって開発された音声コーデックで、機械学習を活用して音声を圧縮します。最低で3.2kbpsという超低ビットレートにできるとのことです(Opusは最低で6kbps)。ローエンドの携帯電話上でもリアルタイムで処理できるよう、計算の複雑さを軽減する工夫がなされているようです。

どのくらい「聞ける」音声になるのかは、下記リンク先のサンプルから実際に聞くことで確かめてください。

https://ai.googleblog.com/2021/02/lyra-new-very-low-bitrate-codec-for.html

https://gigazine.net/news/20210303-google-codec-lyra/

このLyraですが、GitHub上で公開されています。

https://github.com/google/lyra

https://gigazine.net/news/20210407-google-open-source-lyra/

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