#密閉型イヤホン以外でWeb会議アドベントカレンダー: Plantronics M70 の巻

AirPods Max 高すぎるけど密閉型イヤホン以外での Web 会議を模索したいアドベントカレンダー N 日目 (数えるのをやめた) です。

#密閉型イヤホン以外でWeb会議アドベントカレンダーですが、ここまで多くの皆様にご参加頂いていることに心より感謝いたします。

もうちょっと続けるかと思いつつ、これ以上紹介できるグッズがないんだよな〜と考えていたんですが、ありました。コレ。

ある意味 Bluetooth ヘッドセットの原点かつ頂点みたいな形をしているこちら、Plantronics M70 です。

Plantroncisプラントロニクス というブランドには馴染みがない方も多いのではないかと思うのですが、NASAアポロ計画で使われたヘッドセットを供給していた歴史があったりと、老舗のヘッドセット屋 (?) と言えるようなメーカーです。

Plantronics - Wikipedia

Plantronics M70 の話に戻ると、Bluetooth イヤホンというものがこんなに市民権を得る前 (AirPods 前史の時代) の Bluetooth ヘッドセットといえばこういう形だよね〜、というようなイメージドンピシャじゃないかなと思います。だいぶ前に運転中の携帯電話操作が明に違法化?厳罰化?された瞬間があったと思うのですが、その頃に運転しながら通話をしたいドライバー向けみたいな感じで売られてた *1 みたいなアレです。

M70 は通話専用ではなく、オーディオ再生用の Bluetooth プロファイル (A2DP) にも対応しているので、音楽とかポッドキャストの音声なんかも普通にこれで聴くことができます。

良い

  • 3,000 JPY くらいで買える。安い
  • バッテリーめっちゃ長持ち。公称通話時間は 最大約 11 時間
  • イヤーチップ的な部分はシリコンでできているので馴染みやすい
    • 密閉型 (カナル型) じゃないの?と思うかもしれないけど、オープン型イヤホンのガワ部分がシリコンになっただけみたいな感じです
  • イヤーフックもついているので、だいたいどんな形の耳に対しても固定しやすい
    • 自分は耳の形がおかしい??のか、イヤホンの形をかなり選ぶ方なのでこれはうれしい

いまいち

  • 片耳だけで使うタイプなので、慣れるまでちょっと違和感があるかも
    • まあ慣れる
  • いまいちな点そんなにない気がする
    • microUSB 充電なので USB-C に統一したい人は困るかもしれないけど、個人的には今の所どうでもいい
    • イヤホンの音質はほどほど……だと思う。悪いと感じたこともないけど、まあ音質を期待して買う製品ではなさそう

引き続きこのネタのエントリを募集しています。#密閉型イヤホン以外でWeb会議アドベントカレンダー タグをつけてエントリを (勝手に) 書いてもらえると嬉しいです (アドベントカレンダー名乗りサービスみたいなのは使ってないですし、そもそも 24 日間埋めるつもりもとくにない)。

*1:今もコンビニとかでも売ってますよね

#密閉型イヤホン以外でWeb会議アドベントカレンダー 1 日目: AfterShokz Aeropex の巻

AirPods Pro を数時間連続で装着すると耳垂れがめちゃくちゃ出るのでカナル型イヤホン以外で Web 会議とかをやりたいアドベントカレンダー (そんなものはない) 1 日目です。

AfterShokz Aeropex というのは、Bluetooth を搭載したいわゆる骨伝導型イヤホンです。マイクも搭載していて HFP / HSP に対応しているので、通話とか Web 会議 (広義の Zoom) にも使うことができます。

良い

  • 骨伝導型イヤホンなので耳が塞がれない
    • 当然外の音も聞こえる
    • Web 会議だけでなく、ジョギングとかするときに便利だと思う、というか本来はそういうのを狙った製品なんだけど
  • バッテリーが長持ち (公称 8 時間)
    • 実質 1 営業日持つ
  • マイクの音質はまあ普通っぽい
    • 音量の設定とかちゃんとしてれば普通っぽいです
  • なんかプルプルしたりしないんだろうか、と思うんだけど、意外としない。するのはする

いまいち

  • 充電が独自の MagSafe 的端子なのでケーブルに汎用性がない
    • 最近出た AfterShokz OpenMove ってやつは USB-C 端子になってた
    • それを見越して?なのか、同じケーブルが最初から 2 本付属してるのは丁寧な感じがする
  • 2 デバイス同時にペアリングできるという設定なんだけど、挙動が全体的に不穏
    • 2 デバイス同時に掴んだ状態になったあとに片方のデバイスとの通信が途切れると、ポポッ というビープ音がそこそこの音量で永遠に鳴り続けてめちゃくちゃ鬱陶しい
    • 回避法
      • そういうシチュエーションが発生しそうなときは、先に 1 デバイスしか電波の届かない範囲まで移動したあとに電源を入れる
      • そもそもこのマルチペアリング機能を使わず、デバイスの切り替えは都度ペアリングし直すことでやることにする
  • 頭の後ろにループ状の物体が配置されることになるので、椅子の背もたれや首部分に配置されるサポーター的オブジェクトとの相性がわるいがち
    • 具体的にはゲーミングチェアにありがちな首部分のミニ枕みたいな形のやつと完全に干渉するので Aeropex 使うときだけそれを外してます

悪いことばっかり書いてるように見えるかもしれないけど、全体的な満足度は非常に高いです。ずっと使ってるので細かいところが気になってきているみたいなところはある。

明日以降は id:kiyo-shit さんから AfterShokz OpenComm や Anker PowerConf について書いていただけることと期待しています。というか誰でも良いからこのネタで書いてほしいと思っていて、#密閉型イヤホン以外でWeb会議アドベントカレンダー タグをつけてエントリを書いてもらえると嬉しいです。

Apple Silicon 搭載 MacBook Pro 買った日記

Apple Special Event とかいう通販番組を見てたらテンションが高まってしまってうっかり 20 万円くらいの構成のやつを買ってしまったけど、全然後悔してない。

総評

まだ mature じゃない、みたいな話は当然あるけど、そんなんわかっとるんや……。

ウェブブラウザが世界一快適に動く、のソースは Benchmarks: Whatever Is Available - The 2020 Mac Mini Unleashed: Putting Apple Silicon M1 To The Test

各論

3 週間くらい前に Intel 物理 8 コア/ 32GB RAM みたいな構成の仕事用 16 インチ MacBook Pro をセットアップしたときの記憶との比較です

Adobe CC のアプリインストールってこんな早かったっけ、っていうレベルで終わってたという話もあった。ちなみに Adobe Creative Cloud アプリ (親玉的コンパニオンアプリ、虹色アイコンのあれ) も Apple SIilicon ネイティブ対応のベータ版が出てました

Learn about compatibility between Photoshop, Apple Silicon, and Big Sur | macOS 11



すぐに対応できないのはわかるんだけど Rosetta 2 で遊ばせてくれてもええやん……という感じがする。移行アシスタントとかでまるごと環境持っていったらどちみち Apple Silicon 下で動いてしまうだろうし、こういうのやってもあんまり意味ないのではという気もする。気持ちはわかるんですが……

2020/12/20 追記: MASSIVE X 以外 Rosetta 2 で動くようになったようです、動いたぞ

10 万円のパソコンでもこの速度で動くんだったら何も困らんじゃんって感じで恐ろしい!!


Always on ってやつ!!!これだいぶビビった、カチカチするかどうかで OS 生きてるか判断するのをたまにやってたけどできなくなったので困る



Music.app は Apple Music を完全に切って使ってる。なんというか結構バギーなんだけど、見つけてるバグは iTunes 時代からほぼ全部そのままになっている *1。ライブラリ 4 万曲くらいあって、Intel 時代はなにか操作するとスマートプレイリストの再計算が走って *2 メインスレッドが秒単位で固まる (メインスレッドでいろんな文字列比較とかが延々走っている) という感じで最悪だったんですが、なんと M1 チップで相当ましになってしまった、普通に使う気になれる!!!革命!!!!

10 万円のパソコンでもこの速度で以下略

SIGMA Photo Pro は Intel マシンでもだいぶ遅いので今のところあんま変わらない、くらいのアレ。

ソフトウェアエンジニアっぽいベンチマーク (適当な OSS のテスト完走時間とか) を取ったりしてドーンといきたかったけど、今日はパソコン大好き人間として触ってるだけでとにかく面白すぎたのでそのへんは宿題とします。

*1:iTunes から Music アプリにリブランドされたけど中身はそんなに変わってないものと思われる

*2:スマートプレイリスト多すぎなのが悪いという話はある

ISUCON 10 本戦で 28,628 点を獲得して 7 位だったふりかえり

チーム「ヌルポインターマリアユニバース」として id:wtatsuru id:Pasta-K と出てきました。最終スコアは 28,628 点で、fail してない中では 7 位。ISUCON にちゃんと出場したのは前回が初めてで、そのときは予選でボコボコにされて終わってしまったんだけど、今回はそれなりの結果 *1 を残せたのは嬉しい、嬉しいが、もっとうまくやれたことはいくらでもあったな〜〜という感じはする……。日々精進です。

isucon.net

wtatsuru.hatenadiary.com


おさらいすると、本戦の問題は ISUCON 風コンテストのポータルが題材であった。

白金動物園が出題ということで、サービスメッシュ的なサムシング (マイクロサービス + Envoy / Istio)、そのサービス間通信に REST API 以外の何か (gRPC / GraphQL)、まさかのパターンとして k8s の何らか (何だろう……)、みたいなのが出現することはなんとなく予想はしていた。

し、予選の段階でポータルのフロントエンドが各種 API コールに protobuf を使っていることに気づいたりもしていたんだけど (言い訳)、ここまで直球でいろいろ出てくるとさすがに笑うしかなかった……。10 回目というキリのいいタイミングで、こんなめちゃくちゃ面白い問題が出てくるタイミングで本戦に参加できてよかったと心から思う。

今気づいたけど XSUCON の X って 10 回目の ISUCON であることとかかっているのか??


  • 時間内にチームでやったことの流れは、だいたい id:wtatsuru さんが書いてくれていたとおり
  • 後半に id:Pasta-Kペアプロをやってアプリケーション側の作業をいろいろやった、というのがだいたいの成果
    • id:wtatsuru さんがなんとなく司令塔という感じで、タスクの優先度判断などやりつつ進めた
      • タスクの優先度判断: alp でエンドポイントごとの総リクエスト時間順にボトルネックを探していって潰していく
    • 途中からはずっと Go でウェブアプリケーションを書くのに慣れている自分がコードを書く役 + レギュレーションやルール、用意されている実装の全体の雰囲気を把握していて何をどういう雰囲気で書いたらいいのか高速に答える役が id:Pasta-K という感じで動いていた
      • やったこと自体にそんなに大玉感はない気がしていて、できそうなところを簡単そうな順につぶしていった、という感じがする
      • 午前中に時間を使っただけあってか id:Pasta-K がめちゃくちゃ細かく網羅的にルール類を把握していて、「ここはこういうレスポンス返して良いもんなんだっけ」みたいな問いがどんどん解決していくので、変なところであまりハマらずにススっと実装を進めていけるという感じでめっちゃ体験がよかった
  • 予選で中途半端に実施していた 15 分スプリントをわりとガッツリ使ったのが技術面じゃないハイライトで、これは完全に良かった
    • スプリント会 · Issue #11 · tatsuru/isucon10-final · GitHub
    • スクラム開発のスプリントみたいなやつを 15 分単位で回し、15 分ごとに進捗報告とごく簡単な振り返りを実施、最後に次の 15 分でやることを調整する、というやつ
    • 予選のときは正直面白半分でやっていた感じもあったけど、今回はチームワークを発揮する上でかなりレールになった感覚がある
      • 次やることを調整する段階で「インフラ作業したいのでベンチ回せないかも」「ちょっと時間かかりそうな実装タスク掴むのでたぶん影響ない」みたいなすり合わせができていた
      • ポモドーロテクニック的なやつと融合させることで、15分 * 3 セットごとに全員で強制的に休憩を取るようにしたこともあり、作業がノッてきてからもベロシティはほとんど落ちなかった感じがする
    • ISUCON 全く関係ない文脈で短時間スプリントに関するエントリを見ていたのも少し影響している気はする
  • 微妙に緊張していて寝起きのコンディションがいまいちだったのが心残りその1
    • 今思うと、そういう状態であることを強くアピールして目が覚めるような施策をチームで打ってもらったらよかった、即ペアプロとか
  • 全体的に超大玉っぽい施策は打てなかったというのが心残りその2
    • サービス間でポーリングしている部分があり、Redis とか入れて PubSub にしたらええんちゃう、みたいなのは話してはいたけど、コスパ以前になんとなく無意識に避けてしまっていた部分がある
      • 今もベンチ投入できる延長線状態なので普通に書いてみたらいいかという気がしてきた
    • スコアボード用に長大な SQL が使われている部分なども途中からは無視していた
  • 全体的に書き込み操作をするタイミングでやや長めのトランザクションが貼られていたが、これを不要そうなところでは剥がすのをシュッとやれてたら少し違ったのかもしれないな〜という気持ちもある

本来なら本戦は LINE 社のオフィスで開催されているところ、今回はリモートでの開催だったので、グッズやノベルティが詰まった箱が開催前に送られてきたのもめちゃくちゃよかった。ちゃんとTシャツや名入りネームプレート (!) も入っていて、こういうのが手元に残るだけでも参加した実感みたいなのがぐっと湧いてくるので面白い。

競技時間中の YouTube Live も結構おもしろそうな話をしていたようなので、アーカイブが復活したら見ておきたいなと思う。スライド 1 枚でチーム紹介をやるというコーナーがあり、少なくとも身内にはスベらず面白がってもらえたのはよかった……。

こちらからは以上です。運営の皆さん本当にお疲れ様でした、ありがとうございました!!!!来年はヌルポインターマリアユニバースじゃなくて「チーム究極のピルスナー組合」で出たい


予選のエントリはこれ: #isucon #isucon10 予選参加記: 決勝行けましたの巻 - polamjaggy

*1:ボコボコでは?という説はある、、

#isucon #isucon10 予選参加記: 決勝行けましたの巻

最終スコア 2335 で本戦出場です。スコアそのものは不完全燃焼感が否めないけどクッソ嬉しい。

isucon.net

github.com

レポジトリはこれ。チーム名は「ヌルポインターマリアユニバース」*1、メンバーは漏れと id:wtatsuru id:Pasta-K。やったことはこの repo みてくれ (master ブランチの内容がスコアのあれです)

チームメンバーのエントリはこれら:

wtatsuru.hatenadiary.com


ビール2L飲んだけど記憶が生きてるうちの個人的反省箇条書き:

  • なぞって検索のN+1を完全に2クエリ (O(1)) にできたのはよかった
  • 17時くらいに疲れてすこしダレてしまった
    • 疲れたのはしゃあない
  • 全体的にログや fixture のデータ数を眺めた上での優先度判断ができた (俺が) のはよかった
    • LIKE 検索してるやつそんなないっすねという話
    • 初期データ 30000 件もないっすねという話
  • MySQL の設定素朴すぎるのに気づけたのは良かった
    • クエリキャッシュ有効化できた
      • id:wtatsuru さんにスレーブ立てたりしてもらったけど、スレーブでクエリキャッシュ有効化や InnoDB buffer pool 拡大してなくないすか?? っていうのに終了 30 分前くらいに気づけたのもよかった
        • この気づきで 100 点以上稼いでいる
  • 反省点
    • 椅子・物件の CSV インポートのバルクインサート結局できなかった
      • sqlx 仕事でも使ってるはずなのにエラーメッセージから真意を読み解けなくて時間切れだった、異常な悲しさがある
      • 異常な悲しさはあるんだけど、最終的にこれのスコアへの影響はしょぼかったのではという雰囲気もあって結果オーライ感はある……
        • 5 秒のタイムアウトをぶっちぎってしまうとスコアゼロ、確率的に? ぶっちぎってしまいますね、というところで、結局ぶっちぎらなかったっぽい
  • 作業タイムの 15 分スプリント、そこそこ機能した気がするけど途中でダレてしまった
    • 自分が根詰まると根詰まってしまう (はい)
  • id:wtatsuru さんに下回り的なタスクはだいたい丸投げできることは最初から自明だった *2 と思うけど、まあ実際そこに乗っかることでワークした面はあったと思う
    • お前が MySQL のレプリ組めや!! ってなっていたとしたら MySQL レプリケーション やり方 でググるところからスタートだったと思う……
    • 継続的に会話できたことで、やればどう考えてもスコアが上がる (けどその実装をシュッとやるには手慣れが必要) 担当 (id:wtatsuru) + 飛び道具で優勝狙い担当 (漏れ + id:Pasta-K)、をちゃんと配分しつつやっていけたのはよかった
  • ログをぼーっと眺めて傾向をエスパーするテクニックは役に立った
    • features で LIKE が発生してるのは気になるけど、そんなにリクエストされてないので後回しでよくないですか、みたいな

いろいろ話題はあるけどパッと思い出せるのはこれくらいです、随時追記はしそう

*1:サークル名ジェネレータ http://www.doujinbu.com/cng/ を適当に回していて、ヌルポインター、しかもマリア (→ MariaDB への連想) というポイントで即決

*2:なぜならプロだから

最近よく見る 1000 円くらいの HDMI キャプチャーカードについてのメモ

今北産業

  • HDMI キャプチャーボード的なやつって最低でも 1 万円くらいはするよね、みたいな常識を破壊された。個人的には完全にお値段以上
  • ある程度制限や難はあるものの、それを受け入れられるなら驚くほど普通に使えてしまっている
    • 音声入力の挙動に難があるのが一番大きそう

このあたりの話題。

pc.watch.impress.co.jp

note.com

似たようなのを 2 台 AliExpress で買って持っている。似たようなのというだけであって、サウンドハウスのそれや Amazon で売られてる似たような商品に以下の話題が当てはまるとは限らないし、この note のエントリで言及されているデバイスについても然り、という感じです。値段がほとんど一緒でスペックがめっちゃ近いように見える、という事実だけがある。以下は自分の手元に届いた物体についての感想。

文脈

これっぽいやつ AliExpress で送料込み 1000 円くらいやん!!!ということに数ヶ月前に気づいていたけど、いまやサウンドハウスで同じくらいの価格で買えるようになってしまった*1。自分が持っているものとはおそらくガワだけが違って、もっとも重要な部分を司るチップは同じものを使っているはず、たぶん……。このころは ATEM mini やその他ちゃんとした HDMI キャプチャーボードの在庫が本当に全部尽きていたこともあり、これを見つけたときにはめちゃくちゃ驚いた記憶がある。

で、届いてからたまに使っている。Splatoon をやるときにプレイ動画を YouTube Live に限定公開で配信して、あとから反省会をするのに使うとか、身内でリーグマッチ (フレンドといっしょにバトルするやつ) をやるときに思い出コンテンツとして残して共有しているとか、広角のアクションカメラをつないでオンライン飲み会の Web カメラ代わりにしてみる、という程度だけど、HDMI キャプチャとしては普通に全力で活用できているといえるのではないか。

数ヶ月 OBS などから触っている限り、だいたいこういう感じである:

映像

  • 1080p30 / 720p60 が限界
    • 1080p60 はできない
  • 画質はそんな悪くないと思う (個人の感想)。1000 円という価格を考えると全く文句はない
    • 720p60 で Splatoon みたいに動きが激しいゲームの動画をキャプチャしても、めちゃくちゃになるということはなく、普通に視聴できるレベルだと思う
      • 言われてみるとたしかに画質良いわけではないっすね、くらいの感じなのではないか???
    • ナイスカメラをつないで Zoom などの Web カメラ代わりにします!!!みたいなユースケースだと、ビデオ通話的なアレの動画ビットレートはそれなりに絞られてるわけなので、このキャプチャーボードが画質のボトルネックになることはなかなかないだろうと思う
  • 一眼カメラなりを繋ぐときは 60fps で録画する設定に切り替えないと認識されないということがあった
    • 具体的にはオリンパスの OM-D E-M5 Mark III でこの現象に遭遇した。上でアクションカメラと書いたのはソニーHDR-AS300 だけど、これはどの記録モードであろうと映像が認識できた。何が違うのかよくわからん
  • macOS + Zoom だと「HDを有効にする」設定をオンにしないとアスペクト比がおかしくなることがある気がする
    • (4:3 に縮められてしまう)
    • これも何が悪いのかはよくわかってない
  • 遅延はそれなり
    • 手元だと Splatoon をキャプボ越しにやるのは相当無理がありそう (ラグで酔いそうになる)、というレベル

ラグはデータで示せるなと思ったので適当に測ってみた。

www.youtube.com

これの元動画から適当に一コマ撮ってみたところこういう感じであった。だいたい 100ms 前後くらいのレイテンシがありそう、という感じ。

f:id:polamjag:20200910131711j:plain

こういう感じッス

www.youtube.com

これは 720p60 でキャプチャし、OBS から 1080p60 として YouTube Live に配信したやつのアーカイブ *2。後述するがこのデバイスのオーディオ入力部分は狂ってるので別のデバイスでキャプチャしている。

最初に言及した note のエントリでも、音声が強制的にモノラルになるという話で、実際 WindowsmacOS で使うとそういうふうに見えるし聞こえる。が、これはメインのチップの実装が狂ってるのでそう聞こえている、という話のようである。

USB のデバイス情報を見つつググってみたところ、MacroSilicon という会社の MS2109 というチップが HDMI 信号を UVC に変換するのを司っているようだ。

www.cnx-software.com

f:id:polamjag:20200910020230p:plainf:id:polamjag:20200910020234p:plain
macOS でシュッと見れる範囲のデバイス情報たち

が、そのチップの音声に関する実装がおかしくて、48kHz なステレオを、片方のチャンネルのビットをひっくり返した上で 96kHz モノラルにガッチャンコした形で送ってきていて (???)、USB Audio Class としてのデバイスも 96kHz モノラルであると主張している、という妙ちくりんな感じになっている。Linux にはつい最近 quirk (特別対応) が入っており、最新に近いカーネルであれば正しく 48kHz ステレオ入力として扱えそうな感じ。その他の OS は……まあ……

ホンマかいなという気持ちで、macOS で適当なカメラを繋いだうえで音声だけ 96kHz で録音してみるとこんな感じであった。たしかにどう見てもそういう感じのスペクトログラムになっている (ログスケールになってたりして見にくいけど、24kHz 部分を中心とした線対称のようになっている)。

f:id:polamjag:20200910015919p:plain

ほとんどの動画配信サイトやビデオ通話では、たいてい音声のサンプリングレートの上限はせいぜい 48kHz とかになっているだろうし、エンコードされる際に人間の可聴域に合わせてばっさりローパスフィルタをかけられてしまうことも多いと思うので、実質的な挙動としてはステレオのうち片方のチャンネルだけが使われるモノラルであると言える。左右のチャンネルがミックスダウンされたモノラルではないことに留意する必要はありそう。Linux 以外の環境だと頑張るとステレオの信号がゲットできそう、という世界観。

というわけで、音声入力には難がある。あるのだけど、自分の手元には USB オーディオインターフェイスがいくつか転がっていたのであまり困らなかった…………。Web カメラ代わりにしたいパターンだと、マイクはたいていイヤホンとかについてるやつを使うであろうから意外とあまり困らないのではないかという気もする。ゲーム実況とかをしたいときは頑張ってほしい!!

github.com

GitHubMS2109 で検索してみたところ、Windows 上でこのデバイスのオーディオ入力をキャプチャして、別デバイスに正しいステレオ音声を出力することができそうなユーティリティを作っている人がいた (試してない)。世界は広い。試してる方は結構いそうで、予想通りループバックデバイスを介したりすることで OBS にステレオ音声を取り込んだりできそう、という感じであった。

www.kilinbox.net

macOS でも Audio Unit のプラグインみたいな形でなら自分でも頑張れば実装できるのではないかという気もする。


閑話休題、IPMI もどきのパーツとして使うとか、普段はディスプレイなしで運用してる自宅サーバのコンソールをちょっとノーパソに表示するのに使う、というのをやっている人たちがいておもしろい。たしかにサーバのコンソール出すのにノートパソコンの画面を使えればどれだけ楽だろうと思ったことはあるけど、これは思いつかなかった……。

akkiesoft.hatenablog.jp


というわけで、トータルではめっちゃ安くていい買い物だった、そして絶妙におかしな挙動で心をくすぐってくるのがむしろ愛おしくすらある、という感じです。2 台買ったのは、別に挙動が怪しかったからとかいうわけではなく、カメラを複数台使うライブ配信とかをこれでやれればおもろいかなと思ったからなんだけど、買って満足してしまっていて良くないですね、こちらからは以上です。

f:id:polamjag:20200910021045j:plain


追記

最近良く見る 1000 円くらいの HDMI キャプチャーカードについてのメモ - polamjaggy

これスマホでも使える。ホストケーブルで接続してUVCアプリ入れると普通にキャプチャー可能。

2020/09/10 20:07
b.hatena.ne.jp

たしかにこういうことをやっている人がいるのを Twitter でも見た気がしていたんですが忘れていました。そのときは iOS + iPadOS どっぷりなので関係ないんだよなと思った気もするけど、よくよく考えると Android スマホも OTP ケーブルも手元にあるやんけという事に気づいたので、Play Store で適当なアプリを入れて試してみたところ、面白くないくらいスッと認識されて普通に使えてしまった。

f:id:polamjag:20200910204431j:plain

*1:コロナ禍に入ってからサウンドハウスで関係ない買い物を一度したけど、深夜に注文確定したのがその日のうちに世田谷区に届いてめっちゃビビった。お急ぎ便か???

*2:映像のエンコードApple VT H264 Hardware Encoder

ffmpeg でオーディオ入力のラウドネスをリアルタイムに計測する

ffmpeg のオーディオフィルタには、EBU R 128 で採用されているアルゴリズム (ITU-R BS.1770) を用いて音声のラウドネスを計測できるものがある*1

これと、ffmpeg のオーディオ入力デバイスからリアルタイムに音声をキャプチャする機能を組み合わせることで、ffmpegコマンドライン上で動くリアルタイムラウドネスモニターとして使うことができる。

ffmpeg で各種入力デバイスから音声や映像を取り出す手段は OS ごとに異なる。macOS だと AVFoundation を用いるものが使えるし、Windows だと DirectShow、Linux であれば ALSA / PulseAudio + V4L あたり、というかんじっぽい。

AVFoundation でキャプチャするには、入力デバイスを番号で指定する必要があるので、狙ったデバイスをどの番号で指定したらよいのか一旦調べる必要がある。-list_devices というオプション付きで以下のようなコマンドを実行するとよい。

% ffmpeg -f avfoundation -list_devices true -i ""
(なんかめっちゃログが出る)
[AVFoundation indev @ 0x7fd68c521040] AVFoundation video devices:
[AVFoundation indev @ 0x7fd68c521040] [0] CamTwist
[AVFoundation indev @ 0x7fd68c521040] [1] Microsoft® LifeCam Studio(TM)
[AVFoundation indev @ 0x7fd68c521040] [2] CamTwist (2VUY)
[AVFoundation indev @ 0x7fd68c521040] [3] FaceTime HD Camera (Built-in)
[AVFoundation indev @ 0x7fd68c521040] [4] Capture screen 0
[AVFoundation indev @ 0x7fd68c521040] [5] Capture screen 1
[AVFoundation indev @ 0x7fd68c521040] AVFoundation audio devices:
[AVFoundation indev @ 0x7fd68c521040] [0] Microsoft® LifeCam Studio(TM)
[AVFoundation indev @ 0x7fd68c521040] [1] BlackHole 16ch
[AVFoundation indev @ 0x7fd68c521040] [2] Built-in Microphone

ここでは Built-in Microphone からの音声を処理してみたいので、2 番を指定したらよさそう、ということがわかる。

というわけで、以下のように実行することで、Built-in Microphone からの音声のラウドネスを計測できる:

% ffmpeg -f avfoundation -i ":2" -filter_complex ebur128 -f null /dev/null
Input #0, avfoundation, from ':2':
  Duration: N/A, start: 164969.992630, bitrate: 2822 kb/s
    Stream #0:0: Audio: pcm_f32le, 44100 Hz, stereo, flt, 2822 kb/s
[Parsed_ebur128_0 @ 0x7fc25912bfc0] Summary:

  Integrated loudness:
    I:         -70.0 LUFS
    Threshold:   0.0 LUFS

  Loudness range:
    LRA:         0.0 LU
    Threshold:   0.0 LUFS
    LRA low:     0.0 LUFS
    LRA high:    0.0 LUFS
Stream mapping:
  Stream #0:0 (pcm_f32le) -> ebur128
  ebur128 -> Stream #0:0 (pcm_s16le)
Press [q] to stop, [?] for help
Output #0, null, to '/dev/null':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
    Metadata:
      encoder         : Lavc58.91.100 pcm_s16le
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.0999792  TARGET:-23 LUFS    M:-120.7 S:-120.7     I: -70.0 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.211583   TARGET:-23 LUFS    M:-120.7 S:-120.7     I: -70.0 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.311583   TARGET:-23 LUFS    M:-120.7 S:-120.7     I: -70.0 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.411583   TARGET:-23 LUFS    M: -25.0 S:-120.7     I: -25.0 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.511583   TARGET:-23 LUFS    M: -25.2 S:-120.7     I: -25.1 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.623208   TARGET:-23 LUFS    M: -25.1 S:-120.7     I: -25.1 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.723208   TARGET:-23 LUFS    M: -24.9 S:-120.7     I: -25.1 LUFS       LRA:   0.0 LU
[Parsed_ebur128_0 @ 0x7fc25743c940] t: 0.834812   TARGET:-23 LUFS    M: -24.9 S:-120.7     I: -25.0 LUFS       LRA:   0.0 LU
^C
size=N/A time=00:00:00.89 bitrate=N/A speed=0.99x
video:0kB audio:161kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[Parsed_ebur128_0 @ 0x7fc25743c940] Summary:

  Integrated loudness:
    I:         -25.0 LUFS
    Threshold: -35.0 LUFS

  Loudness range:
    LRA:         0.0 LU
    Threshold:   0.0 LUFS
    LRA low:     0.0 LUFS
    LRA high:    0.0 LUFS

-i ":2" の部分がデバイスの指定。-i "[[video]:[audio]]" の形式でデバイスの番号を指定してくれとドキュメントにある。ここでの [] は optional ですよという意味であり、今回は video は必要ないので、単になにも指定しなければ良い。

また、最終的に null output に吐き出すことで、出力先のことを気にせずにフィルタだけ便利に使うことができる。


とはいえ、ふつうにリアルタイムにラウドネスを見たいだけなら Youlean Loudness Meter とかを使うほうが 100 倍くらい手軽だとは思う……。Free バージョンでも、プラグインだけじゃなくてスタンドアロンのアプリがついてくるので便利。

youlean.co

*1:EBU R 128 はラウドネスノーマライゼーションに関する規格で、ITU-R BS.1770 はその中で用いられているラウドネスの測定法である、という理解