風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

1台運用のCear pavé(CP-4000)の音がBT-W6との組み合わせで化けた件

いきなり結論

Cear pavé(CP-4000)が1台だけの環境でも、Bluetoothオーディオトランスミッター(USBドングル)である Creative BT-W6に接続して以下のように設定することで音が別物のように変化したので、該当する環境*1のある方は騙されたと思って試していただきたい*2

なお、あらかじめこちらからOS(現状Windowsのみ)を選択してCreative Appをダウンロードした上でインストール&起動しておくこと。

  1. Creative BT-W6Cear pavé(CP-4000)を、ブルートゥース クラシック&ハイクオリティ/aptX Losslessで接続*3
    BT-W6とCear pavéをatpX Losslessで接続
  2. Creative Appの再生>オーディオクオリティにて、
    • オーディオクオリティを24 bit, 48000Hzに設定*4
    • ◉ スピーカーで、フルレンジスピーカー:ON、スピーカータイプ: デスクトップを選択
      オーディオクオリティは24bit,48000Hz・スピーカータイプはデスクトップに設定
  3. デバイスで、Acoustic EngineのSurround・Crystalizer・バスをONにして好みに調整
    ※自分の場合、サウンドモードで「ミュージック」を選んだ後、バスをONしたものをベースにした(ちなみにイコライザーはそのままか、なんなら私的にはオフでも可)
    Acoustic EngineのSurround・Crystalizer・バスをONにして調整

経緯

「20万円を超える3Dサラウンドが、いつでもどこでも手のひらに。」の謳い文句につられてクラウドファンディングで手に入れたCear pavé。

いざ手元に届いてたので試してみたら、音場が(それまで使っていたJBL Pebblesと比べても)狭くてサラウンド感もいまひとつだし、据え置きで使う分には不要だったり使いにくい機能が多かったりで、『うーん、微妙だなぁ、やっぱり複数台運用が前提なのか? ちょっと失敗だったかも』と思いつつ、まぁ音はそれなりだしと使っていたのだが。

Windows PCなのもあってずっと有線(USB-C)接続で運用していたのが、BT-W6との接続を試しているうちに、ふとAcoustic Engineを有効にしたら、『べっ、べつもの!?』というくらいに印象が変わるほど私的に好みのサウンドになって感動した、という話

低音はズンズンと響くようになったし、ボーカルはクリアになるし、音場も広がってサラウンド感が増した気がする(さすがに回り込むまではないけれども)。

たとえばシーイヤー株式会社さんの公式アカウントの方からおすすめされている再生音源

もちろんCear pavéの良いところを引き出すような音源を選ばれていると思うのだけれど、これもAcoustic Engineを有効にするとさらに飛躍した音に変わるので、ぜひ聴き比べていただきたい。

正直、イヤホン(Denon PerL Pro)でAcoustic Engineを試したときには『なにかいかにも作られたような感じの音で、好みじゃないな』とオフにしてしまったくらいなのだけれど、まさかCear pavéとの組み合わせがこんなにしっくりはまるとは思いもしなかった。

購入後8ヶ月も経過してからようやく、(少なくとも音に関してだけは)『買ってよかった』と思えるようになったことが、嬉しい。

まぁ、いまだに新しい発見がある、面白い(?)スピーカーだよ、ということで……。


*1:Windows PC+BT-W6+Cear pavé、まぁ少々(?)ニッチかも知れぬ

*2:もちろん「本当に騙された!」となっても責任はとらないけれども……まぁそのときには人の好みは様々ということであきらめて欲しい

*3:ここでは音質と接続安定性を優先してこう書いているけれど、ロー レイテンシーやLE オーディオであっても同様に効果はある

*4:96000Hzにすると、aptX Losslessや、別途Dolby Atmos for Headphonesなどの立体音響が無効化されてしまうので注意

Creative BT-W6とCear pavéでLE Audioのブロードキャスト暗号化モードを試す

はじめに

先日(主にeppfun AK3040Pro MAXと比較するために)勢いでCreative BT-W6

Creative BT-W6 - ヘッドホン / イヤホン - Creative Technology (日本)

買ってしまった

ひとまず、雑感などは

このツイート(ポスト)のツリーを書いたからよいとして、AK3040Pro MAXでできないことはなにかないかな? と考えてみたところ、Cear pavé(CP-4000)にLE Audioブロードキャスト(Auracast)のプライベートモード(ブロードキャスト暗号化モード)でつなげられるのではないかと思いつき、試してみることにした。

それというのも、Cear pavé(スピーカー)とCear core(専用トランスミッタ)の一般販売がようやく2024/12/25から始まるという案内があったのだけれど

シーイヤーパヴェ Cear pavé 一般販売のお知らせ - 音響のプロフェッショナル シーイヤー株式会社

このCear coreが¥11,000(税抜)となかなかいい値段がするので、あわよくばBT-W6で代替できればという思惑もあった(まぁ私的には正直、追加で¥40,000(税抜)出してCear pavéをもう一台買うかというと疑問符が付くので、単なる興味本位の割合が高いが)。

結論としては

  • ブロードキャスト暗号化モードで接続&再生は可能だった
  • 実用性には難あり(詳細は後述の問題点参照・ちゃんと使うには今のところやはりCear coreが必須な模様)

という結果になってしまった……残念。

BT-W6とCear pavéとをブロードキャスト暗号化モードで接続する方法

BT-W6をブロードキャスト暗号化モードにする

設定方法
  1. Creative Appから、デバイス>ブルートゥース デバイスの画面を開く
  2. 「LE Audio: ブロードキャスト モード」の「☑ ブロードキャスト暗号化」にチェックを入れて、パスワード(数字のみ・4文字以上)を設定後、「LE Audio: ブロードキャスト モード」を有効にする(ドングルのLEDが白のゆっくりとした点滅になることを確認)

LE Audio: ブロードキャスト モードの設定

なお、この画面で表示されるブロードキャスト名と設定したパスワードは後のCear pavéの設定で使用するので、メモしておくこと。

Cear pavéの設定変更

前提条件
  • 最新のCear pavé Appをスマホ等にインストールしておく
  • Cear pavéのファームウェアを最新(本体FW ver.2.0.4以降)にしておく
設定方法
  1. アプリをインストールしたスマホとCear pavéをBluetooth接続した状態で、アプリを起動して目的のCear pavéに接続
  2. [Cear Link Connect]ボタンを押す
  3. [Private]ボタンを押す(現状、Public→Privateに切り替えた直後ではName/Codeを入れられずに「pavéを再起動する必要があります」ダイアログが表示されてしまう模様。その場合は仕方がないので、[OK]ボタンを押し、Cear pavéの電源がOFFになったら電源を入れ、手順1から繰り返す)
  4. Creativew Appで表示されていたブロードキャスト名と設定したパスワードを「Name:」と「Code:」欄にそれぞれ入力し、「Send to pavé」ボタンを押す
    Cear Link Connect→PrivateでNAME/Code設定
  5. 「pavéを再起動する必要があります」ダイアログが表示されたら、[OK]ボタンを押す(Cear pavéの電源がOFFになる)
    pavéを再起動する必要があります
  6. Cear pavéの電源を入れ直す
  7. Cear pavé本体の[ボリューム -]ボタンと[マルチファンクション]ボタンを同時に*1、「CearLink mode」という音声が聞こえるまで(2秒程度)押しつづける(このとき、自分の環境だとUSBケーブルが繋がっているとうまくいかなかったので、外してから操作したほうがよさそう)
  8. しばらくして「CearLink success」という音声が聴こえたら接続状態なので*2、音声を再生してみて動作を確認

問題点

PC側から音量調整ができない

PC側でデバイス(BT-W6)のボリュームを変更しても再生音声には反映されず、また、ミュートもできない。
スピーカー本体の操作でボリュームの上下・ミュート/ミュート解除することは可能。
操作性が悪いし、複数台つなげることを考えるとまとめてボリューム操作ができないのは致命的。

これはこういう仕様なのか、BT-W6の実装がおかしいのか、どちらなんだろう……考えてみればOS側からはUSB DACとして見えているわけで、それで音量調整できないというのは不思議な気もする。
なお、Cear coreの場合、この動画等を見る限りでは、一括操作できそうに見える。
もともとのブロードキャスト(Auracast)は不特定多数のデバイスに送信する機能だから、各々のデバイスで個別に音量調整するというのは理にかなってはいるのか? 協調して鳴らすことを前提とし、全体の音量調整がCear coreで集中的にできるCearLinkが特殊なのかな?
……いや、そうじゃないな、やはりマスターボリュームとして送信側の音量が調整できない(アプリ毎には可能だが)というのは問題だろう。

追記(2025/02/06)

クリエイティブメディアカスタマーサポート様に問い合わせたところ、BT-W6でLE Audio: ブロードキャスト(Auracast)モード時にWindowsのマスターボリュームが効かない(数値は変更できても音量が変わらない・ミュートにもできない)のは、「Creative BT-W6の仕様による動作」なのだそう。トホホである(一応、先方にはダメ元で要望としてマスターボリュームが効くように修正して欲しいという要望は出しておいたが)。

動作が不安定

  • YouTubeの動画再生時に音が出ない場合がある
  • 再生アプリや設定を切り替えたりしていると、そのうちどれからも再生できなくなることがある(一度こうなると今のところドングルを抜き差しして再接続するくらいしか解決方法がみつからない)

暗号化なしモードだと繋がらない→暗号化なしモードでも繋がることを確認(2025/02/07更新)

Creative Appの「▢ ブロードキャスト暗号化」をオフにしたときのブロードキャストモードはCear pavéのPublicモードに対応するものだと思われるが、このモードでの接続方法がわからない。
 ↓
暗号化モード時に繋がっていれば、ブロードキャスト暗号化をオフにしても、Cear pavéをCearLink mode状態にすることで接続、再生可能だった。
この場合、Creative Appの「ブロードキャスト名」とCear pavéの「Name」とが一致していればよく、パスワードは考慮されない模様(Codeが一致していなくても再生可能)。

Cear pavéは普段、自動電源オフしないように適当なコードをLINE INにつなげているのだが、この状態だと[ボリューム -]ボタンと[マルチファンクション]ボタンを同時に長押ししてもCearLink modeにならないため、CearLink modeを使用する際には一旦コードを抜いておく必要がある模様。
なお、一度ブロードキャストで正常に接続できてしまえば、その後はLINE IN端子に接続してもそのまま使用できる。

その他(備忘用メモ)

ブロードキャストモード時、ユニキャスト接続をしておく必要はない

Creative Appの「LE Audio: ブロードキャスト モード」の設定とCear pavé側の設定が一致している場合には、暗号化有効(プライベートモード)/無効(パブリックモード)に関わりなく、「LE Audio: ブロードキャスト モード」を有効にしてCear pavéをCearLink modeにするだけで、ブロードキャスト(Auracast)で音声再生ができるようになる。

この際、(クラシック/LE Audioに寄らず)ユニキャスト接続をしておく必要もない(ブロードキャストしか使わないのであれば、ペアリング*3自体も不要)。

参考

Creative BT-W6

Cear pavé/Cear core

www.cear.co.jp

www.cear.co.jp

www.cear.co.jp

www.cear.co.jp

www.cear.co.jp


*1:Cear pavéの取扱説明書では「ペアリングモード2」となっている操作

*2:失敗時には「CearLink failed」という音声が聞こえるので、この場合には環境を見直してやり直す必要がある

*3:Cear pavéの取扱説明書では「ペアリングモード1」となっている操作

eppfun AK3040Pro MAX関連の備忘録

はじめに

Amazonブラックフライデーセールで音質特化型TWSイヤホンであるDenon PerL Proを購入したのだが、せっかくaptX Losslessをサポートしているので手持ちのWindows 10のPC(Surface Book 2)でも体験したいと思い、ついついUSB-C LE Audio対応Bluetoothオーディオトランスミッター eppfun AK3040Pro MAX まで買ってしまった

こちら、性能面ではわりあい満足できたものの、UI面では

  • アプリなしで、たった一つのボタンのみでLEDのみを参照しながら操作するようになっているため、操作方法を覚えるのが面倒
  • 付属の操作説明書(ファイルとしてはeppfun AK3040Pro MAX Japan User Manual for v2.0.pdf)が簡素すぎてわかりづらい

という不満点があった。

そこで、自分用に各種操作とそれにともなう状態変化の概要を図にまとめてみたので、備忘として記事にしておく。

eppfun AK3040Pro MAX動作概略図

※元画像が10562x7100なのではてなブログだと縮小されて見難くなってしまう。原寸画像が必要な場合、こちらからダウンロードするなりしてほしい。

eppfun AK3040Pro MAX動作概略図

  • 操作説明書v2.0の操作ガイドを元に、自分の備忘として作成したもの
  • 一部操作説明書には記載されていなくても実際に経験した動作に基づき推測した内容が含まれているが、当然すべて網羅できているわけではないし、内容の正確性についても保証しない(間違いや過不足などについての指摘歓迎)
  • 再配布については特に制限は設けないが、良識に基づいての利用を期待

eppfun AK3040Pro MAXに関するFAQや誤解など

自分がはまった点や、Twitter(自称X)上などでAK3040 Pro MAXに対して言及しているもので、あきらかに誤解っぽいな? と思ったものなどに関するメモ。

ファームウェアの更新ができないものがある?

Amazonの製品ページ上では

aptx lossはアップグレードすることで、問題を解決することができます。Webアドレス:https://www.eppfun.com/file-share >AK3040ProMAXをダウンロード。

とあり、リンクされているページからはAK3040Pro MAX用のファームウェア(2024/12/13時点では「eppfun AK3040 Pro MAX V3.0(0528).zip」)がダウンロードできる。
ところが、これを適用しようとしても適用できないケースがある(実際に自分の購入したものも正しく適用できなかった)。

具体的には

  • 更新前のバージョンが「1.0.1」なのに、更新後は「0.0.0」と表示されてしまう
  • 再度ファームウェアを適用しようとしても、更新前のバージョンは「1.0.1」のまま

AK3040 Pro MAXのファームウェアが正常に更新出来ない様子

ただ、ファームウェアの日付は最新(V3.0)で2024/5/28となっており、その一方で自分の購入したものだとUSB Device Viewerで確認すると

USB Device Viewerでeppfun AK3040Pro MAXを見てみたところ(一部)

iSerialNumberのところが"20240822V1.0.8"となっており、これが製造日近辺を示す数字だと仮定すると、既に更新済みのファームウェアになっているのかも知れない。

上記Amazonのページでもよく見ると

製品が正常に使用されている場合は、ソフトウェアをアップグレードする必要はありません。アップグレード前にお問い合わせください。問題を確認してから操作してください。

とあるので、とくに問題なく動作しているようであれば、気にしなくてよいのかも(もちろん、気になる方はお問い合わせを)。

■2024/12/21追記
2024年12月17日付けでファームウェアが更新されていた。
ファイル名は「eppfun AK3040Pro Max V6.0(1215).zip」(解凍したフォルダ名は「eppfun AK3040Pro Max V4.0(1215)」になっているのは謎……)。
こちらだと、自分の環境でも無事更新できている模様(バージョンが1.0.1→1.1.2に)。

eppfun AK3040Pro Max V6.0(1215).zipを適用するとバージョンが1.0.1→1.1.2に

ボタンを押してもモードが切り替わらない?

aptX Adaptive対応のイヤホンを接続したところ、ペアリングは成功して接続されたものの、LEDが青のまま、ドングル(AK3040Pro MAX)のボタンを押しても色が変わらなかった。
とりあえず、音声再生ができるかを確認しようと音楽を鳴らすと、LEDの色が変わり、その後はドングルのボタンで切り替え可能となった。
どうやら、いったん何らかの音を再生した後でないと、モード切り替えが出来ない(ことがある?)模様。

aptX Losslessモードにできない?

せっかくDenon PerL ProをaptX Losslessで使うことを期待して購入したのに、最初はなぜかaptX Adaptive HD(96k/48k)までしか接続できなかった(LEDが赤にならない)

いろいろ調べたところ、aptX Losslessにするためには、以下の設定が必要だった模様。

マルチペアリングはできない?

実際には複数のデバイス(SNK)とペアリング可能(同時接続はひとつのみ(Auracast時除く)*3)。
自分が試した範囲では、少なくともClassic Bluetoothデバイス4台+LE Audioデバイス1台ののべ5台分*4は記憶された模様。

ただし「マルチペアリング」がClassic Bluetoothの「2台(以上)の同時接続(同時(同報)再生)」を意味しているのであれば、これはできない。
同じ音源を複数の再生デバイスで同時再生しようとするのであれば、Auracastを使うしかないと思われる。

ドングル(AK3040Pro MAX)経由で接続したイヤホンはヘッドセットとしては使えない?

eppfun AK3040Pro MAXの場合(説明書には明記されていないが)どうやらHFPプロファイルはサポートされているようで、イヤホンのマイクを通しての音声入力は利用可能。
入力デバイスとして「ヘッドセット マイク (eppfun AK3040Pro MAX)」を選択すればよい。

ただし注意点として、通常は音声再生専用のモードで動作しているため、マイクを使うためには(これは説明書に記載の通り)ドングルのボタンをダブルクリックして通話機能モードに切り替える必要がある(このとき、ドングルのLEDは青色の点滅(1.5s間隔)となる)。
また、ドングルとしてはaptX Voiceにも対応しているため(これも説明書には記載されている)、イヤホン側も対応しているのであれば、質の良い音声入力になることが期待できる。

なお、LE Audioモードでも同様の通話機能モードが用意されている。
ただし、自分のところでCear pavéで試してみたところではマイク入力することはできなかったため、実動作については未確認*5

ちなみにAK3040Pro MAXには4極φ3.5mmのピンマイク(?)が付属しているが、こちらはBluetoothとは関係なく、通常はおよそ使い所はないと思われる。
一応、PCのマイク入力に挿せばマイクとしては使えるようではあるが、性能はお察しだろう。

距離の問題などで切断した後、再接続されない

イヤホン等のデバイス(SNK)と切断された際、再接続待機状態(LED青色点滅(0.5s))になる場合があり、このときには(通信圏内に戻っても)うまく再接続されないことがある模様。
この場合、ドングルのボタンを1回クリックすると、通常の待機状態(LED青色点滅(2s))に切り替わるので、通信圏内なら再接続される模様。

最初普通に使えていたのに途中からホワイトノイズが入り続けて使えなくなる

自分の場合はPC側のUSBハブとの相性だったらしく、違う端子に変えたら現象が発生しなくなった。
汎用的な解決方法があるのかは不明。

LE Audioの「Low latency gaming mode」ってなに?

操作説明書の「4.LE AUDIO Bluetooth a.コーデックの切り替え:ボタンをクリック」のところで、

Low latency gaming mode: White

なるものがあるが、これはどういうものなのか。

確証はないが、同じチップセットを使っていると思しき*6Creative BT-W6に搭載されているGaming Audio Profile(GMAP)と同じものではないかと推測できる。

Gaming Audio Profile(GMAP)は、Bluetoothデバイスがゲームオーディオをうまく処理できるようにするための特別な命令のセットです。LEオーディオモードのGMAP対応デバイスで低遅延を実現するには、この設定をオンにしてください。

LE Audio対応のデバイス(SNK)なのにLE Audioが使えない

操作説明書の「注意事項(正式に使用する前に必ずお読みください)」に

2.現在、LE AUDIOの世界的な標準は完全に普及しておらず、本製品は現在、 クアルコムチップ方案のLE AUDIOのみをサポートしているが、他の方案のLE AUDIO はしばらくサポートしておらず、他のブランド標準のLE AUDIO受信側と接続する と、ミスマッチの問題がある可能性がある。

とあり、少なくとも現状では、デバイス(SNK)側もQualcommのチップセットでないとLE Audioは利用できないくらいに考えておいたほうがよさそう*7

なお、このあたりの事情は、Creative BT-W6でも同様らしい

LE AudioモードでCear pavéには繋げる?

ユニークなポータブルスピーカーであるCear pavé 2nd Generation(CP-4000)は、CearLINK(Auracastをベースにしたシーイヤー株式会社の独自技術)により、複数台と同時に通信することでCear Fieldという仮想音源を作りだすことができるが、そのためにはCearLINK専用トランスミッターであるCear coreが必要。
ただし2024/12/14現在、CearLINKは一般販売はされていない*8
 ↓
2024/12/25より一般販売が開始された。
cear.tokyo

Cear pavéはQualcomm Snapdragon Soundに対応しているため、aptX LosslessをはじめとするAK3040Pro MAXで設定可能な各種コーデックをサポートしている。
LE Audio(LC3)にも対応しており、チップセットが同じQualcomm製であるためか、AK3040Pro MAXとの相性も問題なく、接続可能。

また、CearLINKはAuracastの拡張であるため、AK3040Pro MAXからのAuracastによるブロードキャスト機能にも対応できる(……と考えていたが、どうも怪しいかも。後述)。

自分はCear pavéを1台しか所持していないため、LE Audio/Auracastは単体での動作しか確認していないが、こちらの記事(「シーイヤーパヴェ Cear pavéのAuracast複数台接続機器や方法について」)では2台接続できた事例が紹介されている

AK3040Pro MAXでは素のAuracast(ブロードキャスト)となるため、複数台に同じ音声データが送信されることになるが、専用アプリ(Cear pavé App)のCear Link Positionにて各スピーカーそれぞれに位置取りを設定しておけばサラウンドのような音場を構成できそうではある。

AK3040Pro MAXのAuracast(ブロードキャスト)対応はどうも怪しいかも? [2025/02/08追記]

少なくとも、Cear pavéへのブロードキャストの場合には

  • AK3040Pro MAXにAuracast用のブロードキャスト名を設定する方法(またはデフォルトで入っている名前を取得する方法)が見つからない(アプリ(Assistant)がない)
  • こちらの記事のように、Auracast受信では本来は必要ないはずの(Bluetooth Classic/LE Audioユニキャスト用の)ペアリングする必要がある
  • Cear pavéをCearLinkモード(ペアリングモード2)にしていない

にもかかわらず、つながってしまうのが不思議である*9


*1:なおCreative BT-W6においても、Denon PerL Proを名指しで、空間オーディオを無効にする旨のFAQがある

*2:サンプルレートを96000Hzにしていると、aptX Adaptive HQ 96Kでの接続となり、aptX Losslessモードにはならない・これはCreative BT-W6でも同様のようなので、aptX Losslessの仕様(チップセットの制限?)な模様

*3:Auracast(ブロードキャスト)での複数動作については、対応するデバイスを複数所持していないため未確認

*4:イヤホン3台(Denon PerL Pro・OpenRock Pro・Hamcoc T06)+スピーカー1台(Cear pavé)・なおCear pavéはClassicとLE Audioそれぞれのモードでペアリングしたため、2台分としている

*5:Cear pavéの場合はClassic Bluetoothでもダメだったので、自分の設定が誤っている可能性もある・なお、USB Audio ModeはVOICE CHATに切り替えても試してはいる

*6:Creative BT-W6にはQCC3086が搭載されている模様(こちらのInternal Photosに写っている)

*7:実はQualcommさんはあまりLE Audioに対して積極的じゃないのか?……などと考えてしまうのは、下衆の勘繰りかな……

*8:現在販売されたのは2023〜2024年のクラウドファンディングと、2024年の仮予約経由で申し込まれたもののみで、仮予約も終了している→2024/12/25に一般販売が開始された

*9:なんとなく、Cear pavé側はまだユニキャストで接続されているつもりでいて、Isochronous PDU上のブロードキャスト用のもの(Broadcast Iso)を、よく検証せずにユニキャスト用のもの(Connected Iso)として受信しているような気がする

Twitter(X)関連拡張機能の開発中止と公開停止について/Discontinuation of Development and Publication of Twitter(X)-related Extensions

2024/02/15追記 / Added on February 15, 2024

Edge アドオンやChrome ウェブストアで「X メディアダウンローダ」といった名前で配布されているアドオンや拡張機能が存在するようです。
どうやら中身は自分がかつて配布していたものとほぼ同じもののようですが、当然ながら自分はこれらの配布にはまったく関わっておりませんので、ご留意願います。
なお、オリジナルはオープンソースソフトウェア(MIT License)として配布していたものですので、流用を止めることはできません。
It seems that there are add-ons and extensions available on the Edge Add-ons and Chrome Web Store named "X Media Downloader" that closely resemble something I once distributed.
However, I must clarify that I am in no way involved in the distribution of these current versions. Please be aware of this.
Additionally, the original was distributed as open-source software under the MIT License, so I have no means to prevent its reuse.

2023/09/26追記 / Added on September 26, 2023

Twitter(X)関連の拡張機能等の開発に関するメールやDM等での個別のご相談(開発継続・リポジトリ公開・買い取り等のご要望、他)には応じかねますので、ご了承願います。
Please note that I cannot accommodate individual inquiries via email or DM etc regarding the development of extensions related to Twitter(X), including requests for continued development, repository publication, or acquisition. I appreciate your understanding.


2023/09/16追記 / Added on September 16, 2023

拙作Twitter(X)関連のブラウザ拡張機能(ユーザースクリプト含む)を、各ストアおよびGitHubリポジトリにて非公開にしました。
My Twitter(X)-related browser extensions (including userscripts) are now private on the respective stores and GitHub repository.


残念なお知らせUnfortunate Announcement

諸般の事情により

をはじめとした、拙作Twitter(X)関連のブラウザ拡張機能(ユーザースクリプト含む)の開発および公開を中止致します。

各ストアやGitHubリポジトリ等は2023年9月16日を目処に順次非公開(配信停止)とする予定です。

ご愛顧ありがとうございました。

Due to various circumstances, I will be discontinuing the development and release of my Twitter(X)-related browser extensions, including:

I plan to gradually make them unavailable (stop distribution) on stores and GitHub repositories around September 16th, 2023.

Thank you for your patronage!

ひとりごと

2014年に近傍ツイート検索を作成して以来、断続的とはいえ9年以上に渡って続けてきたTwitter(X)系のブラウザ拡張機能の開発を中止とするというのは自分でも大変残念ではありますが……まぁいろいろな意味で無理になってきたので、潮時かなと。

……察して頂けると幸いです。

「有料でもいいから」というお気持ちはわかるのですが……


正規のAPIはこちらのページによると、

コース Basic Pro
月額 100ドル 5000ドル
取得ツイート数上限 1万 100万

これは1プロジェクトあたりにかかる制限なので、ユーザー毎に煩雑なプロジェクトの設定と、料金の(X社への)支払いが発生してしまうことになります。
しかし…Basicの月1万ツイートなんて、拡張機能のヘビーユーザーだった方なら確実に足りなくなる分量ですよねぇ……。
で、そこまでしても

  • 正規のAPIではWeb版やアプリでは使用できる機能が使えないことが往々にしてあるため、拡張機能のために必要な情報が取得できない可能性がある
  • サードパーティ製のTwitterクライアントが否定されたように、そもそも不特定多数のエンドユーザーが使用するような使い方はおそらくもはや想定されていない(開発者規約上も、拙作拡張機能のようなものは認められそうにない)

などなど、どうしても無理があるのですよね……。

AES-GCMでの暗号化/復号の例(JavaScript(Web Crypto API)←→Python(PyCryptodome)相互変換可)

JavaScript(Web Crypto API)で記述されたAES-GCMを用いた暗号化/復号処理をPython(PyCryptodome)にデータ互換性をもたせながら移植しようとしたところ、いくつかハマりどころがあったのでメモしておく。




ハマりどころ

Pythonに入れたPyCryptodomeが動作しない!?

Windows 10 Pro上にインストールしてあるPython 3.11に普通に

$ pip install pycryptodome

で入れているのに、

from Crypto.Cipher import AES

とかしても

ModuleNotFoundError: No module named 'Crypto'

となってしまう現象に悩まされてしまった。

結論としては、PyCryptodomeが入ったフォルダ名が

C:\Python311\Lib\site-packages\crypto

になっていたという……これを手動でcrypto→Cryptoに変更したら、無事に動くようになった。
どうも、ときどき発生する現象である模様……以前に入れたり削除したりしたモジュールの中に小文字でフォルダを作ったものがあったからか?

MAC tagはどこ?

PyCryptodomeではcipher.encrypt_and_digest()で暗号化したときの戻り値としてciphertextの他にMAC tagが存在する
ところが、JavaScriptのcrypto.subtle.encrypt()では、戻り値はciphertext(を含むArrayBuffer)のみで、MAC tagが見当たらない。
でも、AesGcmParamsではtagLengthを指定できる(未指定の場合は128ビット)ので、MAC tagの作成自体はしているはず……(実際、得られたciphertextをそのままMAC Tagを指定しないでdecryptしようとしてもうまくいかない)。

いろいろと調べてみた結果、crypto.subtle.encrypt()の戻り値の最終16オクテット(tagLength(128)ビット)がMAC tagに相当し、正味のciphertextはこれを除いたものであるらしい
PyCryptodomeでcipher.decrypt_and_digest()にわたす際にはこの点を留意する必要がある。

nonceはどこ?

PyCryptodomeだと、AES-GCMの場合にはAES.new()でnonceパラメータを指定する必要があるが、JavaScriptのコードを一見したところ、nonceが見当たらない。
どうも、JavaScriptのcrypto.subtle.encrypt()の第1引数(AesGcmParams)にある「iv」というパラメータ(初期化ベクトル(IV=Initialization Vector))が、nonceに相当するらしい。
AES.new()ではivとnonceは別パラメータとして存在し、MODEによってどちらを設定するか決まっている模様(MODE_GCMではnonceを設定)

additionalDataってどう扱えば?

JavaScriptのcrypto.subtle.encrypt()の第1引数(AesGcmParams)にはadditionalDataというパラメータがあるが、これはPyCryptodomeでどう扱えばよいのか?
そもそもadditionalDataは、それ自体は暗号化されないAAD(additional authenticated data、追加認証データ)であるらしい。
こちらも調べてみると、どうやらcipher.update()で指定すればよいらしいことが判明。

その他

今回調査した実装だけの話だけれど、cipher.decrypt_and_verify()を呼び出した際に、"ValueError: MAC check failed"が出たり出なかったり不安定という謎の現象が発生。
かなり悩んだけれど……実はpasswordを複数の候補からタイムスタンプを元に選択するような仕組みになっており、かつ、一連のシーケンス中で得られるデータ中に微妙に異なるタイムスタンプが複数箇所にあるけれど(仕様書もないために)どれを使えばよいのか不明で、間違ったものを使うと誤ったpasswordを選択してしまうことがある(たまたま一致していて通ることもある)というややこしい状況だった(その後、正しいものを特定するのにもかなり時間を要した……仕様書は大事)。

実装例

JavaScriptとPythonの具体的な実装例を掲載しておく。
それぞれで定義しているaes_gcm_encrypt()で暗号化したデータは、お互いのaes_gcm_decrypt()でも復号することが可能となっている(はず)。

JavaScript(Web Crypto API)用

関数仕様

ソースコード

Python(PyCryptodome)用

関数仕様

ソースコード