秘密録音した音声ファイルをYoutubeにバックアップ

私はパワハラ対策として、毎日ICレコーダーを使って秘密録音を実施している。 ただ、毎日10時間を超える録音時間のため、32kbpsで録音しても1日あたり200MB弱の音声ファイルがHDDに追加されていき、HDDの容量を圧迫していく。

そこで、バックアップを兼ねて動画化してYoutubeにアップロードするようにし、 HDDの空き容量が減ってきたらオリジナルの録音ファイルを消去していくことにした。

ffmpegを使い、以下の手順で実施する。

  1. 適当に画像ファイルを作成する
  2. 画像ファイルから無音声の動画ファイル(再生時間24時間)を作成する
  3. 無音声の動画ファイルと、毎日録音した音声ファイルを結合する
  4. 結合した動画ファイルをYoutubeにアップロード

具体的には、適当にblank.pngという名前で640x480とか好みのサイズで画像を作成し、以下のコマンドで24時間の無音声動画ファイル(blank24.mov)を作成。

ffmpeg -y -loop 1 -r 1 -i blank.png -t 86400 blank24.mov

これでフレームレート1 fps、動画時間が24時間(86400秒)の無音声動画ファイルblank24.movができる。 私の環境では5分程度かかったが、このファイルは1度作っておけば何度でも使えるので、最初の1回だけ待てば良い。

次に、この無音声の動画ファイル(blank24.mov)と、録音した音声ファイル(input.mp3)を結合する。

ffmpeg -y -i blank24.mov -i input.mp3 -vcodec copy -acodec copy -shortest output.mov

-shortestオプションを加えているので、24時間のblank24.movと音声ファイルの時間のうち、短い方の時間でoutput.movが作成される。

動画になったことにより、元のMP3ファイルよりもファイルサイズが1割ほど増える。 私の環境では12時間程度録音したものからでも1分程度のエンコード時間で動画ファイルを作成できた。

ちなみに出来上がりの動画ファイルのコンテナがMOVなのは、録音した音声ファイルの拡張子が、 ICレコーダーで録音したMP3、Androidの録音アプリのmp4、iPhoneの録音アプリのm4aと3種類あったため、 それと競合しないコンテナ形式を選んだ。

また、無音声動画ファイル(blank24.mov)を作成せず、1コマンドで静止画と音声ファイルを結合することも可能だが、 都度動画部分のエンコードが発生するため時間がかかる。

毎日音声ファイルが増えていくような状況では、予め無音声動画ファイルをつくっておき、 -vcodec copyとすることで再エンコードを省略すれば、毎日の処理が高速化できる。

ただし、Youtubeの制限により、15分の制限を解除したアカウントでも、動画の最長時間は12時間に制限される。 したがって、私は以下のようなシェルスクリプトを書いて実行している。

#!/bin/bash

find ./ -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.m4a" | while read i
do
  hour=`ffmpeg -i "$i" 2>&1 < /dev/null | grep Duration | sed -E "s/.*Duration: (.*):.*:.*, start:.*/\\1/"`
  if [ $hour -lt 12 ]; then
     # 12時間以下
      output=${i%.*}.mov
     if [ ! -f "$output" ]; then
        ffmpeg -y -i ./blank24.mov -i "$i" -vcodec copy -acodec copy -shortest "$output" < /dev/null
     fi
     else
     # 12時間以上の場合は11時間で分割
     output1=${i%.*}_001.mov
     output2=${i%.*}_002.mov
     if [ ! -f "$output1" ]; then
        ffmpeg -y -i ./blank24.mov -i "$i" -vcodec copy -acodec copy -shortest -t 11:00:00 "$output1" < /dev/null
     fi
     if [ ! -f "$output2" ]; then
        ffmpeg -y -i ./blank24.mov -ss 11:00:00 -i "$i" -vcodec copy -acodec copy -shortest "$output2" < /dev/null
     fi
  fi
done

事前に音声ファイルのDurationを調べておき、12時間以上ならば最初の11時間とその後の部分に分割するようにした。

このシェルスクリプトとblank24.movを同じディレクトリに置いて実行すると、 カレントディレクトリ以下の*.mp3、.mp4、.m4aファイルが、動画として*.movファイルに保存される。

あとは出来あがった*.movファイルをYoutubeにアップロードして待つだけ。

できればアップロードも自動化したかったが、OAuth2に対応する必要があるため、シェルスクリプトでは難しそう。

アップロードした動画は公開してもいいことはないと思うので、非公開にするのを忘れずに。

たまたま録音した環境のBGMに著作権のある楽曲が入ってしまったりすると弾かれてしまうが、 その時はあきらめてそのファイルだけ別のオンラインストレージサービスにでもアップロードしておけば良いと思う。

クラウド上にデータがあるので、急遽証拠として音声を提示する必要が出たときにも対応できる。 そのような機会がないことを願っているが。


Jun. 1 2016 追記

1年間、出勤日に録音→Youtubeにアップロードを運用してみた結果、音声ファイルで38.3GBになった。 上記の動画化を行なって40GBほどの映像をYoutubeにアップロードしたことになるが、今のところ問題なし。