音楽ファイルの形式をまとめて変えるスクリプトを書いた

いつもどおり記事タイトルが訳わかんねーな

 

前回の音楽ファイルの取り扱いを考えるで書いた、tak+cueで保存しているデータをmka(cue+flac+jpeg)みたいな感じで保存し直すスクリプト。

全部Windows batchで書こうとしたんだけど、正直言って触れば触るほど訳わかんなくなって(Windows batch死ね)全然無理だったので、win-bashを使ってWindowsの上でbashなシェルスクリプトとして書いた。

それでも引数処理が面倒だったのと、D&Dで実行出来ないため、シェルスクリプトを呼び出すためのWindows batchを書いたりして大変アレ。まぁ目的は達成出来ているのでおkでしょ。

 

・make_mka.bat

@echo OFF

:LOOP
if "%~dpnx1" == "" goto END
echo Input: %~dpnx1
set in="%~dpnx1"
set sc="%~dp0make_mka.sh"
set pt="%~dp1"
bash %sc% %in% %pt%
echo;
shift
goto LOOP

:END
echo all jobs were completed.
timeout /t -1

・make_mka.sh

in_cue=`cat "$1" | nkf -Sw`
cd "$2"

echo Generating xml file...
echo \<Tags\>\<Tag\> >temp.xml
echo "$in_cue" | grep DISCID
if [ $?==0 ]; then
echo \<Simple\>\<Name\>DISCID\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep DISCID | awk '{print $3}' >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo "$in_cue" | grep DATE
if [ $?==0 ]; then
echo \<Simple\>\<Name\>DATE\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep DATE | awk '{print $3}' >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo "$in_cue" | grep GENRE
if [ $?==0 ]; then
echo \<Simple\>\<Name\>GENRE\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep GENRE | awk '{print $3}' >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo "$in_cue" | grep TITLE
if [ $?==0 ]; then
echo \<Simple\>\<Name\>TITLE\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep TITLE | awk 'NR==1' | sed -e s/TITLE.\"// -e s/\"// >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo \<Simple\>\<Name\>TOTAL_PARTS\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep -G 'TRACK.[0-9]\+' | awk 'END{print $2}' >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
echo \</Tag\>\</Tags\> >>temp.xml
out_cue=`tr -d '\n' < temp.xml`
echo "$out_cue" >temp.xml
echo

echo converting from tak to flac...
tak=`echo "$1" | sed -e s/cue$/tak/`
wav=`echo "$1" | sed -e s/cue$/wav/`
takc -d "$tak"
flac=`echo "$tak" | sed -e s/tak$/flac/`
ffmpeg -i "$wav"  "$flac"

echo

echo muxing...
mka=`echo $tak | sed -e s/tak$/mka/`
path=$(echo "$2")cover.jpg
mkvmerge.exe -o "$mka" "$flac" --attachment-mime-type image/jpeg --attach-file "$path" --chapters "$1" --global-tags temp.xml

echo cleaning...
rm temp.xml
rm "$flac"
rm "$wav"

echo "$1"

 

細かい動作の流れや仕組みはコードを見てもらうとして、以下コメント。

make_mka.batでは引数が複数あっても(複数D&Dされても)動作しそうに書いてあるけど、これは最初の妄想のままであって、これが実際に動作はしない。あっはっは。アルバムアートのファイル名とかを多少手直しすればいけそうな気もするけど、この状態で手持ちのデータは全部処理しちゃったのでもういっかな。

mkvmergeはcueシートを元にmkaのチャプターを切ってくれる(トラック情報を反映してくれる)っぽいので凄いじゃんと思ったら、アルバムタイトルとか総トラック数とかDISCIDとかを反映してくれなかった。これはどうやらChapterではなくTagという扱いみたい。それらしいxmlを読み込んでやると反映してくれるので、それらしいtemp.xmlを生成する部分が殆どを占めてるね。

sedやawkを使ってcueから情報取り出してるけど、bashでcueシートのパースとかやってる人が見当たらなかったのでてきとうに書いた。

それから、cueシートの読み込み(make_mka.shの1行目)で、cueシートにアルファベット以外が含まれていると文字化けして適切に情報が取り出せなかった(トラックタイトルはChapter扱いなのでmkvmergeがよしなにしてくれていたけど、アルバムタイトルはTag扱いなのでxmlから拾うため)ので、win-bashらへんに含まれていなかったnkfを別に入手して使った。

tak->flacを直接ffmpegでやるとうまくいくデータとうまくいかないデータがあった(原因はよくわかんない)ので、まずtak公式のtakcでtak->wavとデコードしてから、ffmpegでwav->flacしてる。flacへのエンコードも公式のエンコーダ使えばいいじゃんって今思ってる。

 

全体的に、

・文字のエスケープの区別(パス、ファイル内、ダブルコーテーションやシングルコーテーション、記号)がちゃんと理解出来てない

・sedやawkを使った文字列加工がかなり手探りで汚い(かといって修正する気になる訳じゃない)

取り敢えず書くか~みたいな感じでずっと書いてるので、そろそろ綺麗にする努力とかすればいいじゃんね、といった気持ちではあるけど、面倒なもんは面倒なのさ。後から手を入れる予定も無いから別に糞コードでもいいだろ、みたいな。

音楽ファイルの取り扱いを考える

昔採用した方法をそのまま使っていて、なんだかアレだし、そろそろ音楽視聴の環境を変えようと思っているので、ファイル管理についても考えてみる。

 

現状:moraよりのダウンロード購入、CD媒体で購入したものが入り乱れている

ダウンロード購入はトラック単位で買えたりするので、インストは不要とか、カップリングが不要とか、アルバムで買う時重複してるから不要とか、そういう時に重宝する。

一方、CD媒体で購入するのは、それはそれで物欲を満たすことが出来るし、ダウンロード販売を行っていないCD(同人CDまさしく)ではこういう事しか出来ない。

それぞれの保存状態は、

・ダウンロード購入したもの
mp4形式(aac+mjpeg)
メタタグあり
mjpegがアルバムアート

・CD媒体で購入したもの
tak+cue
メタデータはcueシートで管理

takを選択しているのに特にこだわりはないけれど、使っているfoobar2000がデフォルトではtakには対応していない(プラグインで対応)ので、ちょっとなぁといった気持ち(その気持ちのまま何年も放置)。Walkmanではデフォでそのまま再生できるしFLACに変えようかなと思ったり思わなかったり(あやふやなのは手持ちのWalkmanがヘボいため)

理想は、
・ロスレスで保管(DAPでそのまま再生出来れば尚良しだが妥協も可)
・メタタグつけとく
・アルバムアートもつけとくと再生するときかっこいい

実際takにはアルバムアートくっつけれるが、foobar2000で素直にtaggingからアタッチしようとするとcueシートにくっつけようとしちゃって、失敗する。

それから、takにくっつけても、cueシートから読み出しているので、表示されない。tak+cueと同じフォルダにcover.jpgみたいな名前で配置しておけば表示される。ただしそこから切り分けたりエンコードしたりして出来上がったファイル(DAPに入れたいもの)にはアルバムアートはついてない。cueシートにはそもそもアルバムアートに関する情報を記録出来なさそうだな。

つまり、cueシートでの管理をやめるという話になる。埋め込むという方向で考えていくと、mkaとかどうよ、という気持ちに。

cue+flacで1ファイル管理出来るし、アルバムアートだって放り込めるはず。

という訳でテスト。

1.takを単体でfoobar2000に放り込みflacへコンバート
2.cueシートをコピーしてFILEの記述をtakからflacへ
3.MKA変換機にcueシートを読み込む(ついでにcover.jpgも放り込んでおく)
4.mkaデータを作成する
5.出来上がったmkaをfoobar2000に放り込む
6.曲単位でflacへとコンバートしてみる
7.x-アプリに登録してみる
8.Walkmanに転送してみる

だいぶ行程が長いけれど、おおよそ目論見通りの動作が得られた。

ただし、MKA変換機を通した段階で、アルバムタイトルがいなくなる事があった。cueシートにはTITLE枠で入っていたはずなのだが、ちょっと理解が足りないな。

MKA変換機が使えない環境(非Windows)でも、出来上がったmkaの情報を見るに、mkvmergeというツールで作成されたようなので、コマンドラインにどういうオプションを渡しているのかが解明出来れば、どの環境でも使えるようになるなといったところ。

まだちょっと調整というか理解というか調査というか、しないといけないけど、これで良さそうだな。

 

 

まとめ。

・mka(cue+flac)で1CD1ファイルの形で固めていく

・アルバムアートもつける

・mkaに固める時にはmkvmergeを使えば良さそう

・foobar2000で再生出来るし、トラック単位でflacにコンバートしても情報は失われない

・tak->flac、cue+flac+jpg->mkaはそれぞれコマンドラインで出来そうなので自動化も出来そう

・ただしMKA変換機がcueシートの中身をちゃんと読んでいるっぽいので、cueシートのパースが必要になるかも?

moraでダウンロードしたみたいなデータを自分で作る

一体何を言っているんだといった感じだ…

 

moraでダウンロードしたデータは、

・トラック毎に1ファイル

・メタデータがちゃんと入ってる

・ジャケット画像もちゃんと入ってる

一方、自分でCDからリッピングしたデータは、tak+cueで保管しているので、

・ディスク単位で1ファイル

・メタデータはcueに入っている

・ジャケット画像なんてある訳ない

 

という訳で、こういうデータを自分で作ってやる。

 

今回使うのは癒やし系と名高いStylipSのChoos me♡ダーリン。

爆笑の安さである。StylipSに恨みでもあるのか。まさかゆいかおりが悪いとでも言うのかね??

 

tak+cueで保管していたけど、Walkmanにインポートする時にmp3にエンコードしていて、なんだか面倒だったのでこのmp3データを使う。ジャケットは適当に画像検索して拾ってきた。

 

ひとまず試しにやってみる。

$ ffmpeg -i cmd.mp3 -i cover.jpg -vcodec mjpeg cmd.mp4

foober2000でジャケット画像が拾えるかどうかでチェック。結果は失敗。動画プレイヤーでも再生できない。なんなんだ。

 

調べ回ったけど、なんだかffmpegじゃ出来ないみたいだ。2段階に分けて作業する。

1.音声をm4aにする

2.ジャケット画像を突っ込む

mp4じゃなくてm4aにしてるのは、これなら明示的に音声だよってアピール出来るかなーってだけ。Androidでは拡張子がかなり重視されていて(無視されるなら拡張子の存在意義が問われるところだけど)、どんなアプリで開くかの自由度が結構キツイので、音声風味な拡張子にしておきたい。

という訳で作業。

$ ffmpeg -i cmd.mp3 -acodec libfdk_aac cmd.m4a
$ AtomicParsley cmd.m4a --artwork cover.jpg

なんだかどこの情報でも「temporaryなデータが出力されます」で記述が終了していて(公式のドキュメント嫁)、最終ファイルはどう処理するんだ…って思ったけど、foobar2000ではちゃんと表示されたし、Xperia(SO-02G)のミュージックアプリでもきちんと動いた。Walkmanもあった(NW-F805)のでx-アプリを通してインポートしたけどこれも成功。iPadはあるけどiTunesを起動したくなかったので見送り。

–overWriteってオプションを追加しておけば上書きされるので変な名前のファイルが作成されて混乱する事もないでしょう。

 

AtomicParsleyはArchLinuxなら普通にパッケージがあるのでこれをインストールした。Windowsにバイナリが有るかは確認してない。

 

takからエンコードすればmp3→aacの2重エンコードの気持ち悪さもなんとかできるでしょう。

 

また内容の薄い記事になってしまった。しょうがないな。うん。

 

 

しかし中古で買ったNW-F805だけど、イヤホンジャックがガバガバ過ぎて使い物にならん。SO-02Gで聞いたりNW-F805で聞いたりノートパソコンで聞いたり、有線で聞いたりBluetoothで聞いたりと、全く安定しない状況だが、何とか出来ないものかと…

以前DAP自作を画策していた頃があったけど、これをまた考えてみるかなー。

LightDMのwebkit2なgreeterの時計表示をいじる

お客さんはみ出てますよー

お客さんはみ出てますよー

 

要はこういう事さ。いつかのバージョンから、時計表示がゴリゴリになってて、はみ出るようになってしまった…。

これがただのHTMLな感じにコーディングされてるのは知っているので(背景をいじった経験がある)、それを眺めればなんとかなるでしょうといった感じ。

 

該当ソースはこちら。

$ cat /usr/share/lightdm-webkit/themes/antergos/index.html | grep current_time
<span id="current_time" class="time text-center"></span>

スタイルを定義してるのは time というクラス。これが書かれてるのはstyle.css

$ cat /usr/share/lightdm-webkit/themes/antergos/css/style.css | grep ".time {" -A 10
.time {
font-family: "LatoLight", "Open Sans", sans-serif;
font-size: 96px;
line-height: 1em;
text-decoration: none;
color: #3D73C5;
background-color: rgb(252, 247, 247);
transition: 1s ease-out;
position: relative;
top: 11px;
}

この font-sizeをちょろっと書き換えてやればよろしい。

それらしいサイズ(てきとう)

それらしいサイズ(てきとう)

 

ちなみにこれだと96px→40px。40pxでこんな小さいんか、みたいな感じ。

 

気になってたはみ出しは解消出来たので万事おっけー。

monacoin-qtがエラー落ち

monacoin-qtがエラー落ちした。

取り敢えず再起動すればなんとかなるっしょって思ったけど再起動してもダメでした。

 

ログを眺めろって怒られたので眺めると、

2016-01-03 14:03:36 Corruption: block checksum mismatch
2016-01-03 14:03:36 *** System error while flushing: Database corrupted
2016-01-03 14:07:30 GUI: "registerShutdownBlockReason: Successfully registered: Monacoin Core didn't yet exit safely..."
2016-01-03 14:07:30

だそうな。よくわかんない。適切に終了されなかったからデータベースがぶっ壊れたって事なんかな。

適当にぐぐってみると -reindex を付けてコマンドラインから起動してみなって情報があったので、そうしてみる。

手元にあるブロックチェーンのデータをイチから作りなおす感じみたい。

 

ウォレットそのものは壊れてなかったみたいなので(受け取りアドレスもきちんと残ってたし、残高も記憶にある値と一致していた)、よかったよかった。

ラノベデータベースを作る 〜OCR〜その2

ラノベデータベースを作る 〜OCR〜のつづき。

今回は画像のバリエーションを増やしてみる。

 

最初のサンプルはこちら。

OCRサンプル2。test2.png

OCRサンプル2。test2.png

コレは縦書きだ。

 

OCRサンプル3。test3.png

OCRサンプル3。test3.png

これがサッと思いついたちょっと難しそうな漢字。

 

$ tesseract test2.png result -l jpn+eng -psm 5
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
$ cat result.txt
日本語
あいう
ABC

$ tesseract test3.png result -l jpn
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
$ cat result.txt
壱 鬱

縦書きの場合は -psm 5をオプションに入れればいいし、ちょっと難しそうな漢字も難無く読み取れるようだ。

 

それではこれはどうか。長めの文章だ。

OCRサンプル4。長めの文章。

OCRサンプル4。長めの文章。

 

$ tesseract test4.png result -l jpn
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
$ cat result.txt
手持ちのコ三ックスゃラノべのデ一タべ一スを作りたいと
思った時、 全部手作業で入カするにはだぃ,ぶ厳しい分冒が
ぁるので、 どうせなら` 背表紙が写るょぅに並べて撮影今
各本ごとの領域に切り分け今。cR今タィ トル/著者くらぃ
の情報を得て、 デ一タべ一スに放り込む、 みたいなシステ
ムを作りたぃと思ぅわけだ〟 その準備として、 まずは0cR
で文字が認識出来るかどうか、 取り敢ぇずで触ってみる〟

なんだか惜しいところが沢山ある。これを人間が読む分には別にこれでも良い気もするが、データベースに放り込む内容としてはかなり難がある。最悪、こうやって読み取ったデータを手作業でチェックしていってもいいけれど…

 

OCRサンプル5。サンプル4からの切り抜き。

OCRサンプル5。サンプル4からの切り抜き。

1行だけ切り抜いてみると、次の通り。

$ tesseract test5.png result -l jpn
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
[tea@teaarch ocr_test]$ cat result.txt
ぁるので` どうせなら` 背表紙が写るょうに並べて撮影今

比較すると、こういう感じだ。

ぁるので、 どうせなら` 背表紙が写るょぅに並べて撮影今

ぁるので` どうせなら` 背表紙が写るょうに並べて撮影今

大差無いっていうか、むしろ悪化している(前後の行がなくなったので、上下の位置関係がわかりにくくなった?)。

次は回転させてみよう。

 

OCRサンプル6。回転させた。

OCRサンプル6。10度回転させた。

 

$ tesseract test6.png result -l jpn+eng
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
Empty page!!
Empty page!!

ダメだ。-psmで少し条件を変えてみたけど、7,6,4の時は拾えたけど、あとはやっぱりダメ。文字が少なすぎるか、回転させすぎかな?

 

OCRサンプル7。回転量を減らした

OCRサンプル7。回転量を減らした

 

$ tesseract test7.png result -l jpn+eng -psm 1
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
Too few characters. Skipping this page
OSD: Weak margin (0.00) for 10 blob text block, but using orientation anyway: 0
[tea@teaarch ocr_test]$ cat result.txt
ABC123 あいうえお!

殆ど回転してないようにも見えるけど、要はほんの少しの傾きならなんとかなるという事だ。ちなみに-psm 1入れなくても同じ結果になった。オプションよくわからん。

 

正確に(傾き無く)切り出せる事、読み取りミスをなんとか吸収出来る事、がラノベデータベースにおける必要条件だな。

ラノベデータベースを作る 〜OCR〜

手持ちのコミックスやラノベのデータベースを作りたいと思った時、全部手作業で入力するにはだいぶ厳しい分量があるので、どうせなら、背表紙が写るように並べて撮影→各本ごとの領域に切り分け→OCR→タイトル/著者くらいの情報を得て、データベースに放り込む、みたいなシステムを作りたいと思うわけだ。その準備として、まずはOCRで文字が認識出来るかどうか、取り敢えずで触ってみる。

今回触るのはtesseract。環境はantergos(ArchLinux)。

 

普通にリポジトリにあるみたいなので、素直にインストールする。

$ sudo pacma -S tesseract tesseract-data-eng tesseract-data-jpn

tesseract本体、English, Japaneseの言語データをインストールした。言語データが無いと、本体だけでは実行出来ない。

 

今回試しにOCRしてみる画像はこちら。

OCRサンプル。サクッと作った

OCRサンプル。サクッと作った

 

さて、実行してみる。tesseract input_file output_fileといった感じ。-lで使用する言語を指定できる。+で複数繋げば複数選択する事も可能。

$ tesseract test.png result.txt
$ cat result.txt
ABC123

$ tesseract test.png result.txt -l jpn
$ cat result.txt
ABCー z3
ぁいう
日本語

$ tesseract test.png result.txt -l eng
$ cat result.txt
ABC123

$ tesseract test.png result.txt -l eng+jpn
$ cat result.txt
ABC123

$ tesseract test.png result.txt -l jpn+eng
$ cat result.txt
ABC123
あいう
日本語

  • 言語を指定しないと英語が選択される
  • 日本語だけではアルファベットや数字を正しく認識できない
  • 言語複数指定の場合は指定する順序で結果が変わる
  • eng+jpnよりjpn+engの方が精度が良い?

といったところか。そう何度も試したわけではないので、それぞれの実行も1回だし実際どうなのかは不明。

 

Tesseract-OCRの学習あたりを参考にすればさらなる学習も出来そうだけど、だいぶ骨が折れそうだな。

 

サンプル画像を変形した場合にどうなるかはまた今度調べよう。

monacoinの俺々プールを作る

Monacoinをソロマイニングする

なーんて調子に乗ってソロマイニング~とか言ってたけど、Askmonaのトピック

プランA:Monacoin Wallet ⇒ getworkが廃止されたらしく、うまく掘れない。getworkを無効にするオプションがminerにあれば若しくは…
プランB:自分用のPoolを設置 ⇒ Scrypt時代のPoolの作り方はググれば出てくる。今は(Lyra2REv2では)どうなのだろう…
プランC:SGMinerやCCMinerを改造し、getworkを使わないようにする。 ⇒ 少なくとも私は技量不足で無理っぽい…
プランD:プールからブロック情報だけもらって、Minerに渡す、proxyみたいなものを作る。 ⇒ いや、それで出来るかは知らんけど…

そもそも、できないのかな…?ソロマイニング…

とある。Monacoin Walletでやるソロマイニングはダメらしい(笑)getworkってなんだよ(笑)わかんね

 

で、プランBをちょっとやってみようかな、といった話だ。

結論だけ言えば、成功して、掘り当てる事もできた。けれど、構築当時の様子をそのまま記録、というのをやりそこねてしまったので、記憶から書き出している。細かい所にミスがあるかもしれないけど、そのへんは悪しからず。

 

長くなるので続きから。 続きを読む

Qt Creatorの補完キーを変える

便利なのだ、補完。でも、デフォルトではCtrl+Spaceで発動するので、補完するつもりでCtrl+Spaceを押すと、fcitxのON/OFFが切り替わってしまう。

補完キーを押さなくても、場合によっては少し待つと勝手に発動したりするんだけど、その待ち時間が結構ストレスになる。

という訳で、補完キーの変更をしよう。fcitxの切り替えは変えたくないので(影響範囲が大きすぎる)、Qt Creator側の補完キーをいじる。

 

ツール(T)→オプション(O)→環境→キーボードを呼び出す。その後フィルタにcompleteと入力する。

フィルタにcompleteと入力する

フィルタにcompleteと入力する

 

するとこのようにTextEditorのCompleteThisが見える。きちんとラベルも「補完の開始」となっているし、ShortcutもCtrl+Spaceでまさしくこれっぽい。

あとはこれを下の入力枠で変更するだけだ。Recordボタンを押してから好きなキーを押すと勝手に入力される。今回はお隣さんのShiftと組み合わせてShift+Spaceにしてみた。

Shift+Spaceは、実は日本語入力中に半角スペースを入力したい時に便利に使っているのだけど、Qt Creatorの中で日本語を入力する機会というのが滅多にない事なので(コメントは頻繁に書かない方だし、日本語を表示したい部分は全部tr()して後からLinguistで日本語を設定する)さしたる問題ではないかなー、と。

 

これで暫く試してみよう。