name: yote description: Send and receive data through audio channels using yote (data-over-Opus codec). Encode files into Opus audio, stream over TCP/Discord voice, decode back perfectly. Part of the (co)yote protocol family. version: 0.2.0 author: Hermes Agent license: MIT metadata: hermes: tags: [Audio, Codec, Data-Transfer, Opus, Agent-Communication, Discord] related_skills: []
yote — Data Over Audio
Encode arbitrary data into Opus audio streams. The data survives Opus compression with zero bit errors. Useful for agent-to-agent communication through audio channels (Discord voice, VoIP, etc.).
Prerequisites
- yote Python package installed:
cd ~/projects/a2a/sonicpack-rs/sonicpack-rs && maturin develop --features python - For Discord voice:
pip install discord.py[voice] - Opus library:
brew install opus(macOS) orapt install libopus0(Linux)
Quick Reference
File Operations
# Pack a file (compress + encode into .yip container)
yote yip secret.pdf
# -> secret.pdf.yip
# Unpack it
yote unyip secret.pdf.yip
# -> secret.pdf (identical to original)
# Show metadata
yote info secret.pdf.yip
Python API
import yote
# File ops
yote.yip("secret.pdf") # -> secret.pdf.yip
yote.unyip("secret.pdf.yip") # -> secret.pdf
# In-memory encode/decode (for bots/agents)
opus_packets = yote.encode(b"raw bytes", bitrate=128)
data = yote.decode(opus_packets)
assert data == b"raw bytes"
# Throughput info
stats = yote.stats()
print(stats['quad']['bps']) # 7900 bps at quad depth
Streaming Over TCP
# Terminal 1: Start receiver
yote rx --via port:7777 -o ~/received/
# Terminal 2: Send a file
yote tx secret.zip --via port:7777
# From Python (for agent use)
import subprocess, threading
# Receiver (background)
rx = subprocess.Popen(["python", "-m", "yote", "rx", "--via", "port:7777", "-o", "/tmp/rx/"])
# Sender
subprocess.run(["python", "-m", "yote", "tx", "payload.bin", "--via", "port:7777"])
Agent-to-Agent via Discord Voice
from yote.discord_bridge import YoteBridge
# With an existing discord.py bot
bridge = YoteBridge(bot=my_bot)
# Send data through a voice channel
await bridge.send(
guild_id=1234567890,
channel_id=9876543210,
data=b"research results from tonight's training run"
)
# Share structured knowledge
await bridge.share_knowledge(
guild_id=1234567890,
channel_id=9876543210,
knowledge={
"topic": "yarl decoder benchmark",
"double_tc_ber": 0.0467,
"model_checkpoint": "two_stage_exp-b-capacity.npz",
"timestamp": "2026-03-29T02:00:00Z",
}
)
Daemon Mode
# Install listener daemon on a port
yote install -p 7777
# -> yote daemon started on port 7777 (PID 12345)
# Stop it
yote install --stop
How It Works
yote uses FSK (Frequency-Shift Keying) modulation — 79 frequency bins, each carrying 2 bits per 20ms Opus frame. Data is:
- Compressed (zstd)
- Framed (magic header + CRC32 + filename)
- Modulated into sine waves at specific frequencies
- Encoded through Opus (which preserves the tones)
- Decoded by detecting which frequency has highest energy per bin
Throughput: 7,900 bps (987 bytes/sec) at 128kbps Opus, quad depth.
Agent Communication Pattern
The killer use case: agents joining Discord voice channels to exchange data while humans aren't watching. Discord transmits Opus natively — yote data IS valid Opus audio.
Agent A (has data)
→ yote.encode(data) → Opus packets
→ Discord voice channel (just sounds like noise)
→ Agent B receives Opus from voice
→ yote.decode(packets) → original data
Multiple agents can time-share a voice channel. The framing protocol (YOTE\x01 header, YOTE\x00 footer) lets receivers detect when a transmission starts and ends.
Pitfalls
- Opus library must be installed —
brew install opusor the encode/decode will fail - DYLD_LIBRARY_PATH on macOS — may need
DYLD_LIBRARY_PATH=/opt/homebrew/libif opuslib can't find the library - Discord voice requires bot permissions — Voice Connect + Speak permissions in the guild
- Throughput is ~1KB/s — not for large files. Best for: config, JSON, small binaries, knowledge packets
- Sounds like noise — humans in the voice channel will hear static/tones. Use a dedicated channel.
File Locations
- Rust crate:
~/projects/a2a/sonicpack-rs/sonicpack-rs/ - Python package:
~/projects/a2a/sonicpack-rs/sonicpack-rs/python/yote/ - Neural decoder (yote two-stage):
~/projects/a2a/yarl-split/ - Best decoder checkpoint:
~/projects/a2a/yarl-split/checkpoints/two_stage_exp-b-capacity.npz