radikoを録音して自宅内ポッドキャスト配信する環境を整えた

最近仕事中や通勤中にポッドキャストを聴くことが多くなった。Rebuild.fmなどのTech系ポッドキャストをよく聴いている。内容は面白いのは当然のことながら、仕事中に会話を聴き流すようにすると(個人的には)音楽より集中できるのでいい感じ。ただ、他にも色々聴きたくなったので、ラジオを録音してみることにした。 やりたいこと 具体的には以下のようなことを勝手にやってくれるシステムを作る。 録音予約だけしておくだけで、iPhoneでラジオの録音を聴ける環境が欲しい 具体的にはradikoを録音する。録音ソフトは色々存在するので色々試してみた 久しぶりに声優ラジオを聴いてみたくなったので、文化放送 超A&G+も録音できると嬉しい 録音したファイルをiTunes(もうないけど)でわざわざ転送とかはしたくない 深夜に録音されたラジオのmp3を毎朝iPhoneに手動で転送するのはダサい 朝は寝ていたい Apple Watch単体でも聴きたい ジムにはiPhoneを持ち込まずApple Watch(セルラー)とAirPodsだけにしているので 録音方法 Linuxで 家ではRaspberry Pi 4が常時稼働しているので、できればこれで録音したい。Linuxでのradiko録音方法としては、色々なサイトで以下のスクリプトが紹介されていたので、これを試してみた。 簡易Radiko録音スクリプト Raspberry Pi 4上でも動作はしたものの、途中で録音に失敗することが多かった。そのうち自分でも同様のスクリプトを書いてみたい。 Raspberry Pi 4 Model B (4GB) made in UK ラズベリーパイ4 Amazonで見る Macで Macでradikoを録音するソフトは少なかった。 ネットラジオ録音X ラジ録11 どちらも有料だが出来は良さそう。ただ、ラジオの録音のために長時間iMacを起動しておくのは電気代的にイマイチな気が。 Windowsで Radikool radikoの録音ソフトとしては一番有名な気がする。安定性、設定の柔軟さ共に全く問題なかったのでこれを使うことにした。 らじれこ Radikoolでは超A&G+を録音できないので、らじれこを使うことにした。らじれこでradikoを録音することも可能なので、これ一つでも良かったが、「録音後にファイルを指定したディレクトリに移動」ができないので、Google Drive等のオンラインストレージと同期しているディレクトリに録音ファイルを保存したい際に問題が起こる。コピーはできるので、定期的にコピー元ディレクトリを掃除するスクリプトを書けばOK。 Windows機が手元にないので、しばらく無料で使えるクレジットを持っているAzure上にVMを作って運用することにした。将来的には手元で動かしたいので、そのうち安いWindows機を調達したい。 結果、radikoは「Radikool」、超A&G+は「らじれこ」を使うこととした。 どのように聴くか Azure上で録音する面倒な構成にしてしまったので、まずはVMから手元にファイルを同期する必要がある。これはGoogle Driveを使うことにした。録音ファイルの保存先ディレクトリをGoogle Driveと同期し、自宅のNAS上にファイルを持ってくるようにした。 一度Google Driveにファイルをアップロードしているため、iPhoneのGoogle Driveアプリから簡単に聴くことができるようになる。あまり使いやすくはないが、とりあえずiPhoneで聴ければよい、ということであればこれでOKかも。ただし、Apple Watchでは聴けない。 Apple Watch単体で聴く方法は(恐らく)Apple Musicを使うのが一番簡単。録音したファイルをiTunesに放り込んであげれば、クラウドにアップロードされ、iPhone、Apple WatchのMusicアプリから聴くことができる。ただ、以下の弱点がある。 iTunesに放り込む作業が自動化できない。(指定したディレクトリを監視してライブラリに適宜追加してくれる機能はなかったはず) 音楽ライブラリにラジオが入ってくるのがイマイチ嬉しくない。シャッフル再生時に紛れ込んできたら嫌。 ということで、Apple Musicにアップロードする方法もイマイチだなー、と思い、自宅LAN内でポッドキャスト配信する方法を取る事にした。 ポッドキャスト配信する 今回はRaspberry Pi 4にnginxをインストールし、NAS上のGoogle DriveフォルダをマウントしてLANに公開する事にした。NAS上にバックアップを取りたいのでこのような構成になっているが、Raspberry Pi上に直接Google Driveを同期するでよいと思う。 ポッドキャスト配信するには専用のxmlファイルを用意する必要がある。このxmlファイルにはファイル名とファイルへのURLが記載されているので、新しくラジオを録音した際には更新する必要がある。今回は以下のスクリプトを拝借した。 makepodcast.rb このスクリプトを定期的に実行する。自分はcrontabを用いて15分に一度実行するようにした。このxmlファイルへのURLをiPhoneのポッドキャストアプリに登録すればOK。「ライブラリ」の編集ボタンより、「番組をURLで追加…」で追加できる。 このURLを外部からアクセスできるように公開してしまえば一番便利ではあるが、流石に録音したファイルを晒しておくのはグレーなのでやめておいた。自宅にVPNを張っておけば外からもアクセスできる。 ポッドキャストアプリでラジオを聴くのは色々メリットがあった。再生時間が保存され、Appleデバイス間で同期されるので、2時間程度の長めの番組を聴く際に重宝する。途中から聴くとき、「どこまで聴いたっけ…」と延々シークして探す必要がない。再生速度も簡単に変更できる。聴き終わったファイルは端末から自動的に削除され、ストレージを圧迫することもない。猛烈に便利。これがやりたかった! あとはAzureVMで動いているWindows環境をどうするか。ThinkCentre M715q Tinyが3万円程度でRyzen5+8GB RAM+128GB SSDと激安、電気代も安そう。ESXiも動くらしいので買っちゃおうか。 オフィスとか通勤中にラジオ聴くにはWF-1000XM3がノイズキャンセリングでかなりよいです。レビューも書きます。 ソニー SONY ワイヤレスノイズキャンセリングイヤホン WF-1000XM3 : 完全ワイヤレス/Bluetooth/ハイレゾ相当 最大6時間連続再生 2019年モデル ブラック WF-1000XM3 B Amazonで見る

December 9, 2019 · 1 分

フォトヨドバシっぽく写真にExif情報を入れたいのでPythonにやらせる

退屈なことはPythonにやらせましょう。 フォトヨドバシっぽく写真にExif情報を入れたい 見るだけでカメラとレンズが無限に欲しくなるフォトヨドバシという悪魔のようなウェブサイトがありまして、ここで公開されている写真の隅にはExif情報(カメラの種類、レンズの種類、シャッタースピード、F値など)と撮影者名が書き込まれています。 参考:SONY SEL135F18GM - フォトヨドバシ これが入ってるとなんかカッコいいのでPythonにやらせます。実はLightroomの有料プラグインのLR/Mogrify2を使用すれば、サクッとできるんですけどね。 LR/Mogrify2 環境、準備 Python 3.7 MacOS Mojave 10.14.4 特に変な処理はしていないので、多分WindowsでもLinuxでも動きます。 # pip install PIL 画像処理にPILを使います。 コード import sys, os from fractions import Fraction from PIL import Image, ExifTags, ImageDraw, ImageFont from PIL.ExifTags import TAGS, GPSTAGS class ExifDataObj(object): # Exifデータ格納用オブジェクト def __init__(self, filename): self.filename = filename self.Model = None self.LensModel = None self.ExposureTime = None self.FNumber = None self.ISOSpeedRatings = None def get_exif(filePath):#指定されたjpgのExifを取得 img = Image.open(filePath) exif = img._getexif() exifData = ExifDataObj(filePath) for id, value in exif.items(): if TAGS.get(id) == "Model": exifData.Model = value elif TAGS.get(id) == "LensModel": exifData.LensModel = str(value) elif TAGS.get(id) == "ExposureTime": shutter = str(Fraction(value[0], value[1])) exifData.ExposureTime = shutter elif TAGS.get(id) == "FNumber": fn = str(value[0]/value[1]) exifData.FNumber = fn elif TAGS.get(id) == "ISOSpeedRatings": exifData.ISOSpeedRatings = str(value) return exifData argvs = sys.argv my_img = argvs[1] #引数から写真のパスを取得 exifData = get_exif(my_img) #書き込み文字列整理 ex)ILCE-7M2, FE 24-105mm F4 G OSS, 1/2000, f/4.0, ISO100 ExifStr = exifData.Model + ", " + exifData.LensModel + ", " \ + exifData.ExposureTime + "s, f/" + exifData.FNumber + ", ISO" \ + exifData.ISOSpeedRatings + ", photo by okaken" print (ExifStr) base = Image.open(my_img).convert('RGBA') fonts = '/root/.fonts/AppleGothic.ttf' #フォントパス指定 fontsize = 80 #文字の大きさ opacity = 192 #文字の透明度 color = (255, 255, 255) #文字の色 txt = Image.new('RGBA', base.size, (255, 255, 255, 0)) draw = ImageDraw.Draw(txt) fnt = ImageFont.truetype(font=fonts, size=fontsize) textw, texth = draw.textsize(ExifStr, font=fnt) #左隅に文字を書き込む draw.text((0, base.height - texth),ExifStr, font=fnt, fill=color + (opacity,)) out = Image.alpha_composite(base, txt) out = out.convert('RGB') #ファイル名にex_を付与してJPG書き出し outFileName = 'ex_' + os.path.basename(my_img) out.save(os.path.dirname(my_img) + '/' + outFileName, 'JPEG', quality=95, optimize=True) 処理としては、Exifを取り出してオブジェクトに格納、書き込む文字列を整形、文字列を書き込んだ透明なレイヤーを生成、元画像とマージするだけです。 ...

April 23, 2019 · 2 分

ブラウザ上でVScodeが使えるcode-serverを試してみる

ブラウザ上でVisual Studio Codeが使えるWebサービスのCoderのオープンソース版で、好きなサーバ上で動作可能な「code-server」を動かしてみました。 code-server - GitHub 環境 docker版もありますが、今回は普通にバイナリをもらってきて動かします。 Azure D2S v3 Ubuntu 18.04 LTS 気分的にクラウドに置いて試したかったので、とりあえずAzureで動かしています。 インストール、起動 # cd # mkdir code # cd code # wget https://github.com/codercom/code-server/releases/download/1.903-vsc1.33.1/code-server1.903-vsc1.33.1-linux-x64.tar.gz(適宜最新版にしてください) # tar xvf code-server1.903-vsc1.33.1-linux-x64.tar.gz # cd code-server1.903-vsc1.33.1-linux-x64 # ./code-server /PATH/TO/HOME/DIR/ -p 任意のポート番号 --password 任意のパスワード --cert /PATH/TO/fullchain.pem --cert-key /PATH/TO/privkey.pem 初めはCentOS 7.5で試したのですが、yumで入るものより新しいバージョンのgccに付随するライブラリを要求されます。gccの最新版を手元でmakeするのも面倒だったので、今回はUbuntu 18.04に変更。あっさり動きました。/PATH/TO/HOME/DIR/で指定したディレクトリが、VScodeでターミナルを開いた際のホームディレクトリとなります。/root/や、/home/ユーザー名/等に指定しておくのが無難です。適当に設定すると環境変数で面倒なことになります。(pyenvが動かなくて困った) 特に設定しなければhttpsで動作し、nginxなどでリバースプロキシを組まずともSSL対応が可能です。ただ、もちろんSSL/TLS証明書がないと意味がないので、今回はLet’s Encryptで発行した証明書を使用しました。Let’s Encryptは以下の操作の後、いくつか簡単な質問に答えるだけで証明書を発行してくれます。 # wget https://dl.eff.org/certbot-auto # chmod a+x certbot-auto # ./certbot-auto サーバー起動時には自動で起動してほしいので、Systemdのサービス化します。 起動用スクリプトを作る vi /opt/codeserver.sh #!/bin/bash /PATH/TO/code-server /PATH/TO/HOME/DIR/ -p 任意のポート番号 –password 任意のパスワード –cert /PATH/TO/fullchain.pem –cert-key /PATH/TO/privkey.pem ...

April 23, 2019 · 1 分