Audio Visualizer - 替音頻加上可視化特效

C.A.V.A. 是一套在 console 端把音頻視覺化的軟體,也就是可以看到聲音在畫面上的呈現。

上一篇的 利用樹莓派 + Tube-Pi 播放 Kiss Radio 廣播 已經可以透過 Tube Pi 聽廣播,
只是在播廣播的時候本地端 (console) 會一直停留在同一張圖片上 (以 KissRadio 為例),或許我們可以把它改造的好看一點?

首先要先安裝 cava

安裝 CAVA

按照 github 頁面上的的操作進行。

# 安裝依賴套件
$ sudo apt-get install libfftw3-dev libasound2-dev libncursesw5-dev libpulse-dev libtool

$ git clone https://github.com/karlstav/cava.git
$ cd cava
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

修改系統設定

因為我昨天設定的 Tube Pi 是透過 ALSA 來驅動,而作者也在 github 頁面上說明了一段關於要捕捉 ALSA output 的方式:

ALSA can be difficult because there is no native way to grab audio from an output. If you want to capture audio straight fom the output (not just mic or line-in), you must create an ALSA loopback interface, then output the audio simultaneously to both the loopback and your normal interface.

雖然我對 ALSA 也不太懂,但意思大概是要新增一個 ALSA loopback 的裝置來捕捉音訊資料,需要修改一些設定檔。

安裝 snd_aloop

$ sudo modprobe snd_aloop

再利用 aplay -l 看有沒有多出一些 ALSA loopback 的裝置。

修改 /etc/asound.conf

pcm.!default {
    type plug       # <-- no { here
    slave.pcm {
        type multi
        slaves {
            a { channels 2 pcm "hw:0,0" }  # the real device
            b { channels 2 pcm "hw:Loopback,0" }  # the loopback driver
        }
        bindings {
            0 { slave a channel 0 }
            1 { slave a channel 1 }
            2 { slave b channel 0 }
            3 { slave b channel 1 }
        }
    }
    ttable [
        [ 1 0 1 0 ]   # left  -> a.left,  b.left
        [ 0 1 0 1 ]   # right -> a.right, b.right
    ]
}

建立 /etc/modprobe.d/alsa-base.conf

options snd-aloop index=1 enable=1 pcm_substreams=4 id=Loopback

修改 /boot/config.txt

# 加入這一行
dtoverlay=i2s-mmap

然後重開機。

修改 CAVA 設定

安裝好 cava 後,設定檔會在 ~/.config/cava/config。若是沒有,也可以自己在同樣的路徑下新增,
檔案內容在 github 內的 example_files/config 有,複製貼上就可以了。

~/.config/cava/config

打開 ALSA 設定。

method = alsa
source = hw:Loopback,1

基本上這樣就可以了。設定裡還有很多選項,可以試著調整一下看看結果。修改完設定檔後,不用跳出 cava 視窗,
r 鍵就可以 reload 了。

還有一些常用的按鍵功能如下:

  • up / down:增加 / 減少靈敏度。
  • left / right:增加 / 減少 bar 的寬度。
  • f / b:改變前景 / 背景的顏色。
  • r:重新載入設定檔。
  • c:只重新載入顏色。
  • q or CTRL-C:只重新載入顏色。

如何使用

上一篇文章使用 omxplayer + streamlink 來抓取 Twitch 上的影音,但是我查了一下,似乎沒辦法單獨只抓聲音,
所以在聽廣播的同時,omxplayer 會一直播放 Twitch 上的那張圖。不過可以利用 omxplayer 的 --win 參數來把圖片縮到最小。

streamlink --twitch-oauth-token=XXXX twitch.tv/livekiss 360p --player "omxplayer -o alsa --win 0,0,1,1" --player-fifo

這樣那張圖片就會 (幾乎) 看不見。

接著,就可以執行 cava 看看是不是會有跳動的 bar 圖了。
樹莓派 + CAVA 漸層色樹莓派 + CAVA 漸層色

這裡漸層色有點奇怪,大概是在 console 的關係?換成其他 terminal 應該就會正常,不過也不錯,換成單色的也不錯。
樹莓派 + CAVA 單色樹莓派 + CAVA 單色