音声つき単語帳の単語と例文とかを切り出してランダム出題する形にしたかったのでまずsoxを使って無音部分で音声を分割しました。

これでout001.wavなどのように連番でファイルが保存されます。初めの0.3が音声の前の部分の無音の長さで、後ろの0.3が音声の後に続く無音部分の長さです。

参考

sox fails to split files – Stack Overflow


昔録った動画のアスペクト比を間違えて設定してしまってたので一括で16:9にしたかったのでやり方を調べました。

方法

とこんな感じで出来ます。ちなみにある程度新しいffmpegじゃないとちゃんと動かないので新しいのを入れましょう。あとコンテナがアスペクト比の設定に対応してないともちろんダメです。

ちなみに私はWindowsで動かしました。


ffmpegを使って複数の音声と字幕から一つの動画を作成する方法。

コマンドの解説

まず入力ソースに使う動画は一つ一つに-iオプションを付けて呼び出します。
そして-map の横についてる数字は何個目の引数として呼び込まれたか:その動画や音声のどのストリームかを表しています。そして-metadataを使って音声や字幕の言語を指定するのですがこの時に映像・音声・字幕でそれぞれ別のストリームとして言語を設定しないといけません。これがわからずにかなりの時間を費やしてしまいました…。

ちなみに-acodec copy -vcodec copyという使い方をされてる人が多いですが-c copyで一括指定できます。

知っとくと便利なこと

-t 数値で出力する長さを選べるのでちゃんと合成で来てるか確認したいだけの時は-t 180などして簡単に動画の確認だけすると良いでしょう。

ffmpegはなんでもできるし、どのOSでも使えるのに引数がめんどくさすぎるせいであまり情報がないのがもったいないですよね。
何かわからないことがあったらコメント欄で聞いてください。


sshでログインして処理の重たいコマンドを実行した後にセッションが途切れてしまうとそのコマンドをもう一度fbなどでフォアグラウンドに持ってこようと思っても残念ながらできません。違うシェルのインスタンスから立ち上げたらプロセスは別のインスタンスのシェルには持ってこれないかららしいです。

Screenの使い方

まず初めからコマンドをscreenを使って立ち上げておきましょう。

$ screen ruby it_takes_very_long.rb

そして、一旦sshの接続を切って繋ぎ直します。

$ screen -listをするとこんな感じで表示されるので

$ screen -r 31744.pts-0.Sakuraでスクリーンに繋ぎ直せば画面への出力をもう一度見ることが出来ます。

参考

Linux Screen Tutorial – YouTube


例えば foo.rbというRubyスクリプトの実行時間をシェル上で知りたかったらtime foo.rbとすればいいわけですが、残念ながらirb上ではtimeコマンドをそのまま使うことができません。

解決策

標準で用意されているBenchmarkライブラリを使えばOK.

こんな感じで表示されます。

0.750000がCPUを使った時間で0.835234が実際にかかった時間。
気にしないといけないのはCPUを実際に使ってたじかんなので前者のほうになります。

ちなみに自分の環境だと裏で動画のエンコードを走らせながらVirtualBox上のOSでやってたのでCPU使用時間の50倍ぐらい実際にかかってしまってました。

参考

Module: Benchmark (Ruby 2.1.1)

When benchmarking, what causes a lag between CPU time and "elapsed real time"? – Stack Overflow


という見たことないエラーが出てビビる。

原因と対策

原因:コミットしてない
対策:コミットする

以上!

参考

src refspec master does not match any when pushing commits in git – Stack Overflow


cygwinはWindows上で作成されたファイルを全て755の実行可能ファイルとして扱ってしまうので、そのままgitで扱うとすべてのファイルが実行可能権限を持ったなんとも危なっかしい構成になってしまいます。

対策

filemodeの変更を無視するように設定しておきましょう。

参考

Windows Git users: Please check your core.fileMode setting – Google グループ


英語の勉強にアメリカドラマから音声を抜き出して、その中のサイレンス部分を削除したかったのでやり方を調べたらffmpegsoxで簡単にできることがわかったので、その方法を紹介します。

動画から音声を抜き出す

一つの動画から音声を抜き出すときは

で抜き出せるので

フォルダごとまとめて処理するには

でフォルダ内の全ての.mp4の動画ファイルから.wavファイルが抜き出されます。-vnno videoのオプションです。

他にも-acodec copy として音声ファイルを変換せずに抜き出すこともできます。

無音部分を自動検出して削除

次に無音部分を自動的に認識して削除するのにsoxを使います。やり方によっては.wav以外も認識するようにできるようなのですが、うちの環境ではできなかったので.wavで処理をしています。

で先ほど作った.wavファイルから無音部分が全て削除されました。

wavをm4aに ffmpeg で変換

wavのままだとファイルがでかすぎるのでm4aに変換します。mp3でもいいんですが、m4aの方が圧縮効率がいいのでこちらを使います。

以上で変換終了です。

まとめ

この3行を一括変換したいフォルダにcdで移動して実行すればOKです。.wavファイルは手動で削除しときましょう。rm *.wavでもいいですが。

上記は全てcygwin上で行ってますがもちろんLinuxでもMacでも動くはずです。

参考

ffmpeg – How to remove silence part from mp3 that is extracted from tv drama – Unix & Linux Stack Exchange