ffmpegで音声ファイルを動画に変換する

## はじめに

ものすごく遅くなりましたがこの記事は[日本音響学会 学生・若手フォーラム Advent Calendar 2023](https://qiita.com/advent-calendar/2023/asj-fresh) の 4 日目の記事です．
[日本音響学会 学生・若手フォーラム](https://asj-fresh.acoustics.jp)ではホームページの管理などを担当しています．

## こんな人におすすめ

- 学会発表やデモで音声ファイルを聞かせたい
- しかし音声ファイルをただ載せるだけでは味気ない…
- コマンドラインからサクッと音声ファイルを動画に変換したい

## 準備

[ffmpeg](https://ffmpeg.org) をインストールしてください

## コマンド

```bash
ffmpeg -i <input> -filter_complex "showspectrum" <output>
```

### 解説

- `<input>`:
  - スペクトログラムの動画ファイルに変換したい元になる音声ファイルのパスです．
  - wav や mp3 など一般的な音声ファイルのフォーマットであればおよそよしなに対応してくれます．
- `<output>`:
  - 出力結果の動画ファイルのパスです．
  - mov や mp4 など一般的な動画ファイルのフォーマットであればおよそよしなに対応してくれます．
- `-filter_complex`:
  - `<input>` をどのような動画に変換するかを指定するオプションです．
  - 今回は `showspectrum` を指定することでスペクトログラムにしています．
  - 他にも様々なオプションがありますが詳細は [公式ドキュメント](https://ffmpeg.org/ffmpeg-filters.html) や [参考資料 1](https://looooooooop.blog.fc2.com/blog-entry-1098.html) をご覧ください．

### 実行例
筆者がよく使う設定の一例を示します
- 1ch の wav ファイル
  ```bash
  ffmpeg -i input.wav -filter_complex "showspectrum=slide=1:mode=separate:color=plasma:scale=log:saturation=1:legend=0" output.gif
  ```
  ![mono_spectrum.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/655ed61c-3381-0869-95e8-2c0add2322ec.gif)
- マルチチャンネル の wav ファイルをチャネルごと分割表示
  ```bash
  ffmpeg -i input.wav -filter_complex "showspectrum=slide=1:mode=separate:color=plasma:scale=log:saturation=1:legend=0" output.gif
  ```
  ![multi_spectrum.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/7cc9b24d-c7e0-ec01-bac3-8bcd5005e8b9.gif)


#### おまけ

- 定 Q 変換
  ```
  ffmpeg -i multi.wav -filter_complex "showcqt" multi_cqt.gif
  ```
  ![multi_cqt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/72486d01-f7fd-c6d4-7f92-eb16a3c5751a.gif)
  - ピアノロールみたいになります
- 連続ウェーブレット変換
  ```
  ffmpeg -i multi.wav -filter_complex "showcwt=mode=channel" multi_cwt.gif
  ```
  ![multi_cwt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/b524baf8-9700-3ece-9ad0-5e56e223070d.gif)
  - いわゆるスカログラムです
- スペクトラム
  ```
  ffmpeg -i multi.wav -filter_complex "showfreqs=mode=bar" multi_freqs.gif
  ```
  ![multi_freqs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/aee3ab13-b10b-5a09-ef94-3a26f9744cbf.gif)
  - 昔のコンポとかで見かけるアレです
- 空間相関（？）
  ```
  ffmpeg -i multi.wav -filter_complex "showspatial" multi_spatial.gif
  ```
  ![stereo_spatial.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/a7f954e9-66ee-c4fd-fd42-5743ae9e2875.gif)
  - 今まで見たことないです，いつ使うのかよくわかりません…
- ボリューム
  ```
  ffmpeg -i multi.wav -filter_complex "showvolume" multi_volume.gif
  ```
  ![multi_volume.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/5661fc9e-2599-6b05-9eae-a56de1cfc95e.gif)
  - ミキサーのインジケータみたいでかわいいです
- 波形
  ```
  ffmpeg -i multi.wav -filter_complex "showwaves=split_channels=1:mode=line" multi_waves.gif
  ```
  ![multi_waves.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176459/5e907c3d-e420-315c-96c1-68a69dff4826.gif)
  - よく見かけます

## 参考資料

1. [音声波形を表示する showspectrum, showwaves の使い方 - ニコニコ動画研究所](https://looooooooop.blog.fc2.com/blog-entry-1098.html)
   - `showspectrum`, `showwaves` の具体例がたくさん紹介されています
2. [ffmpeg でスペクトログラムの動画出力 - shingoushori's dialy](https://shingoushori.hatenablog.jp/entry/2018/03/04/001806)
3. [それ FFmpeg で出来るよ！ - Qiita](https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8)