落胆がらくた街

多分三日坊主で終わると思うんですけど

バイノーラル録音システムを自作する Part3:アンプ実用編

とりあえず普通のマイクシステムとして使う例

バイノーラルかどうかは電気的には関係ないので、とりあえず「モノラルのECMアンプ」として使ってみる。
アンプの入力部は標準的なステレオミニプラグ(L=ドレイン、R=ソース、GND=GND)を採用したので、マイク側は三線改造した上で百均のイヤホン何かに繋いでおく。

すっかり保留にしてきたマイクの三線改造だが、今回はEM158を例に挙げる。
EM158の改造に関しては下の記事が詳しい。
1913 :プリモ EM-158三線式改造法(改良版) | ShinさんのPA工作室
一点補足すると、ミニルーターは必須で無い。
アクリル板なんかを加工するのに使うプラカッターなどで削っていけば手動でも十分加工できるぞ。
f:id:suzumodoki:20190522223136p:plain

で、このEM158は、秋月で手に入る他のEMC(WM61やその互換品、C9767等)と違い、有能ポイントが一つある。
マイクカプセルのケースにハンダが乗る事だ。
その為下記画像のような、ドレインとソースだけ配線してGNDはケースにくっつけるという荒業ができる。
f:id:suzumodoki:20190522221713p:plain
ケースは標準的なRCAジャックだ。100均のイヤホンなりステレオ延長ケーブルなりを捌いて予めマイクに繋いだあとジャックの穴を通し、
RCAジャックの口のところにEM158がぴったり乗っかるのでケースをはんだ付けすれば出来上がり。
困難なマイクへのはんだ付けも、GND一本分ケチれるのでかなり楽に済む。
f:id:suzumodoki:20190522222644p:plain

なおバイノーラルマイクであればパネル取り付け式のRCAジャックを使うと便利。

つかってみる

最近こういう事をして遊んでいるので、よかったら見てみてね。
www.youtube.com
5月以降の動画は上記のマイクで録音しているよ。

バイノーラル録音システムを自作する Part2:ECMアンプ回路

ECMアンプについて

目的:3線改造したECMを入力に受け、オーディオインターフェースのXLRに出力できるアンプを作る
ECMの3線改造については後述
何が便利なのか:秋月とかで売ってるECMを高音質でPCに取り込める

完成像

f:id:suzumodoki:20190521154732j:plain:h480
f:id:suzumodoki:20190521154734j:plain:h480
アルミケースは偶々もらったものを使ったが、買うと1000円前後するので、既成品から剥ぐなり100均で似たようなもの探すなりしてもいい。
金属製でないと電磁波ノイズ直撃で最悪の場合AMラジオ拾ったりするので、どんな安物でもいいから金属ケースで覆う事を推奨。
コネクタやスイッチ類は手元にあったものを流用したが、これもジャンクから引っ剥がしたりしたモノで大抵事足りる。
XLRコネクタだけはケーブル共々サウンドハウスが安く売ってくれるが、別に直接基盤からケーブルを生やしても問題無い。

機能ブロック図

f:id:suzumodoki:20190521155759p:plain:w480
発想は至ってシンプルで、TPS7Aで作った綺麗な8Vをマイクとオペアンプに供給し信号を増幅するだけ。

回路図

f:id:suzumodoki:20190521194644p:plain:w640
オペアンプ回路を知っている人であれば教科書的な回路に見えると思う(というか自分がその程度の回路しかつくれない)。
ECMソースフォロワ→非反転増幅しつつコールド出力→反転増幅1倍でホット出力のバランス構成。
以下、各素子の詳細と定数の理由。

R1…マイク内蔵のFETと共にソースフォロワを形成する。内蔵FETの詳細はデータがないので470~10kくらいでいい感じに音が取れる数値を総当たりする。
わんぽいんと:ここをボリュームにして、繋ぐマイクに合わせて手動でソース抵抗を変えられるようにするのもアリかも?

C1…カップリングコンデンサ。R10と合わせてHPFを形成する。0.22u~10u程度を推奨。あまりデカいと放電モード時R1で引き抜けなくなる。

R2…VR1と合わせて、オペアンプの帰還抵抗を形成する。VR1が0の時帰還抵抗が0になるのを防ぐため挿入。

R3…オペアンプの帰還抵抗の一部。非反転増幅回路なので、全体ゲインは(R1+VR1)/R2。

C2…オペアンプの直流に対する利得を1倍にする為挿入。そこそこ大きくないと低域が落ちる。4.7u~推奨。

C3…カップリングコンデンサ。C1以上なら音質に影響ないはず。R4とHPFを形成するので、本当はC1=C3、R4=R10が望ましいが誤差。

C4…うっかりファンタム電源をONにしちゃった時の保護用コンデンサ。耐圧50V以上、両極性。一応信号をカップリングするのでC3の3倍程度取る。

R4…C3、C4放電用兼HPF形成。

R5…反転増幅回路の入力抵抗。ざっくり計算だが10kより少ないと周波数特性が落ちこれより大きいとノイズに弱くなる。

R6…反転増幅回路の帰還抵抗。R5とR6は高精度の抵抗を用いぴったり1倍に近づける事を推奨。

C5…カップリングコンデンサ。両極性、耐圧50V以上。容量はそこそこ大きけりゃあとは適当。今回はC4と同じに。

R7…C5放電用兼HPF。

R8…バイアス電圧生成用。大きいと高インピーダンスの影響で、小さいと熱雑音の影響で音質に影響する。1k~10kが妥当?

R9…同上。

C6…バイアス電圧の直流安定を得るため挿入。10uはでかすぎる気がするけどまあいいか!最悪無くても良い。

R10…バイアス電圧を信号に乗せるための抵抗。交流的には接地されている為C1とHPFを形成する。

R11…同上。ちなみにR4、R7、R10、R11は同じ値が望ましい。


ちなみにオペアンプはNJM4580DDを採用。だって安いんだもん。
あとはユニバーサル基板にざっくりはんだ付けして完成。一点アース?知らんな!w

バイノーラル録音システムを自作する Part1:概要

バイノーラル録音したい。音フェチやりたい。でも金が無い*1
というわけで廉価かつ高音質な録音環境を自作した。なんやかんや大規模になってしまったので数パートに分割して書く。
本記事は全体像の紹介だ。

説明!!

制作の目的を以下に挙げる。

  1. バイノーラル録音に耐える音質である
    1. 歪率が許容できる範囲内である
    2. S/N比がマイクカプセル本来の性能にできるだけ近い
  2. 最終的な材料費を3000円程度とする
    1. 秋月電子で買えるECMを使用する
    2. 家庭で出るガラクタや一般に入手できる廃品の流用を採用する*2
  3. 手元にあるオーディオインターフェースがXLR入力×2を持ってるので、出力はこれにつなぐ

なお、昔イヤホン型の小型バイノーラルマイクを作ったが、今回はEMCソースフォロワ改造+外部電源方式+オペアンプ使用のリッチな方式だ。
机の上でパソコンに繋いで録音するならこちらの方が遥かにいい音が録れる。当時自分が未熟だったのもあり、今だとこっちがよっぽどお勧めだ。

設計

まず最初に最終型がどうなったかを書く。
f:id:suzumodoki:20190515055502p:plain
マイクアンプは「3線式ECMだけを対象にする」と決め打ってしまい、マイクの交換がしやすいようステレオミニプラグで接続する。
ここはマイクとアンプを3本の線で繋げられれば何でもいいのだが、ステレオミニプラグは100均で買ったイヤホンを捌けば手に入るのがポイント。

アンプ本体は当初A/Iからのファンタム駆動を考えていたが上手くできなかったので、秋月9Vアダプタ+TPS7A4700というDC-DCコンバータを採用した。
TPS7Aというのは本システム最高のお値段がする財力の暴力で、こいつだけで1100円する。後述するがこれを9V電池に置き換えると10回交換するまでは安く済む。
スイッチングアダプタは秋月で買った9Vのものを使ったが、レギュレータで電圧を落とす都合上9~12Vの製品であれば適当なものを流用してもいい。

あとはマイクから3線を引き出してステレオプラグを生やし、アンプ→A/Iと繋げば音が取り込めるわけだ。
秋月ECMはもちろんの事、既成品の安物マイクもECMが使われてさえいればちょっとした改造でそれなりの音質に化ける。
例えばこれ。→iBUFFALO マイクロフォン ミニクリップ ブラック BSHSM03BK バッファロー
1レッドブル強で買えてしまうが、バラして3線改造→自作アンプに接続とする事でそれなりの音質が叩き出せてしまう。

つまりこのアンプは「ECM専用マイクプリ」と言える。

*1:結局ボツにしたネタやデータ取りの費用でバイノーラルマイクが買えた

*2:ブログ名の由来でもあるので無理してでもやらないとアイデンティティに関わる

BM700(or BM800)の動作について考えてみた

この記事は概ね下記ページの翻訳である。
Basic FET Circuits for Mics

BM700って何

大体1500円くらいで買える中華安物マイク。BM800もマイナーチェンジらしく回路は同一らしい。
国内外を問わず「安物マイクだが改造すると音が良くなる」という事で、一部のキモ・オタクから人気の製品だ。
ところが回路の意味がイマイチ分からず、結局日本語でそれらしい解説をしてる記事がなかったので備忘録がてら記事にする。

そもそもの課題は何か

何故たかだかマイク一つにこんな苦労をするかと言うと、「一般に使われるマイクプリアンプは最近主流のエレクトレットコンデンサマイク(以下ECM)用にできてない」からだ。
マイクには「ダイナミック」「コンデンサ」「エレクトレットコンデンサ」の3種類が存在し、入力機器側もそれぞれ「Hi-Z入力」「ファンタムありのXLR」「プラグインパワー」と対応している。
ECMは元々廉価で小規模なプラグインパワーでの動作を想定されており、うっかり高音質なECMが時代の流れでできちゃったもんだから、
「本来コンデンサマイク用のファンタム電源しか無い録音機材業界で、なんとかECMを駆動させたい」という需要ができたわけだ。
極端な話、高品質なプラグインパワー端子がオーディオインターフェースに乗っかっていれば、こんな悩みも無いのだが、そういうわけにはいかんので「ECM←→XLRファンタム変換回路」が必要になる。
今回扱う回路もそんな回路の一種だ。

Shoeps Circuit

まずBM700の回路について考える前に、Shoeps回路と呼ばれる、XLR接続・ファンタム電源印加でECMを駆動させる回路について考えよう。
先程の翻訳元のページから、下記回路図を拝借した。これがShoeps回路の基礎である。
f:id:suzumodoki:20190514020242j:plain
大まかな流れとしては、

0.XLRからやってきた48Vから上手いこと電流を引き出す(赤枠)
1.マイクカプセルの出力はカスなので初段増幅(青枠)
2.XLRは2つの端子に逆相で信号を乗せないといけないので信号を変換(緑枠の部分)

といった感じ。で、一番わけがわかんねぇのは緑の部分、PNPトランジスタが2つ並んでいるやつだ。
共通部分から電流を取り出すところや、逆相を増幅するところは一見差動増幅回路のようだが、これは差動増幅回路ではない。
なんなら厳密なバランス回路でもない。多分。

アヘ顔ダブルエミッタフォロワ

ファンタム電源は言うなればプリアンプ側から不完全な回路を提供される方式なので、プリアンプ側も踏まえた回路図が下図だ。
f:id:suzumodoki:20190514023947p:plain
トランジスタがNPNなら差動増幅回路っぽい気がするが、こいつはPNPを2つなので、「コレクタがつながってるだけの別々のエミッタフォロワ」らしい。
すると電圧利得は実質ゼロなので、ゲイン上げたきゃプリアンプ側に任せろという発想だ。
コレクタから100kの抵抗でベースに戻しているのも、自己バイアスを利用しているだけなので教科書的な回路と言っていい。
もっとも、PNPトランジスタの実践的な小信号増幅回路は教科書すらろくに無いんだが。

いざBM800へ

正直BM800の回路に関しては、下記ページが最もわかりやすく充実しているので、最早今更言うことがない。
エレクトレット・コンデンサ・マイクBM-800の改良
若干補足すると、回路の全体像は概ねShoeps回路そのもの。ただし電源の特性を改善する為ツェナー+レギュレータ回路を採用している。
またHOT・COLDの直後に22nFと47Ωの抵抗がぶっ刺さっているが、これはノイズを改善するためのものらしい。

上記ページからリンクが貼られているが、防振など物理的な改善に関してはいつものパナ改の方が記事を上げている。
1603 :Amazonの超激安コンデンサマイクが高級機に変身する改造(第1編) | ShinさんのPA工作室

今後の課題

秋月で売ってるイサハヤのPch JfetでPNPトランジスタ置き換えて、自前のShoeps回路組んでみたい。でもまだ回路理解しきれてない。

tf-openposeで実際に遊んで見る

  • がいよう
  • デフォルトでの動作
  • run_webcamを改造する
  • run_webcam2.pyの全貌

がいよう

前回の記事↓で動かすところまで書いたtf-openposeで実際に遊んでみる。
tf-openposeをWindowsで動かす - 落胆がらくた街
動作確認はWindows 8.1(64bit)、GPUはGTX750Tiで行ったが、このグラボメモリが2GBしか無くはっきり言ってギリッギリだ。
今からハードウェアを調達するなら最低でもメモリが4GB乗ってるGTX1050Tiあたりがいいだろう(欲しい)。

以下、具体的に試してみたtf-openposeの改造について書く。出来上がったソースコードも記事末尾に纏めて載せてあるぞ。

デフォルトでの動作

tf-openposeのディレクトリにrun_webcam.pyというファイルがあるので、改造する事を見越してこいつを複製しrun_webcam2.pyとする。
次に起動用のバッチファイルを作成しrun.batとする。内容は下記の通り。

@echo off
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\CUPTI\libx64;%PATH%
py -u run_webcam2.py --model=mobilenet_thin --resize=256x192 --resize-out-ratio=4.0
pause

頭の2行は環境変数の設定で、CuDnnのインストールされたCUDAへのパスを通している(前回記事参照)。
3行目が実際にopenposeを叩いている部分で、コマンドライン引数の意味は下記の通り。

--model=mobilenet_thin…動作モデルをmobilenet_thinに設定する。デフォルトでインストールされているモデルで、デフォルトのcmu(追加でモデルのDLが必要)と比べ高速で動作する。
--resize=256x192...入力された画像のリサイズを行う。各値は16の倍数にする必要がある。デフォルトでは432x384。
--resize-out-ratio=4.0...デフォルトで4.0だが一応明記している。ヒートマップ生成の細かさを表す。大きいほど遅いが高精度。ただし大きすぎてもオーバーフィットする為要調整。
この他に、接続されているカメラを指定する--camera=0やより細かいデバッグ情報を出す--show-process=Falseがある。

追記:pythonコマンドに渡している「-u」は標準出力を別アプリにパイプする際バッファしないようする命令。

run_webcamを改造する

デフォルトでこれを動作させても、元映像に検出された人の骨格が上書きされて表示されるだけなので、各座標の出力をコンソールに吐くよう改造する。
ついでに他にも幾つか改造する。

1. 標準エラー出力に出力されるデバッグ情報を削除する(見た目がさっぱりするので)
2. 標準出力に検出された座標の数値を出力する
3. ウィンドウに表示される画像を黒塗り+骨格にする(自分の顔を見たくない為)
4. GPUのメモリを必要な分だけ確保するようにする(デフォルトだとGPUの空きメモリ全部食う)
5. 動作速度を制限し、FPSをざっくり均一にする

すると最終的にこのように動作する。
f:id:suzumodoki:20190211210207j:plain
コンソールの標準出力に値がどかーっと吐き出されるので、他のアプリケーションでも標準出力をリダイレクトすればデータを引っこ抜けるぞ。
例えばC#アプリでプロセス介して実行すればUnityに取り込んだりもできる。
ちなみにパーツの部位番号に関してはtf_pose/common.pyの13行目を観るとわかるぞ。

run_webcam2.pyの全貌

続きを読む

tf-openposeをWindowsで動かす

お品書き

Vtuberとかがやってるあのアレ、人の動きをコンピュータに流し込むやつ。
KinectやHTC Viveに加えて、ディープラーニングで画像から姿勢推定という選択肢がでてきた。
というわけで、実際にGPUアリで動かすまでの手順でハマったところをメモっとく。
tf-openposeのざっくりとした導入手順は下記参照。
GPU無しで画像のみから人間のボーン推定が出来るtf-openposeを導入する - Qiita

準備

tf-pose-estimation本体。git cloneなりZIPで落とすなりしてローカルに保存する。
GitHub - ildoonet/tf-pose-estimation: Deep Pose Estimation implemented using Tensorflow with Custom Architectures for fast inference.

git。git自体も要るし、付属のgit bashも使う。便利だからいいから入れとけ的なやつ。
Git

3.6系Python。自分の環境では3.6.6。3.7系以降はTFが動かないので死ぬ。
Download Python | Python.org

9.0のCUDA。9.2とか10を入れるとやっぱりTF動かないので死。
CUDA Toolkit 9.0 Downloads | NVIDIA Developer

tensorflow-gpu。通称TF。pythonを入れたらpipで入れる(管理者コマンドで下記叩くだけ)。ググるとanaconda使ってる例が多いけど無くてももちろんOK。

pip install tensorflow-gpu

Cuda9.0用のCuDnn。アカウント取らないと落とせないファック仕様。バージョンは違うが下記ページ参考。Win8ユーザはWin7用入れればOK。
Windows で NVIDIA cuDNN 7.1.4のインストール

作業内容

1. 標準のコマンドプロンプトだと途中コケるので、gitについてくるgit bash管理者権限で開く。
多分git入れた時スタートメニューかなんかに入り込んでると思う。

2. 落としてきたtf-pose-estimationのフォルダに移動する。

3. コマンドを叩く。成功するよう祈る。失敗したらエラーの内容と睨めっこする。

pip3 install -r requirements.txt

4. tensorflowとtensorflow-gpuが両方入ってると競合するので、下記コマンドでtensorflowを消す*1

pip uninstall tensorflow

5. CUDAのディレクトリにPATHを通す。Windows環境でこいつをやらないと実行時にTF呼べなくてコケる。
実行時のバッチで下記を叩いてもいいし、環境変数に追加しても良い。(この手順は無くてもうまくいく場合があるっぽい。)

SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\CUPTI\libx64;%PATH%

6. とりあえず下記コマンドで実行出来れば成功(実行時に動的にパス通す場合)。

py run.py --model=mobilenet_thin

渡せるコマンドと改造について

は次回の記事にかく。

*1:tensorflow-gpuが入っていれば勝手にそっちを呼んでくれるが、どっちも入ってるとノーマルのTFが呼ばれるらしい

DLSiteでブラウザにダウンロードしたファイルの場所(FireFox)

f:id:suzumodoki:20190125154901p:plain
DLSiteで購入したファイルの一部だけ欲しいって時、オフラインに一時保存ってのやると落とせはするんだけど肝心のファイルがローカル上のどこにあるんだって話。
C:\Users\ゆーざ名\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\storage\default\https+++play.dlsite.com\idb\yyyyyyyyyyyyyyyyyyyyy.files
以下に拡張子無しのファイルがずらーっと配置される。音声作品とかなら容量と更新日時からファイル特定して拡張子変えればそのまま視聴できる。

視聴ページのソース見るとわかるんだけどIndexedDBって仕組みを使ってるので、Chromeでも知らんけど似たようなキャッシュのフォルダ見つければ同じように保存されてると思う。