パソコンでエロいことをする時に欠かせないものといえば
ffmpeg です
最近
こういうシリーズをやっていて、音声の生データを機械学習に食べさせるのに色々めんどくさいことをやっていた
今まではこうやってた
エロ動画 -> wav ファイル -> numpy.ndarray という変換をずっとやってた
# wav ファイルを作る
input_stream = ffmpeg.input('input.mp4', ss=start, t=duration)
output_stream = ffmpeg.output(input_stream.audio, 'tmp.wav', ar=16000, ac=1)
ffmpeg.run(output_stream, overwrite_output=True)
try:
# int16 の numpy.ndarray で読み込む
sample_rate, wav_data = scipy.wavfile.read('tmp.wav', 'rb')
wav_data = wav_data / tf.int16.max # int16 -> float64
finally:
# 読み込んだら消す
os.remove('tmp.wav')
こうすると wav ファイルの書き出しがいらない
エロ動画 -> numpy.ndarray という変換になり、中間ファイルがいらない
# stdout に音声の生データを書き出し、それをキャプチャする
input_stream = ffmpeg.input('input.mp4', ss=start, t=duration)
output_stream = ffmpeg.output(input_stream.audio, '-', format='s16le', acodec='pcm_s16le', ar=16000, ac=1)
wav_data, _ = ffmpeg.run(output_stream, overwrite_output=True, capture_stdout=True, capture_stderr=True)
# キャプチャした音声の生データを numpy.ndarray にする
wav_data = np.frombuffer(wav_data, dtype=np.int16)
wav_data = wav_data / tf.int16.max
実行速度も速くなった
ディスクアクセスが減ったからだと思う
まとめ
エロい男は ffmpeg 使いが上手ということですね。