英語の勉強にアメリカドラマから音声を抜き出して、その中のサイレンス部分を削除したかったのでやり方を調べたらffmpegとsoxで簡単にできることがわかったので、その方法を紹介します。
動画から音声を抜き出す 一つの動画から音声を抜き出すときは
ffmpeg -i input.mp4 -vn output.wav で抜き出せるので
フォルダごとまとめて処理するには
find . -name '*.mp4' -exec ffmpeg -i '{}' -vn '{}'.wav ';' でフォルダ内の全ての.mp4の動画ファイルから.wavファイルが抜き出されます。-vnが no videoのオプションです。
他にも-acodec copy として音声ファイルを変換せずに抜き出すこともできます。
無音部分を自動検出して削除 次に無音部分を自動的に認識して削除するのにsoxを使います。やり方によっては.wav以外も認識するようにできるようなのですが、うちの環境ではできなかったので.wavで処理をしています。
find . -name '*.wav' -exec sox '{}' '{}'_remove_silence.wav silence 1 0.1 1% -1 0.1 1% ';' で先ほど作った.wavファイルから無音部分が全て削除されました。
wavをm4aに ffmpeg で変換 wavのままだとファイルがでかすぎるのでm4aに変換します。mp3でもいいんですが、m4aの方が圧縮効率がいいのでこちらを使います。
find . -name '*_remove_silence.wav' -exec ffmpeg -i '{}' '{}'.mp3 ';' 以上で変換終了です。
まとめ この3行を一括変換したいフォルダにcdで移動して実行すればOKです。.wavファイルは手動で削除しときましょう。rm *.wavでもいいですが。
上記は全てcygwin上で行ってますがもちろんLinuxでもMacでも動くはずです。
find .
何故動かないか結構困ったのでメモ。
動かないもの find . -name '*.mkv' -exec bash -c 'echo "{}"' \; cygwin 環境、というかcmd.exeでcygwinの中のfindコマンドを呼び出してるとこれはエラーになっちゃいます。
理由 何故ならfindの\;の\は;をエスケープする役割なので、当然ここにはエスケープキャラクターを入れて置かなければならないわけですが、Windowsのcmdにおいて\はパス区切りであって何もエスケープしてくれません。
なのでcygwinのfindをcmd.exeやnyaosなどのWindows環境のシェルから使うときはcmd.exeのエスケープキャラクターの^を使ってこんなふうに書きましょう。
find . -name '*.mkv' -exec bash -c 'echo "{}"' ^; もしくはどちらの環境でも使える方法の
find . -name '*.mkv' -exec bash -c 'echo "{}"' ';' を使うのもいいかもしれません。
今まではcygwinをインストールしたディレクトリを全部SugarSyncで同期して使ってたんだけど、
よくわからないままに色々入れてたら700MBぐらいあったので整理整頓することにしました。
どうするか? 既にインストールされてるcygwinのファイルを整理するのはめんどくさかったの新規インストールをすることにしたのはいいけど、何せパッケージ選択がめんどくさい。めんどくさいっていうか手動でやると必ず忘れてしまうので自動化したい。
そこでコマンドラインインストールの登場です!
インストール方法 setup-x86.exe --quiet-mode -P util-linux,curl,wget,openssh,rsync,zip,tree -s ftp://ftp.iij.ad.jp/pub/cygwin/ --root %USERPROFILE%\cyg --local-package-dir %USERPROFILE%\cyg これでホームディレクトリ直下の C:\Users\ironsand\cygとかにインストールされる。
やめたパッケージ gccとか入れてcygwinでコンパイルして色々してると毎回ドツボにハマるので、もうそういうのはVirtualBox上のUbuntuですることにする。
rubyやpythonはWindowsのネイティブパッケージを使う。結局なんだかんだでそれが一番安定してる気がするので。
gitもcygwin用のパス名周りのエラーが鬱陶しくなることがちょくちょくあったのでChocolatey使ってcinst gitでインストールする方法に変更。
注意点 何故か 64bit バージョンは動きませんでした。理由はわかりませんが、こういう関係のソフトは32bit版のほうが今はまだ安定してる気がするし大量にメモリ使うこともないので気にしないことにします。
sshだとsshコマンドはインストールされないのでopensshを指定しましょう。
インストール後に/etc/passwdのホームディレクトリ設定を/home/usernameからcygdrive/c/Users/usernameとWindowsのホームフォルダに変更しておくとsshとかのコマンドの時に設定ファイルを自動的に読みに行ってくれるので便利。便利というかしないとちゃんと動かない。
あと環境変数にset HOME=%USERPROFILE%もどこかに仕込んでたほうが良いかも。
Util-Linux 何故かカレンダー表示のcalコマンドが見つからなかったので探してみたら、calのみのインストールはないらしい。
とりあえずutil-linuxが良さそうなんでこれを使う事にした。
tree Windows由来のコマンドなのにWindowsのtreeコマンドは階層指定もできない残念仕様なのでcygwinのを入れました。tree -L 2とかで階層指定できる。便利!
/var/www配下のパーミッションをどうすべきかについて情報が錯綜してて困ったので自分なりに調べたことをまとめておきます。
サーバープロセスが直接ファイルの変更を行うか、複数人管理かがどうかで結構変わるのでめんどくさくなってるみたいですね。
まとめ サーバープロセスがファイルの変更を行わず、sudo可ユーザーのみが変更 `/var/www` 以下は全て `root:root` 理由:apache, nginx などのプロセスが乗っ取られてもroot権限がないと改変できないため サーバープロセスがファイルの変更を行わず、sudo不可のユーザーも変更 `/var/www/site` を `ftp-user:root` に。 複数ユーザーがFTPでアクセスして書き込み権を持つなら `ftp-user:ftp-user`で適当にユーザーをグループに追加 サーバープロセスがファイルの変更を行う(WordPressなど)、 `/var/www/site` 以下の必要なフォルダ、ファイル_だけ_を `ftp-user:www-user` にして サーバープロセスのユーザーをwww-userに追加、apache所有には_絶対にしない_。
文字幅をしるために全角=2,半角=1で文字サイズが取得したかったので
やり方 "日本語とEnglish".each_char.map{|c| c.ascii_only? ? 1 : 2}.inject(:+) Rubyばんざーーい!
参考 [2013/02/20/Rubyで全半角混在文字の文字幅を計算する方法 – ヽ(´・肉・`)ノログ][1]
db/seeds.rbにUser.createでencrypted_passwordを与えてDeviseのユーザーを作ろうとしたら失敗した。
原因 passwordが存在しないためにvalidationに引っかかってしまってる。
対策 passwordを平文で打てば解決するらしいけど、平文のパスワードは使いたくないのでバリデーションの方を無効化してしまいましょう。
User.new(email: someone@example.com).save(validate: false)
でOKです。encrypted_passwordの取得方法は色々あるでしょうが、自分の場合は一度Deviseで作ってからそれをrails console使ってUser.first.encrypted_passwordを取ってきました。
参考 [Cannot create Devise account using rake db:seed for Rails 3.0 – Stack Overflow][1]
/usr/bin/env: ruby.exe: そのようなファイルやディレクトリはありません
というエラーがwheneverで作ったcronのログとして出てきて困ってた。
bin/railsの実行権限とか/usr/bin/env ruby --version でちゃんとrubyが動いてるかどうか確認したりとか色々。
答え Windowsで作ったRailsプロジェクトだったので ruby<strong>.exe</strong>になってた。なんてことだ…。
解決策 bin/railsの一行目usr/bin/env ruby.exeの.exeを削除しておきましょう。ふぁっく。
mapcar で perform-string を使って文字列置換しようと思ってかなりハマったのでメモって置きます。
ダメな例 (mapcar '(lambda (s) (goto-char (point-min)) (perform-replace s "" nil t t nil)) '("foo[0-9]" "bar[0-9]")) これだと “foo1 bar2” は削除できるけど “bar2” と2個めの検索要素だけしかないときに削除できない
良い例 (mapcar '(lambda (s) (goto-char (point-min)) (perform-replace s "" nil t t t)) '("foo[0-9]" "bar[0-9]")) perform-replaceの最後の引数NOERRORをtに設定しておけば該当する文字列がなくてもスムーズに次に進んでくれます。
phantomjs でzipファイルをダウンロードしたかったけど、ダウンロードオプションはまだ本体には取り込まれてないようなのでheadlessなChromeかFirefoxをVPSに入れて幸せな自動化処理生活を送ろうと思ったら全然うまく行きませんでした。
俺の苦労を返せ!
やったこと めんどくさいので説明は最低限で。
FirefoxとChrome、それにSelenium Webdriverで使うためのChromeDriverをインストール
apt-get install git unzip xvfb echo 'deb http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu precise main' >> /etc/apt/sources.list echo 'deb-src http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu precise main' >> /etc/apt/sources.list apt-get install firefox wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list apt-get install google-chrome-stable wget http://chromedriver.storage.googleapis.com/2.9/chromedriver_linux64.zip unzip chromedriver_linux64.zip mv chromdriver /usr/local/bin この時点で
Xvfb :1 & export DISPLAY=:1 firefox すればFirefoxが立ち上がるはずだけどエラーが出てうまくいかない。
色々と検索してみるけど結局エラーを除去する方法は見つからず。
Rubyとか こちらはRubyを入れてselenium-webdriverを入れるまでのよくある感じのインストールメモ。DigitalOcean上のUbuntuにrootでログインしてそのままやってます。
apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6 libreadline6-dev zlib1g zlib1g-dev git clone https://github.