YouTube動画をダウンロードして無音部分をカットしたオーディオデータにして聞く

オープンソースカンファレンス2022 Online Springに参加しました．

オープンソースカンファレンス2022 Spring

ビデオミーティングソフトウェアのZoomとYouTube Liveを使っています．セッションは複数トラックあって同時に参加するのは難しいです．ほとんどのセッションは後日YouTubeで公開されますが，YouTube Liveの動画をリモートのサーバで録画しておいたのでこれをスマートフォンで移動中などに聞けるようにしてみました．

OSPN.jp – YouTube

YouTubeの動画ダウンロードにはyoutube-dlやyt-dlpが便利です．セッション毎に起動しておきました．

$ youtube-dl ${URL}
$ yt-dlp ${URL}

youtube-dl

yt-dlp/yt-dlp: A youtube-dl fork with additional features and fixes

linux:video_download [wiki.matoken.org]

今回ダウンロードした動画はvp9+aacのようです．

$ ffprobe -i ./YOUTUBEFILE.mkv 2>&1 | grep ^Input -A99
Input #0, matroska,webm, from './YOUTUBEFILE.mkv':
Metadata:
HTTP://YOUTUBE.COM/STREAMING/OTF/DURATIONS/112015: Segment-Count: 6109
: Segment-Durations-Ms: 5067,5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),506
:
:
ENCODER : Lavf58.20.100
Duration: 08:35:50.04, start: 0.000000, bitrate: 551 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709/unknown/unknown), 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Metadata:
DURATION : 08:35:49.996000000
Stream #0:1(eng): Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
HANDLER_NAME : ISO Media file produced by Google Inc.
DURATION : 08:35:50.040000000

ffmpegで音声だけを抜き出してみます．

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -acodec copy ./YOUTUBEFILE.aac

元ファイルが2GBほどに対して500MBほどのファイルになりました．
ちょっと大きいのでコーデックをopusに変更してみます．

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -acodec libopus -b:a 64k ./YOUTUBEFILE.opus

213MB程になりました．
これをローカルにダウンロードして再生してみるとセッション間の無音部分が気になります．無音部分をカットできないかなと探すと，ffmpegのフィルタにそれらしい silenceremove というフィルタがあったので試してみました．

FFmpeg Filters Documentation

とりあえずexampleを真似して，先頭から最後までの間の1秒以上の無音部分をカットします．ついでにビットレートも32kに下げました．

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB -acodec libopus -b:a 32k ./YOUTUBEFILE.opus

動画ファイルの長さが 08:35:50.040000000 から 07:55:03.66 になりました．ファイルサイズは107MB程です．

ついでにもう少し低いビットレートも試しました．

ビットレート | 容量

32k

107324kB

24k

82484kB

16k

56380kB

少し聞いた感じでは16kでも問題無さそうな感じです．大本のZoomが確か24kなので24k以上はあまり意味がない気がします．

追記)高音質化機能があるようなので動画によって変わりそうです:

High Fidelity Audio mode – Windows, macOS
This option in Advanced Audio enhances “Original Audio” mode, allowing for disabling echo cancellation & post-processing, while raising audio codec quality to 48Khz, 96Kbps mono/192kbps stereo for professional audio transmis
sion in music education and performance applications. Professional audio interface, microphone, and headphones required.

— Release notes for September 1
2020 – Zoom Support https://support.zoom.us/hc/en-us/articles/360048388632-New-Updates-for-September-1-2020

ということで他のセッションも同様に変換してAndroidスマートフォンに転送してVLCで1.5倍再生してみて画面スリープで再生できるのを確認しました．これで空き時間に聞けるようになりました :)

応用としてYouTubeのRSSから動画をダウンロードして音声のみにしてその音声をRSSに埋め込んで公開するとPodcastアグリゲーターで購読できるので便利かもしれません．人の動画を勝手に一般公開するとまずいでしょうが．

関連URL

YoutubeLiveを細い回線で「聴く」 – Speaker Deck

環境

$ youtube-dl --version
2021.12.17
$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W ffmpeg
ffmpeg 7:4.1.8-0+deb10u1
$ lsb_release -dr
Description: Debian GNU/Linux 10 (buster)
Release: 10
$ arch
x86_64