Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
シェル芸でなれるVTuber!
Search
amanoese
November 09, 2020
0
870
シェル芸でなれるVTuber!
第50回 シェル芸LT(2020/11/9)のLT で発表した内容です。
LT動画はこちら:
https://www.youtube.com/watch?v=ig42Nml0Agk
amanoese
November 09, 2020
Tweet
Share
More Decks by amanoese
See All by amanoese
魔術式シェル芸
amanoese
0
1.1k
Technopop shell-gei(テクノポップシェル芸)
amanoese
0
490
Alexaアカウントリンクの認証と申請で躓いた話
amanoese
0
37
シェル芸のおかげでUnicodeに怯えず楽しめるようになった話
amanoese
0
160
AlexaにSSMLで音声記号(IPA) 使って喋らせたかった
amanoese
0
430
VUIでシェル芸を実行できるようにしてみた
amanoese
0
1.9k
インタラクティブなシェル芸実行コマンド作った感想
amanoese
0
130
静的WEBサイトをSPA化するワンライナー
amanoese
0
63
Featured
See All Featured
What's new in Ruby 2.0
geeforr
341
31k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
29
1.7k
How GitHub (no longer) Works
holman
311
140k
Automating Front-end Workflow
addyosmani
1365
200k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
225
22k
Building Your Own Lightsaber
phodgson
102
6k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.3k
YesSQL, Process and Tooling at Scale
rocio
167
14k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
355
29k
The Language of Interfaces
destraynor
154
24k
Transcript
シェル芸でなれる! v-untuber
自己紹介 「jus共催 第50回記念我々は50回も何をやってるんだ ろうシェル芸勉強会」に初参加! JavaScriptとシェル芸が好き RustとElmに憧れてる taka@SIではたらくフレンズ @amanoese
シェル芸 x VTuber + unko
きっかけ 前回の続きでSoXコマンドの応用でボイスチェンジャー作成を考える ↓ 前例あり https://qiita.com/Nabeshin/items/5a904fe0baf76a9bf651 ↓ ボイスチェンジャー+α すれば…VTuberか……
かんがえたこと
一つずつ解決していく
カメラから画像を取り込む
カメラから画像を取り込む $ v4l2-ctl --list-devices ## 保存 $ ffmpeg -f v4l2
-i /dev/video0 -frames:v 1 out.jpg ## モザイク表示 $ ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 -f image2 -|convert - -sample 5% -sample 2000% - | display - ## caca (colored ascii art) $ DISPLAY= ffmpeg -f v4l2 -i /dev/video2 -pix_fmt rgb24 -f caca - ※ cacaについて話したいけど割愛 http://caca.zoy.org/wiki/libcaca
画像から認識する…
コマンドみつけられなかった つくるか……
qtf 「有名な学習済モデルを使うのにプログラムを書くのは面倒だよ……」 という意見から生まれた天才的なコマンド $ qtf posenet input.jpg | jq .
https://www.npmjs.com/package/qtf
他 ## unko 画像 $convert -background black -pointsize 64 pango:""
-gravity center -extent 128x96 unko.jpg 画像の変形 https://legacy.imagemagick.org/Usage/distorts/#perspective
ffplayで再生 $yes|xargs -L1 bash -c "ffmpeg -y -f v4l2 -i
/dev/video0 -frames:v 1 o.jpg 2>/dev/null && qtf posenet o.jpg|jq '.keypoints|.[2],.[1],.[6],.[5]|.position|.x/5,.y/5'|cut -d. -f1|xargs -n2|awk NF=NF OFS=,|diff -y <(echo -e '0,0\n128,0\n0,96\n128,96') -|tr -d '|'|awk NF=NF|xargs"|xargs -i bash -c "echo {} >&2;convert <(convert -background black -pointsize 64 pango:"" -gravity center -extent 128x96 jpg:-) -matte -mattecolor black -distort Perspective '{}' jpg:-"|ffplay -f mjpeg -
ffplayで再生(デモ用) $yes|xargs -L1 bash -c "ffmpeg -y -f v4l2 -i
/dev/video0 -frames:v 1 o.jpg 2>/dev/null && qtf posenet o.jpg|jq '.keypoints|.[2],.[1],.[6],.[5]|.position|.x/5,.y/5'|cut -d. -f1|xargs -n2|awk NF=NF OFS=,|diff -y <(echo -e '0,0\n128,0\n0,96\n128,96') -|tr -d '|'|awk NF=NF|xargs"|xargs -i bash -c "echo {} >&2;convert o.jpg -sample 5% -sample 2000% box/$(date +%s).jpg;convert <(convert -background black -pointsize 64 pango:"" -gravity center -extent 128x96 jpg:-) -matte -mattecolor black -distort Perspective '{}' jpg:-"|ffplay -f mjpeg - $ yes | xargs -L1 bash -c 'sleep 1;ls|sort -r|head -1|xargs cat'|ffplay -f mjpeg -
画像を転送できるのか?
画像を転送できるのか? RTPで転送できる $ yes|xargs -i bash -c 'muscular shout|firefox -screenshot
/dev/stdout "data:text/plain;charset=utf-8;base64,$(base64 -w0 -)" --window-size=300,450 2>/dev/null|convert png:- jpg:- >0.jpg;cat 0.jpg{,,,,,,,,,,,,,,,,,,,,,,,,,,,,}'|ffmpeg -re -i pipe:mjpeg -f rtp_mpegts rtp://localhost:50001
出力方法について ビデオキャプチャ(UVC) -> OBS -> youtube - ハードウェアに頼るとなんか違う - OBSでコントロールできる
rtmp (flv) -> youtube - ピュアなシェル芸で良い - https://www.slideshare.net/s_mitu/ss-121674575 - コンテンツのオーバレイなどの操作し辛いのが youtuberとして致命的 rtp_mpegts -> OBS -> youtube - ギリギリシェル芸では? - OBSでコントロールできる v4l2loopback - mod_prodeが微妙 ※1 メモ:rtpはudp,trmpはtcp ※2 APNGはストリーミングがアレ ※3 SVG stream…?
rtp_mpegtsでの配信(理想) 遅延がひどいのでやらない $yes|xargs -L1 bash -c "ffmpeg -y -f v4l2
-i /dev/video0 -frames:v 1 o.jpg 2>/dev/null && qtf posenet o.jpg|jq '.keypoints|.[2],.[1],.[6],.[5]|.position|.x/5,.y/5'|cut -d. -f1|xargs -n2|awk NF=NF OFS=,|diff -y <(echo -e '0,0\n128,0\n0,96\n128,96') -|tr -d '|'|awk NF=NF|xargs"|xargs -i bash -c "echo {} >&2;convert <(convert -background black -pointsize 64 pango:"" -gravity center -extent 128x96 jpg:-) -matte -mattecolor black -distort Perspective '{}' jpg:-"|ffmpeg -i pipe:mjpeg -f rtp_mpegts rtp://localhost:5000
シェル芸 x VTuber + unko ↓ v-untuver なれた!
高速化の話 画像認識よりNode.jsの起動に時間がかかる qtfは読み込み可能になるまでに0.4sec 処理は0.4sec MJPEGのストリームを読み込み出力できれば良い JSONのストリーム? => application/json-seq https://tools.ietf.org/html/rfc7464
高速化の話 説明割愛「ffd8」 から「ffd9」を抜けば良い。 ※ffd0 ~ ffd9になる値はff 00でエスケープされる? ## mjpeg ->
jpeg + モザイク ffmpeg -f v4l2 -i /dev/video0 -f image2pipe -|xxd -ps|sed 's/..../&\n/g'|sed '/^$/d'|sed '/ffd9/q'|tr -d \\n|xxd -r -p|convert - -sample 5% -sample 2000% -|display -
高速化の話 JSONのストリーム? => application/json-seq ## mjpeg -> application/json-seq対応 $ ffmpeg
-f v4l2 -i /dev/video0 -f mjpeg - 2>/dev/null | node src/index.js posenet pipe:mjpeg -v 2>/dev/null|jq --seq --unbuffered ".keypoints|.[1],.[2],.[5],.[6]|.position|.x,.y" https://tools.ietf.org/html/rfc7464
高速化の話 うまくいかなかったよ…というよりわけわかんなくなったのでおわり https://tools.ietf.org/html/rfc7464
まとめ シェル芸でV-untuberになれたよ - 違法なqtfコマンド - ボイスチェンジャーの話はどこに…? 高速化が課題 ffmpegとImageMagickの難しさを改めて理解した
資料など
## ストリーミング ライブストリーミングの基礎知識 https://www.slideshare.net/kumaryu/ss-17054212?from_m_app=android - ストリーミングと規格の入門として良い - この情報がほしかった! ## FFMPEG
RTP (II): Streaming with FFmpeg https://www.kurento.org/blog/rtp-ii-streaming-ffmpeg - rtpプロトコルについての説明 - WebRTCで有名? - このまえ友達とのプロジェクトで名前でた気がする …きのせいかな? YUVとRGBの違い - 改訂版 https://vook.vc/n/507 - YUVの入門として良い記事 - 信号線(白黒,カラー混在時期のテレビの話 )で納得できた ffmpegでraw画像を扱う方法など調べたまとめ https://code.74th.net/entry/2018/03/21/065203 - image2pipeはありがたい ffmpeg でのフレームレート設定の違い https://nico-lab.net/setting_fps_with_ffmpeg/ - フレームレートで気になったら読む場所
## ImageMagick text:pango https://legacy.imagemagick.org/Usage/text/#pango - テキストを書きたく絵文字やフォントを気にしたくないとき用 - HTMLのようにタグで囲ったマークアップで色々できそう - 多分本来はこれが目的のものぽい
ditorts:presective https://legacy.imagemagick.org/Usage/distorts/#perspective - 画像の変形 ## MJPEGの話 APPLEのMOVとMJPEGのドキュメント https://developer.apple.com/standards/qtff-2001.pdf#page=98 - 正式なドキュメントだけど量が多いのが難点 - リンク先はMJPEGのデータの図 - MJPEGはコーデック? - 実際には連続したJPEG - MOVはコンテナ - ヘッダーにFPSなどはいりオーディオも格納できる イギリスあたりの会社の記事ぽい。 http://www.gdcl.co.uk/2013/05/02/Motion-JPEG.html - MJPEGを実際にデコードする仕方が書かれて参考になった
## JPEG JPEGのデコーダーを作って理解してるかたの記事 https://qiita.com/tobira-code/items/63b9065a46208d0fd128 - わかりやすいかも - ちゃんとは読んでないが今後も読み返すと思う バイナリに詳しいリポジトリ https://github.com/corkami/formats/blob/master/image/jpeg.md
- なんだこれは - GIGAZINEからのリンク - MJPEGについてわかりやすく解説されてる - APPLEのPDFははここからのリンクでみつけた - ZIPなどのアーカイブ,MP4などのコンテナ,pngなどのバイナリなども記載あり - 今後もお世話になりそう ## UVC デバイス 産業用UVCカメラのすすめ : 株式会社アルゴ https://www.argocorp.com/UVC_camera.html - UVCからドライバのあたりがわかりやすい - https://www.argocorp.com/UVC_camera/Linux.html - https://www.argocorp.com/UVC_camera/Windows.html - v4l2とDirectShowをなんとなく使ってたがと理解が深まった - 良記事でお世話になったし、おちんぎんたくさんもらえるエンジニアになったら、ここからカメラ買いたいな - 7716×5360 @7フレーム 20万くらい https://www.argocorp.com/cam/usb3/tis/DxKAFU420-CCS.html - フレーム落として解像度爆上げモデル?産業用は特化型あって面白い
## tensorflow シェル芸でないすばらしい実装 https://blog.tensorflow.org/2020/05/pose-animator-open-source-tool-to-bring-svg-characters-to-life.html - 実装半分でこれを見つけ、アイディアほぼ一緒で悲しかった ## ここからしたはシェル芸に関係ないが今後用のメモ
## ここからしたはシェル芸に関係ないが今後用のメモ ## qtf関連 画像変換の良さそうなライブラリ https://www.npmjs.com/package/sharp cudaのドキュメント https://docs.nvidia.com/deploy/cuda-compatibility/index.html TensorFlowのResizeがよくわからなかったので視覚的にまとめてみた http://qiita.com/Hironsan/items/d2a6364221c588867a60
- こいつを使って画像をリサイズしたい - 普通にやると中間画素のあたいがノーマライズされてしまう ## imagemagick ImageMagick リサイズ補間アルゴリズム https://qiita.com/yoya/items/b1590de289b623f18639 - 普通にやると中間画素のあたいがノーマライズされてしまうのを理解するため用の記事 ## ffmpeg ffmpegを使って動画をアスキーアートで再生してみる( libcaca) http://fftest33.blog.fc2.com/blog-entry-122.html - Terminalに動画や画像を表示したくなったとき用 - わりとSSHログイン先のかんたんなファイルチェックとかに使える?
## ここからしたはシェル芸に関係ないが今後用のメモ ## 格安デバイスキャプチャ( MS2109) あとでブログにまとめたい 1000円キャプチャの話 1 https://japanese.engadget.com/1000hdmi-010534749.html 1000円キャプチャの話
2 https://bigl.es/friday-fun-10-hdmi-to-usb-capture/ - 海外の人の記事も 1000円キャプチャの話 3 https://polamjag.hatenablog.jp/entry/2020/09/10/120000 - 映像は良いけど音声がおかしいという話 Linuxカーネルのソースの位置 https://github.com/torvalds/linux/blob/master/sound/usb/quirks-table.h#L3599-L3648 - 確かに音声を良い感じにする専用のコードがあるぽい マクロシリコン社のホームページ http://www.macrosilicon.com/info.asp?base_id=2&second_id=2001 - MS2109はのってない - 中国ドメインにすると HDMIスプリッタのチップも見られる
## ビデオキャプチャとカメラと HDMI HDMI入力をRaspberry Piで駆使する https://mzyy94.com/blog/2020/04/10/raspberrypi-hdmi-input/ - ビデオキャプチャは UVCではなくCSI-2も使える -
この記事書いたひ動画周りに強そう - ナチュラルにRTPからWebRTCにつなげてる - しかもffmpegじゃなくgst-launchで…… - CSI-2は転送レートが高いので通常のビデオキャプチャデバイス (おそらく:CSI -> LSI -> USBでLSIの性能 がネックになりやすい )では難しい転送レートが出せるのかな? Camera Serial Interface https://en.wikipedia.org/wiki/Camera_Serial_Interface - CSI-2の調べ ## v4l2 v4l2loopback https://github.com/umlaeute/v4l2loopback - 仮想カメラデバイス作りたいとき用 - テストとかで便利 - x window全体を転送したりしてる人達もいる
## コーデック AV1エンコーダーの速度と品質の比較 - ffmpeg(libaom) vs SVT-AV1 https://qiita.com/yanoshi/items/544a361baf76b8114067 - ffmpegの今回は使わなかったけど
AV1コーデックの話 - AV1はロイヤリティフリーで良いコーデックだけど遅い処理系しかない …と言われるそれを覆してるぽい良 い記事 ## 機械学習 機械学習系のモデルのパーク https://github.com/PINTO0309/PINTO_model_zoo - tfjs-modelsみたいなの探してたら見つけた - すごい量、機械学習界隈では有名なのかな