【解決策】にじボイスのWAVがPython waveライブラリで読めない件

こんにちはRcatです。
前回にじボイスに関する記事を書きました。こちらではAPIを使ってPythonからボイスを生成する方法を紹介しています。
しかし、問題が発生しました。waveライブラリで読み込めないのです。



はじめに

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

https://note.com/rcat999/n/nb6a601a36ef5

コメントについて

利用規約のガイドラインを確認の上コメントしてください


概要

一体何があったのか

こちらのコードをご覧ください。
ここで読み込んでいるファイルは、前回の記事で紹介したクラスを使ってAPIで生成しています。ブラウザの画面からだとMP3でしかダウンロードできませんでした。

>>> import wave
>>> f = wave.open("00001.wav","rb")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\py\python3116\Lib\wave.py", line 631, in open
    return Wave_read(f)
           ^^^^^^^^^^^^
  File "C:\py\python3116\Lib\wave.py", line 283, in __init__
    self.initfp(f)
  File "C:\py\python3116\Lib\wave.py", line 263, in initfp
    self._read_fmt_chunk(chunk)
  File "C:\py\python3116\Lib\wave.py", line 388, in _read_fmt_chunk
    raise Error('unknown format: %r' % (wFormatTag,))
wave.Error: unknown format: 3

なんと読み込みの時点でエラーになってしまっています。
これではPythonで処理できないじゃないですか!!

プロパティを確認

とりあえず詳細を確認します。

こちらがにじボイスです。

こちらが使い慣れたボイスボックスです。

ビットレートの高さも気になりますが、そもそもデータのサイズが違いますね。16ビットと32ビットこの辺りに何か差がありそうです。
まあそんなことは私にわかんないので、AIに聞いてみましょう。

というわけでチャットGPTに聞いてみました。
なるほどなるほど。鵜呑みにするのは良くないですが、私の考えていたこととおおよそ方向性は合っていそうです。
特に2番目のwaveモジュールは16ビットまでって情報が気になりますね。

知らないなりに色々調べてみたんですが、やっぱり対応してみないみたいです。
例えば、補足でフォーマットを確認する方法を教えてもらっています。

これを実行するとそれぞれ次のようになります。
最初がにじボイスで次がボイスボックスです。

$ ffprobe 00001.wav
Input #0, wav, from '00001.wav':
  Duration: 00:00:02.56, bitrate: 705 kb/s
  Stream #0:0: Audio: pcm_f32le ([3][0][0][0] / 0x0003), 22050 Hz, 1 channels, flt, 705 kb/s

$ ffprobe 001.wav
Input #0, wav, from '001.wav':
  Duration: 00:00:00.98, bitrate: 384 kb/s
  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 24000 Hz, 1 channels, s16, 384 kb/s

そしてここがライブラリのある区間です。
ハイライトされている部分がイコールでないのでエラーになっています。
で、ここで等号で比較されている定数ですが、

上の方に行くと以下のように定義されていました。
さっきのコマンドではフォーマットの後ろに16進数が出ていました。
そして、これはボイスボックスの時と同じ値になっていますので、関連があるかと思われます。

以上のことから、Pythonのライブラリでは読めないということが分かります。まあ、分析が間違っていたとしても結果が読めていないので、読めないのは確かでしょう


どうやって読み込むか

こちらのツールで散々使っているffmpegを使ってしまいましょう。それが一番手っ取り早いです。

というわけでコマンドがこちら
AIからの受け売りです。
ですが、変換先のフォーマットがさっきのコマンドで確認した。16ビットのものになっているくらいは分かります。

ffmpeg -i 00001.wav -acodec pcm_s16le -ar 44100 output.wav

変換されたファイルを開いてみます。

>>> import wave
>>> f = wave.open("output.wav","rb")

エラーは出ませんでした。これで読み込むことができそうです。


まとめ

今回は新作サービスを、自作のツールに取り込む過程でで直面した問題について記事にしていきました。
紹介などの記事は最近たくさん作られているみたいですが、実際に組み込むってところまで踏み込んでいる記事はあまり見かけないのでまだあまり知られていないエラーなのではないでしょうか?エラーというか仕様ですが。
少なくともPythonと連携しようとすると、まずこういった問題に出くわすことになりそうです。
AIからは他にも別のライブラリを使うという手段も提案されていますが、ツール内で他のライブラリを使うと、今までのソースコードとの連携が面倒なので、今回はコマンドを追加するにとどめようと思います。

それではまたお会いしましょう。

いいなと思ったら応援しよう!

Rcat999
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。