[{"data":1,"prerenderedAt":813},["ShallowReactive",2],{"content-/browser-mic-lan-post-to-mac":3,"all-pages-for-dir":792,"related-/browser-mic-lan-post-to-mac":793,"og-image-/browser-mic-lan-post-to-mac":812},{"id":4,"title":5,"body":6,"category":775,"concepts":776,"description":777,"extension":778,"meta":779,"navigation":233,"ogImage":776,"path":780,"project_name":776,"published":781,"publishedAt":782,"seo":783,"source":776,"stem":784,"tags":785,"todo":790,"unpublished":781,"updatedAt":776,"__hash__":791},"pages/2026-08/2026-08-18/browser-mic-lan-post-to-mac.md","Windowsのマイクで録ってMacに届ける — ブラウザを「マイクのドライバ」として使う",{"type":7,"value":8,"toc":761},"minimark",[9,18,21,25,47,50,62,65,72,81,87,91,97,114,117,133,140,144,151,154,189,192,301,311,314,321,353,360,363,366,436,448,459,462,480,483,500,509,515,518,521,603,610,614,620,629,635,642,652,655,662,676,682,685,694,709,716,719,757],[10,11,12,13,17],"p",{},"MacBook の内蔵マイクでは音声クローンの参照音声としては物足りなかった。そこで Windows 機のマイク（NVIDIA Broadcast でノイズ除去済み）で録り、その音声を Mac に持ってきたい。ファイル共有の設定も、USBメモリも、クラウド経由の同期も使わずに済んだ。",[14,15,16],"strong",{},"Windows の Chrome でページを開いて録音ボタンを押したら、Mac のディレクトリに wav が現れた","。",[10,19,20],{},"やっていることは、種を明かせば拍子抜けするほど単純だ。ただ、この単純さが何に支えられているかを分けて見ておくと、応用が一気に広がる。",[22,23,24],"h2",{"id":24},"起きたこと",[26,27,28,32,40],"ol",{},[29,30,31],"li",{},"Mac で小さな HTTP サーバーを動かす（Node の標準機能だけ、90行ほど）",[29,33,34,35,39],{},"Windows の Chrome で ",[36,37,38],"code",{},"http://192.168.10.102:7870"," を開き、録音ボタンを押して台本を読む",[29,41,42,43,46],{},"停止した瞬間、Mac の ",[36,44,45],{},"refs/ref_01.wav"," に 48kHz モノラルの wav が保存される",[10,48,49],{},"保存された音声はそのまま音声合成モデルの参照音声になり、15秒後には自分の声で別のセリフを喋る wav ができていた。",[51,52,53,58],"figure",{},[54,55],"img",{"src":56,"alt":57},"/images/browser-mic-lan-post-to-mac/figure-01.svg","Windowsのマイクで録った音がMacのファイルになるまでの6ステップ。ブラウザが担うのは録音データ化まで、送信は同じWi-Fi内のHTTP POST 1回",[59,60,61],"figcaption",{},"図1: 録音が Mac に届いたのは、同じWi-Fi内で HTTP を1回投げただけ。ブラウザが要るのは②の工程だけで、送信そのものにブラウザは要らない",[22,63,64],{"id":64},"やりとりを1本ずつ追う",[10,66,67,68,71],{},"「両方の機械にサーバーを立てて、お互いのアドレスで送受信している」と考えたくなるが、実際はもっと非対称だ。",[14,69,70],{},"立てたサーバーは Mac 側の1台だけ","で、Windows 側には常駐しているものが何もない。ブラウザでページを開いて送ったら、それで終わりである。",[51,73,74,78],{},[54,75],{"src":76,"alt":77},"/images/browser-mic-lan-post-to-mac/figure-02.svg","Windowsから Mac へ録音が届くまでのやりとり。サーバーは Mac 側の1台だけで、Wi-Fiルーターは家の中で転送するだけ",[59,79,80],{},"図2: サーバーは Mac 側の1台だけ。Windows は送るだけの客で、ルーターは宛先を見て家の中へ配っている",[10,82,83,86],{},[14,84,85],{},"待ち受ける側と、送る側","。この非対称さがこの構成の軽さの正体で、送る側には何も用意しなくていい。だから Windows でも iPhone でも、ブラウザさえあれば同じ役をこなせる。",[22,88,90],{"id":89},"中継しているのはルーターでインターネットではない","中継しているのはルーターで、インターネットではない",[10,92,93,94,17],{},"「自分が使っているインターネットを中継点にしている」という言い方は、半分あたっていて半分違う。",[14,95,96],{},"中継しているのは Wi-Fi ルーター（親機）であって、その先のインターネットではない",[10,98,99,102,103,106,107,110,111,17],{},[36,100,101],{},"192.168.10.102"," のような ",[36,104,105],{},"192.168."," で始まるアドレスは",[14,108,109],{},"プライベートアドレス","と呼ばれ、家庭や職場の内側でしか意味を持たない。世界のどこにも公開されておらず、プロバイダの先へ流れていくこともない。ルーターはこの宛先を見て「これは家の中の機械だ」と判断し、そのまま Mac へ渡す。",[14,112,113],{},"外に出ていく経路には一度も乗らない",[10,115,116],{},"これは実務上そこそこ大事な性質になる。",[118,119,120,127,130],"ul",{},[29,121,122,123,126],{},"回線が遅くても関係ない。",[14,124,125],{},"Wi-Fi の速度がそのまま転送速度","になる",[29,128,129],{},"インターネットが落ちていても動く。ルーターが生きていれば足りる",[29,131,132],{},"録った声がどこかのサーバーを経由することがない。機械の外にすら出ていない",[10,134,135,136,139],{},"逆に言うと、",[14,137,138],{},"同じルーターにつながっていることが唯一の条件","になる。片方が有線・片方が Wi-Fi でも、同じルーター配下なら問題ない。つながらないときは、ゲスト用 Wi-Fi のように「同じ建物だが別のネットワーク」に入っていないかをまず疑うことになる。",[22,141,143],{"id":142},"chrome-は必須なのか","Chrome は必須なのか",[10,145,146,147,150],{},"必須ではない。",[14,148,149],{},"送っている中身は、ごく普通の HTTP POST 1回だ","。本文（ボディ）に音声のバイナリがそのまま入っているだけで、特別なプロトコルは使っていない。だから、HTTP を喋れるものなら何でも代わりになる。",[10,152,153],{},"たとえば Windows 側で録音済みのファイルがあるなら、コマンド1行で同じことができる。",[155,156,161],"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-bash shiki shiki-themes vitesse-light vitesse-light","curl -X POST --data-binary @rec.wav http://192.168.10.102:7870/api/upload/1\n","bash","",[36,162,163],{"__ignoreMap":160},[164,165,168,172,176,180,183,186],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"senZ8","curl",[164,173,175],{"class":174},"snbK4"," -X",[164,177,179],{"class":178},"sdGka"," POST",[164,181,182],{"class":174}," --data-binary",[164,184,185],{"class":178}," @rec.wav",[164,187,188],{"class":178}," http://192.168.10.102:7870/api/upload/1\n",[10,190,191],{},"録音自体もコマンドでやれる。Windows の ffmpeg なら DirectShow 経由でマイクを掴める。",[155,193,195],{"className":157,"code":194,"language":159,"meta":160,"style":160},"# マイク名を調べる\nffmpeg -list_devices true -f dshow -i dummy\n\n# 12秒録って、そのまま Mac に投げる\nffmpeg -f dshow -i audio=\"マイク (NVIDIA Broadcast)\" -ar 48000 -ac 1 -t 12 rec.wav\ncurl -X POST --data-binary @rec.wav http://192.168.10.102:7870/api/upload/1\n",[36,196,197,203,228,235,241,286],{"__ignoreMap":160},[164,198,199],{"class":166,"line":167},[164,200,202],{"class":201},"sxvE3","# マイク名を調べる\n",[164,204,206,209,212,216,219,222,225],{"class":166,"line":205},2,[164,207,208],{"class":170},"ffmpeg",[164,210,211],{"class":174}," -list_devices",[164,213,215],{"class":214},"sHkkW"," true",[164,217,218],{"class":174}," -f",[164,220,221],{"class":178}," dshow",[164,223,224],{"class":174}," -i",[164,226,227],{"class":178}," dummy\n",[164,229,231],{"class":166,"line":230},3,[164,232,234],{"emptyLinePlaceholder":233},true,"\n",[164,236,238],{"class":166,"line":237},4,[164,239,240],{"class":201},"# 12秒録って、そのまま Mac に投げる\n",[164,242,244,246,248,250,252,255,259,262,264,267,271,274,277,280,283],{"class":166,"line":243},5,[164,245,208],{"class":170},[164,247,218],{"class":174},[164,249,221],{"class":178},[164,251,224],{"class":174},[164,253,254],{"class":178}," audio=",[164,256,258],{"class":257},"sMJiu","\"",[164,260,261],{"class":178},"マイク (NVIDIA Broadcast)",[164,263,258],{"class":257},[164,265,266],{"class":174}," -ar",[164,268,270],{"class":269},"sM54T"," 48000",[164,272,273],{"class":174}," -ac",[164,275,276],{"class":269}," 1",[164,278,279],{"class":174}," -t",[164,281,282],{"class":269}," 12",[164,284,285],{"class":178}," rec.wav\n",[164,287,289,291,293,295,297,299],{"class":166,"line":288},6,[164,290,171],{"class":170},[164,292,175],{"class":174},[164,294,179],{"class":178},[164,296,182],{"class":174},[164,298,185],{"class":178},[164,300,188],{"class":178},[10,302,303,304,307,308,17],{},"PowerShell 派なら ",[36,305,306],{},"Invoke-RestMethod -Method Post -InFile rec.wav -Uri http://192.168.10.102:7870/api/upload/1"," でも同じことになる。",[14,309,310],{},"ブラウザは選択肢のひとつであって、経路の必須部品ではない",[22,312,313],{"id":313},"それでもブラウザを使った理由",[10,315,316,317,320],{},"ブラウザが引き受けているのは、図の②だけだ。",[14,318,319],{},"マイクを掴んで、録音データの形に変える","。この部分に限ってはブラウザが圧倒的に楽をさせてくれる。",[118,322,323,330,347,350],{},[29,324,325,326,329],{},"マイクの一覧取得と選択が数行で書ける（",[36,327,328],{},"enumerateDevices"," で NVIDIA Broadcast の仮想マイクも普通に候補に出る）",[29,331,332,333,342,343,346],{},"録音の開始・停止・エンコードを ",[334,335,341],"a",{"href":336,"target":337,"rel":338},"https://developer.mozilla.org/ja/docs/Web/API/MediaRecorder","_blank",[339,340],"noopener","noreferrer","MediaRecorder API"," が全部やる。webm/opus に圧縮されたデータが ",[36,344,345],{},"Blob"," で手に入る",[29,348,349],{},"音量メーター、台本表示、録り直しといった画面が HTML と CSS だけで作れる",[29,351,352],{},"Windows でも Mac でも iPhone でも、インストール作業なしに同じものが動く",[10,354,355,356,359],{},"つまりこの構成は、",[14,357,358],{},"ブラウザを「録音アプリ」ではなく「マイクのドライバ」として使っている","。音を取るところだけブラウザに任せ、取れたデータは素の HTTP で自分のサーバーに流す。ネイティブアプリを書く必要も、配布する必要もない。",[22,361,362],{"id":362},"つまずいたのは待ち受けアドレス",[10,364,365],{},"実は最初、Windows から開いてもページが表示されなかった。原因は Wi-Fi でもファイアウォールでもなく、サーバーの1行だった。",[155,367,371],{"className":368,"code":369,"language":370,"meta":160,"style":160},"language-js shiki shiki-themes vitesse-light vitesse-light","server.listen(PORT, '127.0.0.1')  // Mac の中からしか見えない\nserver.listen(PORT, '0.0.0.0')    // 同じネットワークの他の機械からも見える\n","js",[36,372,373,410],{"__ignoreMap":160},[164,374,375,379,383,386,389,392,395,398,401,404,407],{"class":166,"line":167},[164,376,378],{"class":377},"s4oTP","server",[164,380,382],{"class":381},"shFtX",".",[164,384,385],{"class":170},"listen",[164,387,388],{"class":381},"(",[164,390,391],{"class":377},"PORT",[164,393,394],{"class":381},",",[164,396,397],{"class":257}," '",[164,399,400],{"class":178},"127.0.0.1",[164,402,403],{"class":257},"'",[164,405,406],{"class":381},")",[164,408,409],{"class":201},"  // Mac の中からしか見えない\n",[164,411,412,414,416,418,420,422,424,426,429,431,433],{"class":166,"line":205},[164,413,378],{"class":377},[164,415,382],{"class":381},[164,417,385],{"class":170},[164,419,388],{"class":381},[164,421,391],{"class":377},[164,423,394],{"class":381},[164,425,397],{"class":257},[164,427,428],{"class":178},"0.0.0.0",[164,430,403],{"class":257},[164,432,406],{"class":381},[164,434,435],{"class":201},"    // 同じネットワークの他の機械からも見える\n",[10,437,438,440,441,444,445,447],{},[36,439,400],{},"（ループバック）で待ち受けているプログラムは、",[14,442,443],{},"同じ機械の中からの接続しか受け付けない","。ポートが開いていようが、プログラムが元気に動いていようが、他の機械から見れば存在しないのと変わらない。",[36,446,428],{}," は「この機械が持っている全てのネットワーク接続口で待つ」という意味で、これに変えて初めて Wi-Fi 越しの接続が届くようになる。",[10,449,450,451,454,455,458],{},"ローカル開発で ",[36,452,453],{},"localhost:3000"," を叩いているぶんには一生気づかない違いだが、",[14,456,457],{},"別の機械から繋ぎたくなった瞬間に最初に疑うべき場所","がここになる。",[22,460,461],{"id":461},"ブラウザを使うと1つだけ制約がつく",[10,463,464,465,468,469,472,473,475,476,479],{},"マイクとカメラは、",[14,466,467],{},"「安全な接続」でしか使えない","という決まりがブラウザ側にある。具体的には HTTPS か ",[36,470,471],{},"localhost"," のどちらかで、",[36,474,38],{}," はそのどちらでもない。放っておくと録音 API が丸ごと無効になり、",[36,477,478],{},"navigator.mediaDevices"," が存在しない状態になる。",[10,481,482],{},"盗聴されうる経路でマイクを開かせない、という設計思想なので理屈は正しい。回避策は用意されていて、Chrome なら開発用のフラグに URL を登録すればよい。",[26,484,485,491,497],{},[29,486,487,490],{},[36,488,489],{},"chrome://flags/#unsafely-treat-insecure-origin-as-secure"," を開く",[29,492,493,494,496],{},"入力欄に ",[36,495,38],{}," を入れて Enabled にする",[29,498,499],{},"Chrome を再起動する",[10,501,502,503,508],{},"一度きりの設定で済む。自己署名証明書で HTTPS を立てる方法もあるが、証明書の警告を毎回踏むぶん、こちらのほうが手間が少ない。詳しくは ",[334,504,507],{"href":505,"target":337,"rel":506},"https://developer.mozilla.org/ja/docs/Web/Security/Secure_Contexts",[339,340],"MDN の Secure Contexts の説明","が分かりやすい。",[10,510,511,514],{},[14,512,513],{},"そして、この制約はブラウザを使うから発生する","。ffmpeg と curl で送る経路を選ぶなら、そもそも関係がない。",[22,516,517],{"id":517},"他の受け渡し方と何が違うか",[10,519,520],{},"同じ「Windows から Mac へファイルを渡す」でも、選択肢はいくつもある。それぞれの重さを並べてみる。",[522,523,524,543],"table",{},[525,526,527],"thead",{},[528,529,530,534,537,540],"tr",{},[531,532,533],"th",{},"方法",[531,535,536],{},"事前に要る設定",[531,538,539],{},"送る操作",[531,541,542],{},"向いている場面",[544,545,546,561,575,589],"tbody",{},[528,547,548,552,555,558],{},[549,550,551],"td",{},"HTTP POST",[549,553,554],{},"サーバーを1本動かすだけ",[549,556,557],{},"1コマンド、または録音ボタン",[549,559,560],{},"受け取った直後に処理まで走らせたいとき",[528,562,563,566,569,572],{},[549,564,565],{},"ファイル共有（SMB）",[549,567,568],{},"共有設定とアカウント認証",[549,570,571],{},"ドラッグ&ドロップ",[549,573,574],{},"大量のファイルを日常的に行き来させるとき",[528,576,577,580,583,586],{},[549,578,579],{},"scp / sftp",[549,581,582],{},"Mac 側のリモートログイン許可と鍵",[549,584,585],{},"1コマンド",[549,587,588],{},"すでに SSH を使っている環境",[528,590,591,594,597,600],{},[549,592,593],{},"クラウド同期",[549,595,596],{},"アカウントと同期クライアント",[549,598,599],{},"保存して待つ",[549,601,602],{},"機械が同じ場所になくてもよいとき",[10,604,605,606,609],{},"HTTP POST が軽いのは、",[14,607,608],{},"受け取った直後に好きな処理を挟める","からだ。今回のサーバーは、受け取った webm をその場で ffmpeg に通し、48kHz モノラルの wav に変換し、前後の無音を削ってから保存している。ファイル共有だと「置かれたことを検知して変換する」仕組みを別に作る必要がある。渡すだけでなく、渡した先で何かを起こしたいなら、HTTP のほうが素直になる。",[22,611,613],{"id":612},"送っているのは音だけではない-計算も預けている","送っているのは音だけではない — 計算も預けている",[10,615,616,617,17],{},"同じ経路は逆向きにも使える。ページの下部にテキストを打ち込んで「この声で生成する」を押すと、",[14,618,619],{},"その文字が Mac へ飛び、Mac が音声を作って返してくる",[51,621,622,626],{},[54,623],{"src":624,"alt":625},"/images/browser-mic-lan-post-to-mac/figure-03.svg","Windowsで文章を入力してから音声が鳴るまでの流れ。計算はすべてMacのM5 Proが行う",[59,627,628],{},"図3: 文字を打ったのは Windows、計算をしたのは Mac の M5 Pro。送る側にモデルは要らない",[10,630,631,634],{},[14,632,633],{},"Windows 側には音声合成のモデルも Python も入っていない。"," 3.3GB のモデルも、それを動かす GPU も Mac 側にある。Windows がしたのは、文字を打つことと、返ってきた wav を鳴らすことだけだ。実測では、10.9秒の音声を18秒で生成して返している。",[10,636,637,638,641],{},"やりとりが2往復になっているのは、返すのが音声そのものではなく",[14,639,640],{},"音声の置き場所（URL）と測定結果だから","である。ブラウザはそれを見てから、改めて音声を取りに行く。生成に十数秒かかる処理を1回の通信で待たせると、途中経過を出せないし、失敗したときの扱いも面倒になる。",[10,643,644,645,648,649],{},"ここまで来ると、この構成の意味が1つ増える。",[14,646,647],{},"ブラウザは入力装置を貸してくれるだけでなく、計算をよそに預ける窓口にもなっている。"," 手元のノートPCが非力でも、母艦のGPUで動かした結果だけが返ってくる。",[14,650,651],{},"送る側の性能は結果に関係しない。",[22,653,654],{"id":654},"この形が効くのは録音に限らない",[10,656,657,658,661],{},"一度この構造で考えると、",[14,659,660],{},"手元の機械やスマホを、母艦の入力装置として使える","ことに気づく。ブラウザから取れるものは音だけではない。",[118,663,664,667,670,673],{},[29,665,666],{},"カメラ（写真・動画）: スマホで撮ってその場で Mac の処理に流す",[29,668,669],{},"位置情報・加速度センサー: 実機でしか取れない値を集める",[29,671,672],{},"ファイル選択とドラッグ&ドロップ: 相手の機械に何もインストールさせずに受け取る",[29,674,675],{},"クリップボードのテキスト: 別の機械で書いた文章をそのまま処理に渡す",[10,677,678,679,17],{},"iPhone を同じ Wi-Fi につないで同じ URL を開けば、iPhone のマイクで録った音がそのまま Mac に着地する。",[14,680,681],{},"アプリを書かずに、手持ちの端末が全部クライアントになる",[22,683,684],{"id":684},"気をつけること",[10,686,687,689,690,693],{},[36,688,428],{}," で待ち受けるということは、",[14,691,692],{},"同じネットワークにいる誰でもそのページを開けるし、POST も投げられる","ということでもある。今回のサーバーには認証がない。自宅の Wi-Fi なら実害は考えにくいが、カフェや社内の共用ネットワークで同じことをするなら話が変わる。",[118,695,696,703,706],{},[29,697,698,699,702],{},"使い終わったらサーバーを止める（",[36,700,701],{},"lsof -ti:7870 | xargs kill","）",[29,704,705],{},"共用ネットワークで使うなら、合言葉を1つ要求するだけでも実質的な抑止になる",[29,707,708],{},"受け取ったデータを外部に送らない作りにしておく。今回の構成では音声は Mac の中で完結し、インターネットには一切出ない",[10,710,711,712,715],{},"最後の点は、声を扱ううえでは無視できない。",[14,713,714],{},"録った声が自分の機械から出ていかない","という性質は、この構成を選ぶ理由のひとつになる。",[22,717,718],{"id":718},"まとめ",[118,720,721,728,734,744,747,754],{},[29,722,723,724,727],{},"Windows で録った音が Mac に届いたのは、",[14,725,726],{},"同じWi-Fi内で HTTP POST を1回投げたから","であって、特別な技術は使っていない",[29,729,730,733],{},[14,731,732],{},"Chrome は必須ではない","。ffmpeg と curl で置き換えられる。ブラウザに任せているのは「マイクを掴んでデータにする」ところだけ",[29,735,736,737,743],{},"別の機械から繋がらないときは、まず",[14,738,739,740,742],{},"待ち受けアドレスが ",[36,741,400],{}," になっていないか","を疑う",[29,745,746],{},"ブラウザでマイクを使うなら「安全な接続」の制約がついてくる。フラグ登録で一度だけ回避できる",[29,748,749,750,753],{},"逆向きも同じ経路で動く。",[14,751,752],{},"文字を送れば、母艦のGPUが計算した音声だけが返ってくる","。送る側の性能は結果に関係しない",[29,755,756],{},"この形にしておくと、スマホを含めた手持ちの端末が、そのまま母艦の入力装置になる",[758,759,760],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}",{"title":160,"searchDepth":205,"depth":205,"links":762},[763,764,765,766,767,768,769,770,771,772,773,774],{"id":24,"depth":205,"text":24},{"id":64,"depth":205,"text":64},{"id":89,"depth":205,"text":90},{"id":142,"depth":205,"text":143},{"id":313,"depth":205,"text":313},{"id":362,"depth":205,"text":362},{"id":461,"depth":205,"text":461},{"id":517,"depth":205,"text":517},{"id":612,"depth":205,"text":613},{"id":654,"depth":205,"text":654},{"id":684,"depth":205,"text":684},{"id":718,"depth":205,"text":718},"dev",null,"別のPCで録音した音声が、同じWi-Fi内のHTTP POST 1回でMacのファイルになる。何が起きているのかを層に分けて説明し、ブラウザを外した場合の書き換えまで示す","md",{},"/browser-mic-lan-post-to-mac",false,"2026-08-18T00:00:00.000Z",{"title":5,"description":777},"2026-08/2026-08-18/browser-mic-lan-post-to-mac",[786,787,788,789],"ネットワーク","ブラウザ","音声合成","開発メモ","memo","QUzNBR3mmY_26PzVPCpsF-eUXL8XhmEBFdpFHtog5SA",[],[794,797,800,804,808],{"title":795,"path":796,"publishedAt":782},"セミナー会場の全員のClaude Codeと会話する — 進捗を集めて、席に行かずに指示を出す","/claude-code-seminar-hub",{"title":798,"path":799,"publishedAt":782},"自分の声を複製して、BPM120のビートに乗せる — TTSで講義音声を作る実験","/tts-narration-bpm120",{"title":801,"path":802,"publishedAt":803},"Claude Code で頻発する「API Error: Connection refused」の原因調査と hosts 回避（.10 → .11）","/claude-code-connection-refused-hosts-fix","2026-08-16T00:00:00.000Z",{"title":805,"path":806,"publishedAt":807},"ナレーションの話速をBPMで設計する。実測BPM98と、間をビートに乗せる試み","/narration-bpm-beat-grid","2026-08-14T00:00:00.000Z",{"title":809,"path":810,"publishedAt":811},"Tailscale + リモートデスクトップ 手順書（サブ機Home → メイン機Pro）","/2026-07-05-tailscale-rdp-setup","2026-07-05T00:00:00.000Z","https://log.eurekapu.com/favicon.svg",1787053849568]