{"id":1144,"date":"2026-08-19T00:24:21","date_gmt":"2026-08-19T00:24:21","guid":{"rendered":"https:\/\/guoh.ai\/lifelog\/?p=1144"},"modified":"2026-08-19T00:25:34","modified_gmt":"2026-08-19T00:25:34","slug":"let-your-ai-agent-be-your-audio-engineer","status":"publish","type":"post","link":"https:\/\/guoh.ai\/lifelog\/2026\/08\/let-your-ai-agent-be-your-audio-engineer\/","title":{"rendered":"Let Your AI Agent Be Your Audio Engineer"},"content":{"rendered":"<div class=\"gfmr-markdown-container\"><div class=\"gfmr-markdown-source\" style=\"display: none;\">*Recording calls, podcasts, and voice-AI tests on your Mac \u2014 wired by a\nprompt, no audio engineering degree required.*\n\nEveryone who records anything on a Mac hits the same wall eventually:\n\n&#8211; You interview a guest over Zoom and want **your voice and theirs on\n  separate tracks** for editing \u2014 but your recording only has one side.\n&#8211; You&#039;re on AirPods and want to **capture a call exactly as you heard it**.\n&#8211; You&#039;re a developer testing a **voice AI agent** and need to feed it audio\n  and record its replies, reproducibly.\n\nThe Mac can do all of this natively \u2014 no paid apps \u2014 but the setup lives in\na utility called Audio MIDI Setup: aggregate devices, multi-output devices,\nclock sources, drift correction, sample rates. Checkboxes upon checkboxes.\nIt drives people crazy, and next month you get to re-remember all of it.\n\nHere&#039;s the new way: **describe what you want to an AI coding agent, and let\nit do the wiring.**\n\n## The zero-learning path\n\nIf you have Claude Code, Codex, or any\ncoding agent that can run commands, you don&#039;t need to understand anything\nbelow. The workflow is four steps, **in this order** \u2014 it matters:\n\n**1. Install the tools.** audictl is one command; BlackHole is a normal Mac\ninstaller (your agent can fetch it, but the installer asks for your\npassword \u2014 that click is yours):\n\n&#8220;`sh\nnpm install -g @agora-build\/audictl @agora-build\/dialf\nbrew install blackhole-2ch blackhole-16ch     # or download from existential.audio\n&#8220;`\n\n**2. Plug everything in.** Pair the AirPods, connect the headset, plug in\nthe interface \u2014 *before* asking for anything. An agent can only wire\ndevices it can see; hardware that isn&#039;t connected doesn&#039;t exist to\nCoreAudio.\n\n**3. Have the agent take inventory.** Paste:\n\n&gt; Run `audictl list` and tell me what audio devices I have.\n\nNow the agent knows your world by real names \u2014 &quot;Hai&#039;s AirPods Pro&quot;, not a\nguess \u2014 and everything it builds will reference devices that actually exist.\n\n**4. Say what you want, in plain English.** From here the agent handles all\nof it \u2014 wiring, verifying, recording, and cleaning up afterwards:\n\n&gt; Read https:\/\/guoh.ai\/lifelog\/2026\/08\/let-your-ai-agent-be-your-audio-engineer\/\n&gt; and set up my Mac so my next call is recorded with my mic and the other\n&gt; side on separate tracks. I&#039;m on AirPods. Undo everything when I say done.\n\n&gt; Read that same page and set up Case 2 for testing my voice agent at\n&gt; 48 kHz, then run the DialF eval.\n\nEverything the agent runs is safe to repeat (commands are no-ops when\nalready done), nothing touches your files, and every step is a one-liner to\nundo.\n\nThe rest of this post is what the agent (or you, if you&#039;re curious)\nactually does. Humans welcome; it&#039;s shorter than the checkbox maze.\n\n## The kit\n\nThree free pieces:\n\n&#8211; [**audictl**](https:\/\/github.com\/Agora-Build\/audictl) \u2014 Audio MIDI Setup\n  as a command line: devices, defaults, sample rates, aggregate and\n  multi-output devices with clock and drift control. JSON output, meaningful\n  exit codes, idempotent \u2014 built so AI agents can drive it safely.\n&#8211; [**BlackHole**](https:\/\/existential.audio\/blackhole\/) \u2014 a virtual audio\n  cable. Anything played into it can be recorded from it. The 2ch and 16ch\n  variants are two independent cables, so input and output never collide.\n&#8211; [**DialF**](https:\/\/www.npmjs.com\/package\/@agora-build\/dialf)\n  (`@agora-build\/dialf`) \u2014 plays prompt audio, captures replies, records\n  tx\/rx\/mix on one clock. Built for voice-agent evals.\n\n&#8212;\n\n## Case 1 \u2014 Record both sides of a call or interview\n\n*For podcasters, journalists, anyone taking calls on a headset.* One\nrecording, in sync: channel 1 is your voice, channels 2\u20133 are what you heard\n(your guest, the other side, the meeting). Split them afterwards and edit\neach side separately.\n\n**Prompt to paste:** *&quot;Set up my Mac to record my next call: my AirPods mic\nand everything I hear, as separate channels in one file.&quot;*\n\nWhat that builds:\n\n&#8220;`mermaid\nflowchart LR\n    app[&quot;app audio&lt;br&gt;(Zoom, Meet, agent\u2026)&quot;] &#8211;&gt; hear[&quot;Multi-Output&lt;br&gt;Hear+Tap&quot;]\n    hear &#8211;&gt; pods[&quot;AirPods&lt;br&gt;(you hear it)&quot;]\n    hear &#8211;&gt; tap[&quot;BlackHole 2ch&lt;br&gt;(the tap)&quot;]\n\n    you((&quot;you speak&quot;)) &#8211;&gt; mic[&quot;AirPods mic&quot;]\n    mic &#8211;&gt; rec[&quot;Aggregate: Rec In&lt;br&gt;(mic + playback, one clock)&quot;]\n    tap &#8211;&gt; rec\n    rec &#8211;&gt; file[&quot;recorder&lt;br&gt;ch1 = your voice&lt;br&gt;ch2\u20133 = what you heard&quot;]\n&#8220;`\n\nThe commands (fuzzy names are fine \u2014 audictl resolves them, and lists\ncandidates if a name is ambiguous):\n\n&#8220;`sh\n# Output side: play to your ears AND into the tap\naudictl multi create &#8211;name &quot;Hear+Tap&quot; &#8211;devices &quot;AirPods,BlackHole 2ch&quot; &#8211;primary &quot;AirPods&quot;\naudictl default set output &quot;Hear+Tap&quot;\n\n# Input side: mic + tap glued into one recordable device.\n# BlackHole is the stable clock; drift-correct the Bluetooth side.\naudictl aggregate create &#8211;name &quot;Rec In&quot; &#8211;devices &quot;AirPods,BlackHole 2ch&quot; \\\n        &#8211;clock &quot;BlackHole 2ch&quot; &#8211;drift &quot;AirPods&quot;\n\n# Keep everyone on one rate\naudictl rate set &quot;BlackHole 2ch&quot; 48k\n&#8220;`\n\nRecord from &quot;Rec In&quot; with anything \u2014 QuickTime and GarageBand can select it\nas the input device, or from the terminal:\n\n&#8220;`sh\nsox -t coreaudio &quot;Rec In&quot; call.wav          # everything, in sync\nsox call.wav mic.wav   remix 1              # your voice\nsox call.wav heard.wav remix 2,3            # what you heard\n&#8220;`\n\n(Or point DialF at it: `capture_device: &quot;Rec In&quot;` with `record_dir` and\n`mix_recording: true` in `~\/.config\/dialf\/config.yaml`.)\n\nDone recording? Teardown is idempotent \u2014 safe to run twice:\n\n&#8220;`sh\naudictl default set output &quot;AirPods&quot;\naudictl aggregate destroy &quot;Rec In&quot; &#8211;if-exists\naudictl multi destroy &quot;Hear+Tap&quot; &#8211;if-exists\n&#8220;`\n\n&#8212;\n\n## Case 2 \u2014 Eval a voice AI agent, no phone required\n\n*For developers.* Your voice agent runs on (or is reachable from) your Mac \u2014\na browser tab, a softphone, a local process. You want deterministic evals:\nplay a scripted prompt, capture the reply, measure latency. No cellular in\nthe loop, so results are reproducible.\n\n**Prompt to paste:** *&quot;Set up the Case 2 rig from this page for my voice\nagent, sample rate 44.1k, and run the DialF eval job.&quot;*\n\nTwo cables, one per direction:\n\n&#8220;`mermaid\nflowchart LR\n    dialf[&quot;DialF&lt;br&gt;records tx \/ rx \/ mix&lt;br&gt;on one clock&quot;] &#8212; &quot;prompt (tx)&quot; &#8211;&gt; bh2[&quot;BlackHole 2ch&quot;]\n    bh2 &#8211;&gt; agent[&quot;voice agent&lt;br&gt;(browser tab, softphone, process)&quot;]\n    agent &#8212; &quot;reply&quot; &#8211;&gt; bh16[&quot;BlackHole 16ch&quot;]\n    bh16 &#8212; &quot;capture (rx)&quot; &#8211;&gt; dialf\n&#8220;`\n\n### Preflight, agent-runnable\n\nEvery command is idempotent (`changed:false` on re-run) and exit codes are\nmeaningful, so this runs unconditionally before every eval:\n\n&#8220;`sh\n#!\/usr\/bin\/env bash\nset -euo pipefail\n\n# Devices present? (exit 2 = not found)\naudictl info &quot;BlackHole 2ch&quot;  &#8211;quiet || { echo &quot;install BlackHole 2ch&quot;;  exit 1; }\naudictl info &quot;BlackHole 16ch&quot; &#8211;quiet || { echo &quot;install BlackHole 16ch&quot;; exit 1; }\n\n# Match DialF&#039;s configured rate (validates against supported rates, exit 4 if not)\naudictl rate set &quot;BlackHole 2ch&quot;  44.1k &#8211;quiet\naudictl rate set &quot;BlackHole 16ch&quot; 44.1k &#8211;quiet\n\n# If the agent app uses system defaults, point them at the cables:\naudictl default set input  &quot;BlackHole 2ch&quot;  &#8211;quiet\naudictl default set output &quot;BlackHole 16ch&quot; &#8211;quiet\n&#8220;`\n\n(If the agent app has its own device picker, select the BlackHole devices\nthere instead of moving the system defaults.)\n\n### DialF config\n\n`~\/.config\/dialf\/config.yaml`:\n\n&#8220;`yaml\naudio:\n  sample_rate: 44100\n  channels: 1\n  capture_device: &quot;BlackHole 16ch&quot;      # the agent&#039;s output\n  playback_device: &quot;BlackHole 2ch&quot;      # the agent&#039;s input\n  record_dir: ~\/Dev\/myEval\/recordings\n  mix_recording: true\n  capture_cmd: [&quot;\/opt\/homebrew\/bin\/sox&quot;, &quot;-q&quot;, &quot;-t&quot;, &quot;coreaudio&quot;, &quot;BlackHole 16ch&quot;,\n                &quot;-t&quot;, &quot;raw&quot;, &quot;-b&quot;, &quot;16&quot;, &quot;-e&quot;, &quot;signed-integer&quot;,\n                &quot;-r&quot;, &quot;{rate}&quot;, &quot;-c&quot;, &quot;{channels}&quot;, &quot;-&quot;, &quot;remix&quot;, &quot;1&quot;]\n  playback_cmd: [&quot;\/opt\/homebrew\/bin\/sox&quot;, &quot;-q&quot;, &quot;-V1&quot;, &quot;{file}&quot;,\n                 &quot;-t&quot;, &quot;coreaudio&quot;, &quot;BlackHole 2ch&quot;]\n&#8220;`\n\n### The eval job\n\n`jobs\/audio-inject-record.yaml` \u2014 each turn plays a prompt (recorded as tx),\nthen waits for the agent to speak and stop (rx):\n\n&#8220;`yaml\n&#8211; type: audio.play\n  file: .\/samples\/EN_Responding_Latency_Samples_loop30_Interval_10s.wav\n  description: turn 1 \u2014 prompt the agent\n\n&#8211; type: log\n  message: audio injection eval complete\n&#8220;`\n\n&#8220;`sh\ndialf run jobs\/audio-inject-record.yaml    # audio-only: no &#8211;device, no phone\n&#8220;`\n\nAfterward, cross-correlate tx against rx: the gap between tx-end and rx-onset\nis the agent&#039;s response latency, on a clean digital path. (For the real\nearpiece\/codec\/acoustic path, keep a phone + sound-card rig; this setup\nmeasures the agent itself.)\n\n### Want to listen in while the eval runs?\n\nThe agent&#039;s output goes into a virtual cable \u2014 silent by default. Tap it the\nsame way as Case 1:\n\n&#8220;`sh\naudictl multi create &#8211;name &quot;Eval Monitor&quot; &#8211;devices &quot;BlackHole 16ch,MacBook Pro Speakers&quot;\n&#8220;`\n\n\u2026and have the agent output to &quot;Eval Monitor&quot;: DialF still captures from\nBlackHole 16ch, and your speakers get a copy.\n\n&#8212;\n\n## Notes for coding agents\n\nIf you are Claude, Codex, or another coding agent reading this because a\nhuman pasted it to you: audictl was designed for you. The contract, in\nbrief \u2014 full spec in\n[SCHEMA.md](https:\/\/github.com\/Agora-Build\/audictl\/blob\/main\/SCHEMA.md):\n\n&#8211; Add `&#8211;json` to every command. You get\n  `{&quot;ok&quot;:true,&quot;schemaVersion&quot;:1,&quot;changed&quot;:\u2026,&quot;data&quot;:{\u2026}}` on stdout \u2014 success\n  and error envelopes both, so capture one stream only.\n&#8211; **Mutations are idempotent** and return the resulting state. Re-running a\n  satisfied command is `ok:true, changed:false`, exit 0 \u2014 run setup scripts\n  unconditionally; don&#039;t pre-check.\n&#8211; **Exit codes**: 2 device not found, 3 ambiguous selector, 4 unsupported\n  (includes invalid sample rate, with valid rates in\n  `error.details.available`), 5 CoreAudio error, 6 timeout.\n&#8211; On `AMBIGUOUS_DEVICE`, the error&#039;s `details.candidates` lists id\/uid\/name \u2014\n  retry with the UID. **Store UIDs, never numeric ids** (ids change; notably\n  aggregates get a new id after every composition edit).\n&#8211; `audictl list &#8211;json` is your discovery step; `audictl aggregate &#8211;json`\n  shows every aggregate&#039;s members, clock, and drift flags.\n&#8211; Clean up with `destroy &#8211;if-exists` \/ `remove &#8211;if-absent-ok`, and restore\n  the user&#039;s default devices when the session ends \u2014 leave the machine as\n  you found it.\n&#8211; Rule of thumb for rigs: **BlackHole as the clock source, drift correction\n  on Bluetooth\/USB sub-devices**; set every device in a rig to one sample\n  rate before recording.\n&#8211; Substitute the user&#039;s real device names: `audictl list` first, then build.\n\n## More scenarios\n\nThe two cases compose \u2014 tell your agent what you want and it can adapt:\n\n&#8211; **Podcast with a remote guest** \u2014 Case 1 with Zoom\/Meet: you on one track,\n  guest on the others, edit each side independently.\n&#8211; **Streaming \/ screen recording with app audio** \u2014 tap any app&#039;s sound into\n  OBS or QuickTime while still hearing it (Case 1&#039;s output half alone).\n&#8211; **React \/ commentary videos** \u2014 record the video&#039;s audio and your mic\n  commentary as separate channels, no desk mixer.\n&#8211; **Agent-vs-agent** \u2014 two AI agents talking: one&#039;s output cable is the\n  other&#039;s input cable, DialF taps both.\n&#8211; **CI voice tests** \u2014 a Mac mini runner where the preflight script *is* the\n  fixture; `&#8211;private` aggregates keep the runner&#039;s device list clean.\n&#8211; **Whole-house audio** \u2014 `multi create` with every AirPlay\/HDMI output;\n  drift correction keeps rooms in sync.\n\nWhatever the variation, the ask is one sentence: *&quot;read\nhttps:\/\/github.com\/Agora-Build\/audictl and wire my Mac to record ___.&quot;*\nYour audio engineer is in.<\/div><div class=\"gfmr-markdown-rendered\" data-mermaid-bg-color=\"transparent\" data-shiki-theme=\"github-dark\"><p><em>Recording calls, podcasts, and voice-AI tests on your Mac \u2014 wired by a<br>\nprompt, no audio engineering degree required.<\/em><\/p>\n<p>Everyone who records anything on a Mac hits the same wall eventually:<\/p>\n<ul>\n<li>You interview a guest over Zoom and want <strong>your voice and theirs on<br>\nseparate tracks<\/strong> for editing \u2014 but your recording only has one side.<\/li>\n<li>You\u2019re on AirPods and want to <strong>capture a call exactly as you heard it<\/strong>.<\/li>\n<li>You\u2019re a developer testing a <strong>voice AI agent<\/strong> and need to feed it audio<br>\nand record its replies, reproducibly.<\/li>\n<\/ul>\n<p>The Mac can do all of this natively \u2014 no paid apps \u2014 but the setup lives in<br>\na utility called Audio MIDI Setup: aggregate devices, multi-output devices,<br>\nclock sources, drift correction, sample rates. Checkboxes upon checkboxes.<br>\nIt drives people crazy, and next month you get to re-remember all of it.<\/p>\n<p>Here\u2019s the new way: <strong>describe what you want to an AI coding agent, and let<br>\nit do the wiring.<\/strong><\/p>\n<h2 id=\"the-zero-learning-path\">The zero-learning path<\/h2>\n<p>If you have Claude Code, Codex, or any<br>\ncoding agent that can run commands, you don\u2019t need to understand anything<br>\nbelow. The workflow is four steps, <strong>in this order<\/strong> \u2014 it matters:<\/p>\n<p><strong>1. Install the tools.<\/strong> audictl is one command; BlackHole is a normal Mac<br>\ninstaller (your agent can fetch it, but the installer asks for your<br>\npassword \u2014 that click is yours):<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">npm<\/span><span style=\"color:#9ECBFF\"> install<\/span><span style=\"color:#79B8FF\"> -g<\/span><span style=\"color:#9ECBFF\"> @agora-build\/audictl<\/span><span style=\"color:#9ECBFF\"> @agora-build\/dialf<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">brew<\/span><span style=\"color:#9ECBFF\"> install<\/span><span style=\"color:#9ECBFF\"> blackhole-2ch<\/span><span style=\"color:#9ECBFF\"> blackhole-16ch<\/span><span style=\"color:#6A737D\">     # or download from existential.audio<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<p><strong>2. Plug everything in.<\/strong> Pair the AirPods, connect the headset, plug in<br>\nthe interface \u2014 <em>before<\/em> asking for anything. An agent can only wire<br>\ndevices it can see; hardware that isn\u2019t connected doesn\u2019t exist to<br>\nCoreAudio.<\/p>\n<p><strong>3. Have the agent take inventory.<\/strong> Paste:<\/p>\n<blockquote>\n<p>Run <code>audictl list<\/code> and tell me what audio devices I have.<\/p>\n<\/blockquote>\n<p>Now the agent knows your world by real names \u2014 \u201cHai\u2019s AirPods Pro\u201d, not a<br>\nguess \u2014 and everything it builds will reference devices that actually exist.<\/p>\n<p><strong>4. Say what you want, in plain English.<\/strong> From here the agent handles all<br>\nof it \u2014 wiring, verifying, recording, and cleaning up afterwards:<\/p>\n<blockquote>\n<p>Read <a href=\"https:\/\/guoh.ai\/lifelog\/2026\/08\/let-your-ai-agent-be-your-audio-engineer\/\">https:\/\/guoh.ai\/lifelog\/2026\/08\/let-your-ai-agent-be-your-audio-engineer\/<\/a><br>\nand set up my Mac so my next call is recorded with my mic and the other<br>\nside on separate tracks. I\u2019m on AirPods. Undo everything when I say done.<\/p>\n<\/blockquote>\n<blockquote>\n<p>Read that same page and set up Case 2 for testing my voice agent at<br>\n48 kHz, then run the DialF eval.<\/p>\n<\/blockquote>\n<p>Everything the agent runs is safe to repeat (commands are no-ops when<br>\nalready done), nothing touches your files, and every step is a one-liner to<br>\nundo.<\/p>\n<p>The rest of this post is what the agent (or you, if you\u2019re curious)<br>\nactually does. Humans welcome; it\u2019s shorter than the checkbox maze.<\/p>\n<h2 id=\"the-kit\">The kit<\/h2>\n<p>Three free pieces:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Agora-Build\/audictl\"><strong>audictl<\/strong><\/a> \u2014 Audio MIDI Setup<br>\nas a command line: devices, defaults, sample rates, aggregate and<br>\nmulti-output devices with clock and drift control. JSON output, meaningful<br>\nexit codes, idempotent \u2014 built so AI agents can drive it safely.<\/li>\n<li><a href=\"https:\/\/existential.audio\/blackhole\/\"><strong>BlackHole<\/strong><\/a> \u2014 a virtual audio<br>\ncable. Anything played into it can be recorded from it. The 2ch and 16ch<br>\nvariants are two independent cables, so input and output never collide.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/@agora-build\/dialf\"><strong>DialF<\/strong><\/a><br>\n(<code>@agora-build\/dialf<\/code>) \u2014 plays prompt audio, captures replies, records<br>\ntx\/rx\/mix on one clock. Built for voice-agent evals.<\/li>\n<\/ul>\n<hr>\n<h2 id=\"case-1--record-both-sides-of-a-call-or-interview\">Case 1 \u2014 Record both sides of a call or interview<\/h2>\n<p><em>For podcasters, journalists, anyone taking calls on a headset.<\/em> One<br>\nrecording, in sync: channel 1 is your voice, channels 2\u20133 are what you heard<br>\n(your guest, the other side, the meeting). Split them afterwards and edit<br>\neach side separately.<\/p>\n<p><strong>Prompt to paste:<\/strong> <em>\u201cSet up my Mac to record my next call: my AirPods mic<br>\nand everything I hear, as separate channels in one file.\u201d<\/em><\/p>\n<p>What that builds:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span>flowchart LR<\/span><\/span>\n<span class=\"line\"><span>    app[\"app audio&#x3C;br&gt;(Zoom, Meet, agent\u2026)\"] --&gt; hear[\"Multi-Output&#x3C;br&gt;Hear+Tap\"]<\/span><\/span>\n<span class=\"line\"><span>    hear --&gt; pods[\"AirPods&#x3C;br&gt;(you hear it)\"]<\/span><\/span>\n<span class=\"line\"><span>    hear --&gt; tap[\"BlackHole 2ch&#x3C;br&gt;(the tap)\"]<\/span><\/span>\n<span class=\"line\"><span><\/span><\/span>\n<span class=\"line\"><span>    you((\"you speak\")) --&gt; mic[\"AirPods mic\"]<\/span><\/span>\n<span class=\"line\"><span>    mic --&gt; rec[\"Aggregate: Rec In&#x3C;br&gt;(mic + playback, one clock)\"]<\/span><\/span>\n<span class=\"line\"><span>    tap --&gt; rec<\/span><\/span>\n<span class=\"line\"><span>    rec --&gt; file[\"recorder&#x3C;br&gt;ch1 = your voice&#x3C;br&gt;ch2\u20133 = what you heard\"]<\/span><\/span>\n<span class=\"line\"><span><\/span><\/span><\/code><\/pre>\n<p>The commands (fuzzy names are fine \u2014 audictl resolves them, and lists<br>\ncandidates if a name is ambiguous):<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\"># Output side: play to your ears AND into the tap<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> multi<\/span><span style=\"color:#9ECBFF\"> create<\/span><span style=\"color:#79B8FF\"> --name<\/span><span style=\"color:#9ECBFF\"> \"Hear+Tap\"<\/span><span style=\"color:#79B8FF\"> --devices<\/span><span style=\"color:#9ECBFF\"> \"AirPods,BlackHole 2ch\"<\/span><span style=\"color:#79B8FF\"> --primary<\/span><span style=\"color:#9ECBFF\"> \"AirPods\"<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> default<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> output<\/span><span style=\"color:#9ECBFF\"> \"Hear+Tap\"<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Input side: mic + tap glued into one recordable device.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># BlackHole is the stable clock; drift-correct the Bluetooth side.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> aggregate<\/span><span style=\"color:#9ECBFF\"> create<\/span><span style=\"color:#79B8FF\"> --name<\/span><span style=\"color:#9ECBFF\"> \"Rec In\"<\/span><span style=\"color:#79B8FF\"> --devices<\/span><span style=\"color:#9ECBFF\"> \"AirPods,BlackHole 2ch\"<\/span><span style=\"color:#79B8FF\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color:#79B8FF\">        --clock<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 2ch\"<\/span><span style=\"color:#79B8FF\"> --drift<\/span><span style=\"color:#9ECBFF\"> \"AirPods\"<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Keep everyone on one rate<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> rate<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 2ch\"<\/span><span style=\"color:#9ECBFF\"> 48k<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<p>Record from \u201cRec In\u201d with anything \u2014 QuickTime and GarageBand can select it<br>\nas the input device, or from the terminal:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">sox<\/span><span style=\"color:#79B8FF\"> -t<\/span><span style=\"color:#9ECBFF\"> coreaudio<\/span><span style=\"color:#9ECBFF\"> \"Rec In\"<\/span><span style=\"color:#9ECBFF\"> call.wav<\/span><span style=\"color:#6A737D\">          # everything, in sync<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">sox<\/span><span style=\"color:#9ECBFF\"> call.wav<\/span><span style=\"color:#9ECBFF\"> mic.wav<\/span><span style=\"color:#9ECBFF\">   remix<\/span><span style=\"color:#79B8FF\"> 1<\/span><span style=\"color:#6A737D\">              # your voice<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">sox<\/span><span style=\"color:#9ECBFF\"> call.wav<\/span><span style=\"color:#9ECBFF\"> heard.wav<\/span><span style=\"color:#9ECBFF\"> remix<\/span><span style=\"color:#9ECBFF\"> 2,3<\/span><span style=\"color:#6A737D\">            # what you heard<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<p>(Or point DialF at it: <code>capture_device: &quot;Rec In&quot;<\/code> with <code>record_dir<\/code> and<br>\n<code>mix_recording: true<\/code> in <code>~\/.config\/dialf\/config.yaml<\/code>.)<\/p>\n<p>Done recording? Teardown is idempotent \u2014 safe to run twice:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> default<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> output<\/span><span style=\"color:#9ECBFF\"> \"AirPods\"<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> aggregate<\/span><span style=\"color:#9ECBFF\"> destroy<\/span><span style=\"color:#9ECBFF\"> \"Rec In\"<\/span><span style=\"color:#79B8FF\"> --if-exists<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> multi<\/span><span style=\"color:#9ECBFF\"> destroy<\/span><span style=\"color:#9ECBFF\"> \"Hear+Tap\"<\/span><span style=\"color:#79B8FF\"> --if-exists<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<hr>\n<h2 id=\"case-2--eval-a-voice-ai-agent-no-phone-required\">Case 2 \u2014 Eval a voice AI agent, no phone required<\/h2>\n<p><em>For developers.<\/em> Your voice agent runs on (or is reachable from) your Mac \u2014<br>\na browser tab, a softphone, a local process. You want deterministic evals:<br>\nplay a scripted prompt, capture the reply, measure latency. No cellular in<br>\nthe loop, so results are reproducible.<\/p>\n<p><strong>Prompt to paste:<\/strong> <em>\u201cSet up the Case 2 rig from this page for my voice<br>\nagent, sample rate 44.1k, and run the DialF eval job.\u201d<\/em><\/p>\n<p>Two cables, one per direction:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span>flowchart LR<\/span><\/span>\n<span class=\"line\"><span>    dialf[\"DialF&#x3C;br&gt;records tx \/ rx \/ mix&#x3C;br&gt;on one clock\"] -- \"prompt (tx)\" --&gt; bh2[\"BlackHole 2ch\"]<\/span><\/span>\n<span class=\"line\"><span>    bh2 --&gt; agent[\"voice agent&#x3C;br&gt;(browser tab, softphone, process)\"]<\/span><\/span>\n<span class=\"line\"><span>    agent -- \"reply\" --&gt; bh16[\"BlackHole 16ch\"]<\/span><\/span>\n<span class=\"line\"><span>    bh16 -- \"capture (rx)\" --&gt; dialf<\/span><\/span>\n<span class=\"line\"><span><\/span><\/span><\/code><\/pre>\n<h3 id=\"preflight-agent-runnable\">Preflight, agent-runnable<\/h3>\n<p>Every command is idempotent (<code>changed:false<\/code> on re-run) and exit codes are<br>\nmeaningful, so this runs unconditionally before every eval:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">#!\/usr\/bin\/env bash<\/span><\/span>\n<span class=\"line\"><span style=\"color:#79B8FF\">set<\/span><span style=\"color:#79B8FF\"> -euo<\/span><span style=\"color:#9ECBFF\"> pipefail<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Devices present? (exit 2 = not found)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> info<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 2ch\"<\/span><span style=\"color:#79B8FF\">  --quiet<\/span><span style=\"color:#F97583\"> ||<\/span><span style=\"color:#E1E4E8\"> { <\/span><span style=\"color:#79B8FF\">echo<\/span><span style=\"color:#9ECBFF\"> \"install BlackHole 2ch\"<\/span><span style=\"color:#E1E4E8\">;  <\/span><span style=\"color:#79B8FF\">exit<\/span><span style=\"color:#79B8FF\"> 1<\/span><span style=\"color:#E1E4E8\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> info<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 16ch\"<\/span><span style=\"color:#79B8FF\"> --quiet<\/span><span style=\"color:#F97583\"> ||<\/span><span style=\"color:#E1E4E8\"> { <\/span><span style=\"color:#79B8FF\">echo<\/span><span style=\"color:#9ECBFF\"> \"install BlackHole 16ch\"<\/span><span style=\"color:#E1E4E8\">; <\/span><span style=\"color:#79B8FF\">exit<\/span><span style=\"color:#79B8FF\"> 1<\/span><span style=\"color:#E1E4E8\">; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Match DialF's configured rate (validates against supported rates, exit 4 if not)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> rate<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 2ch\"<\/span><span style=\"color:#9ECBFF\">  44.1k<\/span><span style=\"color:#79B8FF\"> --quiet<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> rate<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 16ch\"<\/span><span style=\"color:#9ECBFF\"> 44.1k<\/span><span style=\"color:#79B8FF\"> --quiet<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># If the agent app uses system defaults, point them at the cables:<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> default<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> input<\/span><span style=\"color:#9ECBFF\">  \"BlackHole 2ch\"<\/span><span style=\"color:#79B8FF\">  --quiet<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> default<\/span><span style=\"color:#9ECBFF\"> set<\/span><span style=\"color:#9ECBFF\"> output<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 16ch\"<\/span><span style=\"color:#79B8FF\"> --quiet<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<p>(If the agent app has its own device picker, select the BlackHole devices<br>\nthere instead of moving the system defaults.)<\/p>\n<h3 id=\"dialf-config\">DialF config<\/h3>\n<p><code>~\/.config\/dialf\/config.yaml<\/code>:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#85E89D\">audio<\/span><span style=\"color:#E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  sample_rate<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#79B8FF\">44100<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  channels<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#79B8FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  capture_device<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">\"BlackHole 16ch\"<\/span><span style=\"color:#6A737D\">      # the agent's output<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  playback_device<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">\"BlackHole 2ch\"<\/span><span style=\"color:#6A737D\">      # the agent's input<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  record_dir<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">~\/Dev\/myEval\/recordings<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  mix_recording<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#79B8FF\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  capture_cmd<\/span><span style=\"color:#E1E4E8\">: [<\/span><span style=\"color:#9ECBFF\">\"\/opt\/homebrew\/bin\/sox\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-q\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-t\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"coreaudio\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"BlackHole 16ch\"<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                \"-t\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"raw\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-b\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"16\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-e\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"signed-integer\"<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                \"-r\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"{rate}\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-c\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"{channels}\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"remix\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"1\"<\/span><span style=\"color:#E1E4E8\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  playback_cmd<\/span><span style=\"color:#E1E4E8\">: [<\/span><span style=\"color:#9ECBFF\">\"\/opt\/homebrew\/bin\/sox\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-q\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"-V1\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"{file}\"<\/span><span style=\"color:#E1E4E8\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">                 \"-t\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"coreaudio\"<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"BlackHole 2ch\"<\/span><span style=\"color:#E1E4E8\">]<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<h3 id=\"the-eval-job\">The eval job<\/h3>\n<p><code>jobs\/audio-inject-record.yaml<\/code> \u2014 each turn plays a prompt (recorded as tx),<br>\nthen waits for the agent to speak and stop (rx):<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#E1E4E8\">- <\/span><span style=\"color:#85E89D\">type<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">audio.play<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  file<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">.\/samples\/EN_Responding_Latency_Samples_loop30_Interval_10s.wav<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  description<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">turn 1 \u2014 prompt the agent<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">- <\/span><span style=\"color:#85E89D\">type<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">log<\/span><\/span>\n<span class=\"line\"><span style=\"color:#85E89D\">  message<\/span><span style=\"color:#E1E4E8\">: <\/span><span style=\"color:#9ECBFF\">audio injection eval complete<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">dialf<\/span><span style=\"color:#9ECBFF\"> run<\/span><span style=\"color:#9ECBFF\"> jobs\/audio-inject-record.yaml<\/span><span style=\"color:#6A737D\">    # audio-only: no --device, no phone<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<p>Afterward, cross-correlate tx against rx: the gap between tx-end and rx-onset<br>\nis the agent\u2019s response latency, on a clean digital path. (For the real<br>\nearpiece\/codec\/acoustic path, keep a phone + sound-card rig; this setup<br>\nmeasures the agent itself.)<\/p>\n<h3 id=\"want-to-listen-in-while-the-eval-runs\">Want to listen in while the eval runs?<\/h3>\n<p>The agent\u2019s output goes into a virtual cable \u2014 silent by default. Tap it the<br>\nsame way as Case 1:<\/p>\n<pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">audictl<\/span><span style=\"color:#9ECBFF\"> multi<\/span><span style=\"color:#9ECBFF\"> create<\/span><span style=\"color:#79B8FF\"> --name<\/span><span style=\"color:#9ECBFF\"> \"Eval Monitor\"<\/span><span style=\"color:#79B8FF\"> --devices<\/span><span style=\"color:#9ECBFF\"> \"BlackHole 16ch,MacBook Pro Speakers\"<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre>\n<p>\u2026and have the agent output to \u201cEval Monitor\u201d: DialF still captures from<br>\nBlackHole 16ch, and your speakers get a copy.<\/p>\n<hr>\n<h2 id=\"notes-for-coding-agents\">Notes for coding agents<\/h2>\n<p>If you are Claude, Codex, or another coding agent reading this because a<br>\nhuman pasted it to you: audictl was designed for you. The contract, in<br>\nbrief \u2014 full spec in<br>\n<a href=\"https:\/\/github.com\/Agora-Build\/audictl\/blob\/main\/SCHEMA.md\">SCHEMA.md<\/a>:<\/p>\n<ul>\n<li>Add <code>--json<\/code> to every command. You get<br>\n<code>{&quot;ok&quot;:true,&quot;schemaVersion&quot;:1,&quot;changed&quot;:\u2026,&quot;data&quot;:{\u2026}}<\/code> on stdout \u2014 success<br>\nand error envelopes both, so capture one stream only.<\/li>\n<li><strong>Mutations are idempotent<\/strong> and return the resulting state. Re-running a<br>\nsatisfied command is <code>ok:true, changed:false<\/code>, exit 0 \u2014 run setup scripts<br>\nunconditionally; don\u2019t pre-check.<\/li>\n<li><strong>Exit codes<\/strong>: 2 device not found, 3 ambiguous selector, 4 unsupported<br>\n(includes invalid sample rate, with valid rates in<br>\n<code>error.details.available<\/code>), 5 CoreAudio error, 6 timeout.<\/li>\n<li>On <code>AMBIGUOUS_DEVICE<\/code>, the error\u2019s <code>details.candidates<\/code> lists id\/uid\/name \u2014<br>\nretry with the UID. <strong>Store UIDs, never numeric ids<\/strong> (ids change; notably<br>\naggregates get a new id after every composition edit).<\/li>\n<li><code>audictl list --json<\/code> is your discovery step; <code>audictl aggregate --json<\/code><br>\nshows every aggregate\u2019s members, clock, and drift flags.<\/li>\n<li>Clean up with <code>destroy --if-exists<\/code> \/ <code>remove --if-absent-ok<\/code>, and restore<br>\nthe user\u2019s default devices when the session ends \u2014 leave the machine as<br>\nyou found it.<\/li>\n<li>Rule of thumb for rigs: <strong>BlackHole as the clock source, drift correction<br>\non Bluetooth\/USB sub-devices<\/strong>; set every device in a rig to one sample<br>\nrate before recording.<\/li>\n<li>Substitute the user\u2019s real device names: <code>audictl list<\/code> first, then build.<\/li>\n<\/ul>\n<h2 id=\"more-scenarios\">More scenarios<\/h2>\n<p>The two cases compose \u2014 tell your agent what you want and it can adapt:<\/p>\n<ul>\n<li><strong>Podcast with a remote guest<\/strong> \u2014 Case 1 with Zoom\/Meet: you on one track,<br>\nguest on the others, edit each side independently.<\/li>\n<li><strong>Streaming \/ screen recording with app audio<\/strong> \u2014 tap any app\u2019s sound into<br>\nOBS or QuickTime while still hearing it (Case 1\u2019s output half alone).<\/li>\n<li><strong>React \/ commentary videos<\/strong> \u2014 record the video\u2019s audio and your mic<br>\ncommentary as separate channels, no desk mixer.<\/li>\n<li><strong>Agent-vs-agent<\/strong> \u2014 two AI agents talking: one\u2019s output cable is the<br>\nother\u2019s input cable, DialF taps both.<\/li>\n<li><strong>CI voice tests<\/strong> \u2014 a Mac mini runner where the preflight script <em>is<\/em> the<br>\nfixture; <code>--private<\/code> aggregates keep the runner\u2019s device list clean.<\/li>\n<li><strong>Whole-house audio<\/strong> \u2014 <code>multi create<\/code> with every AirPlay\/HDMI output;<br>\ndrift correction keeps rooms in sync.<\/li>\n<\/ul>\n<p>Whatever the variation, the ask is one sentence: <em>\u201cread<br>\n<a href=\"https:\/\/github.com\/Agora-Build\/audictl\">https:\/\/github.com\/Agora-Build\/audictl<\/a> and wire my Mac to record ___.\u201d<\/em><br>\nYour audio engineer is in.<\/p>\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gfmr_meta_descriptions":[],"_gfmr_multilingual_taxonomy_terms":[],"footnotes":""},"categories":[135,150,1,34],"tags":[],"class_list":["post-1144","post","type-post","status-publish","format-standard","hentry","category-ai","category-audio","category-misc","category-multimedia"],"_links":{"self":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts\/1144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/comments?post=1144"}],"version-history":[{"count":3,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts\/1144\/revisions"}],"predecessor-version":[{"id":1147,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts\/1144\/revisions\/1147"}],"wp:attachment":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/media?parent=1144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/categories?post=1144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/tags?post=1144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}