未知のUSB機器をPythonで認識させてPC上で「越後製菓」と吠えさせる

古い購入物を整理していたら、不明なUSB機器出てきた。

AVerMedia Live Gamer HD AVT-C985。

フルHDのゲームプレイ録画がCPUに負荷をかけずにできるキャプチャボード「Live Gamer HD」を使ってみた
グラフィックカードからの出力信号を入力するとパススルーでディスプレイに出力しつつ、同時に同じ内容の映像を録画して記録できるビデオキャプチャボードが「Live Gamer HD AVT-C985(税込1万9980円)」です。PCで操作しているゲームなどのプレイムービーを録画できるだけでなく「Xbox 360」など、HDM...

配信に対応したPC内蔵型のキャプチャーボードっぽいけど肝心のキャプチャボードは存在しておらず、録画専用のボタンだけある……。

 

ゴミじゃん!

 

 

と思って処分しようと思ったけれど、ボタンを押してると あのCMが頭をよぎった。

 

正解は「越後製菓」!

TV-CM|知る・楽しむ|越後製菓株式会社

 

これ動かして「越後製菓!」「異議あり!(逆転裁判)」「へぇへぇ(トリビアの泉)」とか言わせてみたいな……

Windowsドライバから実装が必要ならハードルは高いけど、Windows10で一応認識はするみたい。

 

 

でググってみると似た内容の記事も見つかった。

AverMedia ReCentral USB Button
Hi, i changed a hid script i found here to support the avermedia HotButton, now you can execute autoit functions with the press of a stylish button. #Region ;**...

「Autoit」を使っているぽいけど、Pythonで簡単に動かせるんじゃない?

AutoItはWindows用プログラムのGUI自動操作機能を主な特徴としている。スクリプトは実行形式にコンパイル可能であり、コンパイルしたものはAutoItインタプリタのインストールされていない環境でも動作する。

未知のUSBデバイスをWindows上でPythonを使って動かしてみる

実際に行った手順を記載しておく。

次の方法で、どんなデバイスでも同じように動かす事ができると思ってる。

Step1)hidapi.dllをダウンロードして動作確認

hidapiの公式リポジトリからWindows用のバイナリをダウンロードする。

Releases · libusb/hidapi
A Simple cross-platform library for communicating with HID devices - libusb/hidapi
  • 最新のリリース(例: hidapi-0.14.0)を選択し、hidapi.dllを含むZIPファイルをダウンロードする。
  • Pythonの実行コードと同じディレクトリにhidapi.dllを置く。

その後、Pipで必要なライブラリをインストール。

そして実装コード。

System32とかPythonの実行ディレクトリではなくローカルフォルダにDLLを置いているので、DLLのパスを設定後に「import hid」をする必要がある。

途中で importするとコードが汚いので「importlib」を利用してハック的な書き方をしている。

これで print文が表示されているならPythonの実装環境は整った。

Step2)デバイスを接続してVendor IDとProduct IDを取得

次に未知のUSBデバイスをWindows PCと接続して、接続されているUSB機器の全情報を出力する。

USB機器を接続した状態で実行すると次のように複数のUSB機器が表示される。

VendorId: 0x45e, ProductId: 0x0, Product:
VendorId: 0x46d, ProductId: 0xc52b, Product: USB Receiver
…..
VendorId: 0x7ca, ProductId: 0x9850, Product:

で「VendorId: 0x7ca, ProductId: 0x9850」機器が「AVerMedia Live Gamer HD AVT-C985」のことを指している。

Step3)ボタン押下を監視して「Hello world」を出力

では今回の「Hello world」。

未知のUSB機器のボタンは一つだけなので、押されたら「Hello world」と返すような実装をしてみる。

結果は次のようにコンソール上に表示される。

【最初のバイト(\x01)】
通常、デバイスの状態を示す(例: ボタンが押されたかどうか)。

【2番目のバイト(\x01)】
押されたボタンのIDを示すことが多い。
例)2番目のバイト**(\x01, \x02, \x03

【残りのバイト(\x00\x00\x00\x00\x00\x00)】
他のボタンや追加の情報(例: 軸の位置、圧力センサーの値など)を示す場合がある。

Step4)ffmpegでmp3の無劣化カット

ここまで出来たら、あとは「いかに面白く応用するか?」だけ。

明らかに個人が用意したであろう「越後製菓ーーーーーーー!!!!!.mp3」が見つかったので、ここから必要なデータを抽出する。

越後製菓ーーーーーーー!!!!!.mp3 (越後製菓ーーーーーーー!!!!!.mp3) ダウンロード | sozai | uploader.jp
sozai より、越後製菓ーーーーーーー!!!!!.mp3 (越後製菓ーーーーーーー!!!!!.mp3) をダウンロードします。

コマンドはffmpegを使って次のとおり。

このファイルをPythonコードと同じディレクトリに入れておく。

Step5)そして完成へ

ボタンを押すと音を出したい。

音声出力は通常はシンプルなplaysoundを利用するが、クリック後のタイムラグを極力減らすために「pygameライブラリ(高速な音声再生が可能)」を利用する。

実装コードは次のとおり。

で、完成。

おわりに

保有知識+ChatGPT-4oを使ったら1時間ぐらいでやりたいことが出来てしまった。

正直ブログを書くほうが面倒だった。

 

で、一気に勢い&ノリで作ったが、作って周囲に使ってもらうと湧いたのは一瞬で基本は

 

 

状態だった。

加えて自身も全く用途が思いつかない。

ただ「USBデバイスを押すとWindows上で認識をする」という基本動作は応用できる技術だと思うのでブログとしてまとめておいた。

実は9年前にも実装した事があったけどね。

社内アイデアソンって参加するだけアイデア損
アイデアソンに参加したり、社内の文化祭的イベントで色々なプロト実装をしています。本業の実装は全く楽しくないけど、プロト実装は色々な技術と出会えるので面白いです。そのため、土日の深夜や通勤時間を使って調査やサンプル実装している...

ちなみにオンラインで遊びたいなら下記に色々なボタンがあるしMP3としてもDL可能(越後製菓以外)。

Myinstants - トレンドの面白い音 Japan の音
サウンドの再生はこちら
タイトルとURLをコピーしました