はじめに
音源データ集めをしていたらopusファイルのデータにたどり着いたので,データの形をwavに統一したいため,wavファイルに変換しようというのが今回のモチベです.
面白かったので記録がてら残しておきます.
環境
- Windows 10 Home
- Python: 3.8.5
- librosa: 0.8.0
- ffmpeg: 4.3.1-static-64-bit
各拡張子の特徴
-
opus
- 人間が知覚できる聴覚全体を再現することができる音源を保存している形式.
- ビットレートは固定と可変の両方あるため,ファイルの容量を小さくすることも可能
- 非可逆音声圧縮あり,人間の声の録音にも向いている(.mp3は音楽向き)
-
wav
- 非圧縮音声であるため,データ数=標本化周波数 x 秒数,で簡単にデータを算出することができる
- データ構造がコンテナフォーマットのため,ファイルヘッダの情報が分かれば扱いやすい
- ビットレートは固定なので,ファイル容量は圧縮音声より多い
使用ライブラリ
ライブラリの候補としてPyOgg+PyOpenAL
, PySoundFile
, librosa+PySoundFile+ffmpeg
が挙がりましたが,更新頻度が高く人気のあるlibrosa
を主軸にして作成することにしました.
ffmpeg(Fast Forward MPEG)は公式よりバイナリファイルをダウンロードしてパスを通してます.
opusからwavに変換
使用するファイル:このサイトの例示ファイル(sample.opus, sample.wav
)をダウンロードしています.
- sample.opus
- 容量: 248 KB
- 標本化周波数:48000 Hz
- sample.wav
- 容量:1,146 KB
- 標本化周波数:22050 Hz
- ビットレート:352 kbps
import librosa as lr
opus_file_path = "sample_opus_files/sample.opus"
# Required ffmpeg(Fast Forward MPEG) https://ffmpeg.org/download.html
# defalt sr=22050: issue https://github.com/librosa/librosa/issues/509
data, samplerate = lr.load(opus_file_path, sr=None)
# using PySoundFile as sf
lr.audio.sf.write("sample.wav", data, samplerate)
やってることはとても単純です.たぶんライブラリが使用できるように準備するほうが時間かかります.
さいごに
今回は標本化周波数(サンプリング周波数)がopusでは,48000 Hzでwavでは,22050 Hzだったので結果の違いに焦りましたが純粋にwavデータ作ったときに標本化周波数のデフォルトが違ったのかなぁと考えています.同じ結果にしたいならsr=None
の引数を消せば同じ結果になります.
この辺りは,ここでちょろっと書いているので気になる方は見てもらえればなと・・・
変換の方法は決まったのであとは,フォルダ単位で指定すればopus2wav変換できるようにしてくれるコードを書いてお終いですね.Pythonなら余裕でやってくれそうです.
あと,今回のデータしかり,ほかのデータでもあんまり標本化周波数を気にして変換かけないだろうなぁと思うことがあります.
人間の話し声において,ナイキスト周波数は8000 Hzあれば十分なので標本化周波数が16000 Hzあれば後はあまり知覚されないので,数字で見ないと感覚ではわからないなぁと,私もよくやらかすので・・・
追記
- 2020 0903
- フォルダレベルで変換可能なツールを作ったので自身のGitHubに置いときます.