取材者が動画や音声のデータをffmpegで小さくする小技集
記者会見などに取材のために参加したときには、ボイスレコーダーで音声データを録音したり、PCやスマホで動画データを録画したりします。
これらのデータはサイズが大きくなりがちです。そこから、重要な部分だけ抜き出したり、クラウドサービスにかけるためにサイズを小さくしたり、後のために保存するためにサイズを小さくしたりすることがあります。
これを、Linuxなどで動画や音声を扱うコマンドラインツール「ffmpeg」で実現する小技を紹介します。いずれも自分で普通に使っている技です。
なお、ffmpegはWindowsやMacでもインストールして使えると思います。
再エンコード
ffmpegにオプションなしで入力ファイルと出力ファイルを指定すると、再エンコードがなされます。
撮ったままの動画は圧縮効率が高くないので、これだけでかなりサイズが小さくなります。特に、スライド投影や、座って話している映像が続く動画などでは効果が大きいと思います。
反対に、再エンコードしない場合は、-c(コーデック)オプションに「copy」を付けます。
単体では意味がありませんが、以降でいくつか紹介するように、ほかのオプションを指定した場合に意味があることがあります。
指定区間を切り出し
開始時間と終了時間を指定することで、その区間の動画や音声を切り出せます。切り出すだけなら再エンコード不要です。
動画から映像のみ/音声のみを取り出す
動画から映像のみを取リ出すには「-an」(音声抜き)を指定します。「-c:v copy」(映像コーデックをコピー)も指定することで、映像の再エンコードなしになります。
反対に動画から音声のみを取リ出すには「-vn」(映像抜き)を指定します。「-c:a copy」(音声コーデックをコピー)も指定することで、音声の再エンコードなしになります。
音声をモノラルに
普通のボイスレコーダーでは、デフォルトでステレオで録音されても、あまりその効果はありません。「-ac 1」(音声を1チャンネルに)を指定して音声をモノラルにすることで、ファイルサイズが半分近くになります。
この場合は再エンコードが必要です。
音声のビットレートを下げる
音声認識などのクラウドサービスにかけたとき、ビットレートを下げても影響は小さいことが多いように思います。そこで「-b:a」(音声ビットレート)オプションを指定してビットレートを32kbpsにしてみます。
ビットレート変更なので、もちろん再エンコードが必要です。
最後に
それぞれのオプションを説明しましたが、複数のオプションを組み合わせることも、もちろんできます。たとえば、「動画のうち指定した箇所から、音声のみ、モノラルのビットレート32kbpsで切り出す」といったふうに。
ffmpegは便利です。使って楽しましょう。
SKK辞書で使われているLispの式を評価する最小限のインタプリターを実装した
日本語入力システム「SKK」の辞書には、候補文字列として、Lisp(Emacs Lisp)の式が入っている項目があります。
now /(current-time-string)/
これはEmacs上のSKK由来のもので、SKKはこの式をEmacs上で評価してから候補文字列とします。
その仕組み上、Emacs上以外のSKK実装でこれを実現するには、Emacsの代わりにEmacs Lispを処理する機能が必要です。それぞれのSKK実装では、自前で実装したり、ある程度までであきらめたりしているようです。
ちなみに、SKK公式の辞書では、いまはこれらの項目は「SKK-JISYO.lisp」という辞書に分離されてます。一部、“/”をエスケープするためだけにconcat関数を呼んでいる項目もちらほらあって、これらは「SKK-JISYO.L」などの通常の辞書に残っています。
そんな背景から、動的ライブラリとして使えるSKK辞書用Lispインタプリターを、C言語で新規開発しています。
すでに、SKK-JISYO.lispとSKK-JISYO.Lで使われている機能はすべて実装しています。反対に、それ以外の機能はほぼすべて省いた最小限の実装です。
実装方針としては、1つの式を評価して文字列を返すだけに特化して、パフォーマンスより実装の単純さを優先しています。呼び出すたびに環境を初期化するので、ガーベージコレクションもありません。
使い方は、README_ja.mdやexample/mlisj-example.cを参照のこと。だいたいこんな感じで呼びます。
char buffer[256];
int ret = mlisj_eval("(current-time-string)", buffer, 256, NULL, NULL);
さて、OSSライセンスを考えなくては。
「本当にあった紛らわしい文字」をEmacsで検知する
1年前に、「本当にあった紛らわしい文字」というエントリーで、テキストに康煕部首やCJK部首補助などがまぎれこむ問題について書きました。
私はEmacsでテキストをいじることが多いので、この問題に、mojiwarn-modeというマイナーモードを自作して対応しています。シンタックスハイライトの機能を使ってリアルタイムに該当文字の色を変える、単純なプログラム(というかほぼ設定)です。
対象となるのは、「本当にあった紛らわしい文字」で紹介した、康煕部首、CJK部首補助、縦書き用句読点、NFDの濁点と半濁点です。また、ゼロ幅スペースなどの“見えない文字”は、16進表示の四角が表示されるようにしています。
そのほかついでに、全角英数字と、「THe」のような二重キャピタライズも対象にしています。後者は、Wordのオートコレクト設定で「2文字目を小文字にする」とある奴で、勝手に直されると困るけど(「IPv6」「VMwre」「SDGs」とか)、文字色で警告するぐらいなら有用かなと。
自分以外の人の役に立つとは思いませんが、いちおうブログに書いておきます。
Linux上のVMware Workstation ProでゲストOSが異常に重くなる問題の解決
今年知ったTipsを今年のうちに棚卸しとしてメモしておきます。
私はOS環境の実験環境を動かすときに、VMware Workstation Proを使っています。ホストOSはLinux(Ubuntu)です。
ただ、ここ何年か、ゲストOSの動作がときどき異常に重くなる症状を抱えていました。
調べてみると、ホストOSのLinuxカーネルのproactive compatcion機能(メモリのデフラグのようなもの)との組み合わせで起こるようです。
これを参考に、カーネルパラメータvm.compaction_proactiveness(procfsでは/proc/sys/vm/compaction_proactiveness)に“0”を書き込んでやります。
$ sudo sysctl -w 'vm.compaction_proactiveness=0'
私はこれで症状が解決しました。
なお、永続化するほどでもないので、VMware Workstation Proを使う前に手で実行しています。
Emacsで画面行の1行だけハイライトする
Emacsで日本語テキストの文字校正のようなことをするときに、画面行の1行だけハイライトしたいと思いました。リーディングトラッカーのようなもので、よく言われる「文字校正では文章を読んではいけない」ということのためです。
現在行をハイライトするには標準ライブラリのhl-line-modeでできます。ただし、これはテキストの論理行(改行から改行まで)が対象なので、1行が長いと画面行数行がまるまるハイライトされてしまいます。
調べてみたら、毎度おなじみStack Overflowに「emacs - How to use hl-line-mode to highlight just one (1) line when visual-line-mode is enabled」というエントリーがありました。これを参考に、init.elに次のように設定しました。
(add-hook 'text-mode-hook
(lambda ()
(setq-local hl-line-range-function
(lambda ()
(save-excursion
(cons (progn (vertical-motion 0) (point))
(progn (vertical-motion 1) (point)) ))) )))
hl-line-range-function変数が、ハイライトする範囲を決定する関数を決めるものだそうです。docstringに「This variable is expected to be made buffer-local by modes」とあったので、そのとおりバッファローカル変数にしています。
これで画面行の1行だけハイライトされるようになりました。
ちなみに、このスクリーンショットでサンプルに使ったテキストは、今月2月8日に発売された「日経Linux」2023年3月号の原稿の一部です。
本当にあった紛らわしい文字
この記事は「文を紡ぎ編む人たちの Advent Calendar 2022」の3日目です。
先日、ポケモン公式ツイッターアカウントで、誤字の詫び訂がありました。
藤田ニコルさんのお名前の記載に誤りがございました。
— ポケモン公式ツイッター (@Pokemon_cojp) November 28, 2022
誤:藤田二コルさん
正:藤田ニコルさん
お詫びして訂正させていただきます。
こういう文字を目視で見分けるのって難しいですよね。
ここでは、私が実際に遭遇した、目で見つけにくい誤字の例を挙げてみます。ありがちなネタですが、日本語テキストを扱う人あるある、ぐらいのつもりでお読みいただければ幸いです。
「山」と「⼭」
前者が普通にmountainの意味で使う「山」、後者は康煕部首の文字です。Unicodeでいうと、前者がU+5C71、後者がU+2F2Dです。
詳しいことはわかりませんが、康煕部首というのはUnicodeで部首を表すための特殊な文字だそうです。
ググってみると、PDF化したときに置きかわることがあるという話がいくつか見つかりますが、なぜPDFじゃない文書に入っていたかはわかりません。
「竜」と「⻯」
前者が普通にdragonの意味で使う「竜」(U+7ADC)、後者はCJK部首補助の文字(U+2EEF)です。
CJK部首補助というのも、Unicodeで部首を表すための特殊な文字だそうです。私にはまったくわけがわかりません。
「?」と「︖」
前者は普通のクエスチョンマーク(U+FF1F)、後者は縦書き用句読点の文字(U+FE16)です。
縦書き用の句読点が普通の句読点とは別に用意されているなんて、遭遇するまで知りませんでした。「︑」や「︒」などもあるようです。
「これ」と「これ」
前者は普通に「こ」と「れ」が並んでいますが、後者はその間にゼロ幅スペース(U+200B)、が入っています。
ゼロ幅スペースの類には、ほかに分割しないゼロ幅スペース(ZERO WIDTH NO-BREAK SPACE、U+FEFF)や制御文字などがあります。
ゼロ幅スペースは、Webなどで、幅に合わせて改行される位置の調整などに使われることがあります。また、コピペされたときにわかるよう、目印としてこっそり分割しないゼロ幅スペースを入れていることもあると聞きます。コピペするときには注意しましょう。
「が」と「が」
前者は1文字の「が」(U+304C)、後者は「か」(U+304B)に結合文字の濁点(U+3099)を組み合わせたものです。
けっこう遭遇頻度の高いやつです。これについては2017年の「編集とライティングにまつわるアレコレ Advent Calendar」で書いたので、詳細は省略します。
以上、私が実際に遭遇した紛らわしい文字の話でした。こういうのは、フォントの字形や、テキストエディタの機能、チェックツールなどに頼るしかないですよね。
ダミーメールサーバーをDockerで手軽に立てる
10月7日に発売された「日経Linux」2022年11月号で、特集1「Linuxへの引っ越し引越術」の執筆に参加しました。
この中で、POP3を使っているメールクライアント(MUA)の実例を見せるために、ダミーで簡単なメールサーバーが必要になりました。おおざっぱな要件としては、POP3とIMAP4とSMTPが使えること、外にはメールが出ないこと、どのメールアドレスに出しても特定のメールアドレスに届くこと、です。
ダミーサーバーなので手間をかけずにさくっと立てようと思い、こういうのはDockerイメージにあるだろうと考えました。ぱっと調べたところ、yaasita/docker_blackhole_mail_serverというイメージが使えそうです。
というわけで、まずpull。
$ docker pull yaasita/docker_blackhole_mail_server
これを使ったDockerfileを作ります。
FROM yaasita/docker_blackhole_mail_server
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install dovecot-pop3d
RUN sed -i 's/^#disable_plaintext_auth = yes/disable_plaintext_auth = no/' /etc/dovecot/conf.d/10-auth.conf
EXPOSE 22 25 80 110 143
CMD ["/usr/bin/supervisord"]
元イメージではDovecotのPOP3サーバーが動いていないので、パッケージと設定を追加しています。
イメージをビルドして実行します。
$ docker build -t oreore/bms .
$ docker run -d -p 25:25 -p 110:110 -p 143:143 -v /tmp:/tmp --rm oreore/bms
これで、POP3とIMAP4のアカウントmailuser:mailuserと、SMTP認証なしでアクセスできます。
なお、元イメージがわりと古いので、インターネットに出さないで使うのがよいと思います。