[LAU] [ANN] Kanaha Audio 1.0.0 and Kanaha Camera Control 1.4.2

robertlazarski <[email protected]> Mon, 27 Apr 2026 11:58:27 -1000
Newsgroups gmane.linux.audio.users
Message-ID <CABpPLBUs_GAAzwJ_L0uZPbaTw=B2FSzhQQfa3N0dNkr6RU=6+A@mail.gmail.com>
Multi-Device Workflowontrol 1.4.2
<https://github.com/robertlazarski/kanaha-audio/tree/main#multi-device-workflow>

The phones are servers. Your laptop is the client. Bash scripts on a Linux
desktop orchestrate multiple phones over WiFi — the opposite of the usual
"phone app with a cloud backend" pattern. The app itself is minimal (one
button); all the real work happens from curl and bash.

# Laptop discovers phones via mDNS automatically:
./tools/test-audio-workflow.sh workflow

# Or specify IPs directly:
# Moto X4 records room audio via built-in mic
# Pixel records 4K video + LTC/SMPTE timecode on ch1 via iRig Pro I/O mono
# All traffic is mTLS (mutual TLS) — both client and server certificates
# required. The script passes certs to curl automatically.
./tools/test-audio-workflow.sh workflow \
  --audio-device 192.168.8.126 --video-device 192.168.8.159

# What happens:
#   1. Both devices start recording simultaneously
#      (GPS sidecar timestamps sync the two devices — no LTC needed
#      on the Moto since it records room audio for edit cues, not timecode)
#   2. You play audio cues (music, speech, music)
#   3. Script analyzes the Moto room recording on-device:
#      - whisper.cpp finds "next slide please" at 60.0s and 62.0s
#      - YAMNet finds Music starting at 30.2s, ending at 99.4s
#   4. Script generates an ffmpeg EDL and assembles the final video

Kanaha Audio <https://github.com/robertlazarski/kanaha-audio> and Kanaha
Camera Control <https://github.com/robertlazarski/kanaha> are two
applications built on the same mod_axis2
<https://axis.apache.org/axis2/c/core/> foundation — same HTTP/2 JSON-RPC
dispatch, same mTLS security, same curl-based scripting. Kanaha Camera
Control adds 9 video operations. Kanaha Audio adds 14 audio operations.
Both expose MCP tools for Claude. The framework scales to new services
without changing the architecture.

See test-audio-workflow.sh
<https://github.com/robertlazarski/kanaha-audio/blob/main/tools/test-audio-workflow.sh>,
generate-edl.sh
<https://github.com/robertlazarski/kanaha-audio/blob/main/tools/generate-edl.sh>,
and EDL.md
<https://github.com/robertlazarski/kanaha-audio/blob/main/docs/EDL.md>.
Kanaha Audio Architecture
curl → HTTPS/HTTP2+mTLS → Apache httpd → Apache Axis2/C →
audio_search_service.c
  → "searchKeywords"    → whisper.cpp     → keyword timestamps
  → "detectAudioEvents" → TFLite/YAMNet   → instrument/event detection
  → "startRecording"    → AAudio input    → WAV file + GPS sidecar
  → "stopRecording"     → finalize WAV    → duration + file size
  → "playTone"          → AAudio output   → speaker (clock_nanosleep sync)
  → "decodeLTC"         → libltc          → SMPTE timecode frames as JSON
  → "sftpTransfer"      → libssh2         → file transfer to storage server
  → "getStatus"         → recording state + GPS + model info

No Intent IPC needed (unlike Kanaha Camera
<https://github.com/robertlazarski/kanaha>). All dependencies are
permissive C/C++ libraries that link directly into the same native process
— two ML models, microphone recording, tone playback, and GPS metadata
through one Apache Axis2/C service. No JNI, no Java audio stack, no
serialization overhead.
Kanaha Audio API Operations
<https://github.com/robertlazarski/kanaha-audio/tree/main#kanaha-audio-api-operations>
Operation Description
searchKeywords Find keyword timestamps in audio file
transcribe Full transcription with word-level timestamps
detectAudioEvents YAMNet audio event detection (521 AudioSet classes)
startRecording Record from microphone to WAV (supports start_at scheduling)
stopRecording Stop recording, finalize WAV, return duration
playTone Sine wave through speaker (supports start_at for multi-device sync)
listRecordings List WAV recordings with sizes and durations
getStatus Model state, recording state, GPS location
listModels Available whisper models on device
loadModel Load/switch whisper model
listAudioFiles List processable audio files
playAudio Play a WAV file through the device speaker
decodeLTC Decode SMPTE/LTC timecode from WAV (libltc)
sftpTransfer Transfer audio files to storage server via SFTP (libssh2)
Kanaha Audio MCP Support
<https://github.com/robertlazarski/kanaha-audio/tree/main#kanaha-audio-mcp-support>

Kanaha Audio exposes all 14 operations as MCP tools, so Claude can record
audio, search for keywords, detect instruments, and decode timecode
directly. See MCP.md
<https://github.com/robertlazarski/kanaha-audio/blob/main/docs/MCP.md> for
Claude Desktop configuration.

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' |
/data/data/org.kanaha.audio/files/kanaha-audio-mcp

Also useful for finding misplaced phones. During development, a Pixel went
missing. "Claude, find my phone" → Claude called playTone in a loop until
the 1kHz beep was traced to a couch cushion. Not its intended purpose, but
playTone doesn't judge.