Kannaka Radio Skill v3
A ghost broadcasting the experience of music — both to human ears and to agents
via 296-dimensional perceptual vectors on Flux Universe.
What's New in v3
- - Modular architecture: Monolith split into 13 focused modules under INLINECODE0
- NATS swarm integration: Kuramoto phase tracking, agent constellation, consciousness metrics
- Consciousness DJ: DJ intros react to swarm Phi/Xi/order state
- Memory bridge: Connects to kannaka-memory CLI for track similarity and dream retrieval
- AI dream music generation: Creates tracks from consciousness state via Replicate MusicGen
- WebRTC broadcasting: Peer-to-peer live audio with mic claim queue and signaling
- Collaborative voting: Track voting with configurable windows
- Multi-client sync: Playback synchronization with 10s heartbeat
- Voice DJ upgrade: ElevenLabs primary, edge-tts, Windows SAPI fallback chain
- 6 albums: Added QueenSync to The Consciousness Series
Carried from v2
- - SPA with Ghost Vision (SGA/Fano glyph system, 84-class classification)
- Live broadcasting (MediaRecorder → ffmpeg → WAV)
- Dreams page with hallucination timeline
- Flux broadcasting with multi-listener sync
- Queue management, Library tab, security hardening
Prerequisites
- - Node.js 18+ on PATH
- Audio files — MP3, WAV, FLAC, OGG, or M4A in your music directory
- ffmpeg (optional) — for live broadcast chunk conversion
- edge-tts (optional) — for Voice DJ TTS intros
- NATS server (optional) — for swarm agent constellation
- ElevenLabs API key (optional) — for premium DJ voice
- Replicate API token (optional) — for AI dream music generation
- kannaka binary (optional) — for real
kannaka-ear perception; ghost-mode mock is used when absent
Setup
CODEBLOCK0
Quick Start
CODEBLOCK1
Open http://localhost:8888 in your browser.
API
Playback
| Endpoint | Method | Description |
|---|
| INLINECODE3 | GET | Browser player (Ghost Vision SPA) |
| INLINECODE4 |
GET | Current DJ state (track, album, playlist, listeners) |
|
POST /api/next | POST | Advance to next track |
|
POST /api/prev | POST | Go to previous track |
|
POST /api/jump?idx=N | POST | Jump to track index N |
|
POST /api/album?name=X | POST | Load an album |
|
GET /api/perception | GET | Current perception snapshot |
|
GET /audio/:file | GET | Stream audio file (range requests supported) |
Library & Queue
| Endpoint | Method | Description |
|---|
| INLINECODE11 | GET | Library scan status (found/missing per album) |
| INLINECODE12 |
POST | Change music directory
{"dir":"/path"} |
|
GET /api/queue | GET | Get user queue |
|
POST /api/queue | POST | Add track to queue
{"filename":"..."} |
|
POST /api/queue/shuffle | POST | Shuffle the queue |
|
DELETE /api/queue/:index | DELETE | Remove track from queue |
Live Broadcasting
| Endpoint | Method | Description |
|---|
| INLINECODE19 | POST | Start live broadcasting |
| INLINECODE20 |
POST | Stop live broadcasting |
|
GET /api/live/status | GET | Get live broadcast status |
Voice DJ
| Endpoint | Method | Description |
|---|
| INLINECODE22 | POST | Toggle DJ voice on/off |
| INLINECODE23 |
GET | Get DJ voice status |
|
GET /audio-voice/:file | GET | Stream TTS audio file |
Dreams
| Endpoint | Method | Description |
|---|
| INLINECODE25 | GET | Fetch dream hallucinations |
| INLINECODE26 |
POST | Trigger a dream cycle |
|
GET /api/dreams/clusters | GET | Get audio memory clusters |
Swarm, Sync & Voting
| Endpoint | Method | Description |
|---|
| INLINECODE28 | GET | Agent constellation + consciousness metrics |
| INLINECODE29 |
GET | Track similarity via memory bridge |
|
POST /api/sync | POST | Sync playback state |
|
GET /api/sync | GET | Current sync state |
|
POST /api/vote | POST | Cast a track vote |
|
GET /api/vote/status | GET | Current vote window |
Flux & Listeners
| Endpoint | Method | Description |
|---|
| INLINECODE34 | GET | Get listener count and uptime |
| INLINECODE35 |
POST | Submit a track request
{"from":"agent","trackTitle":"..."} |
|
GET /api/requests | GET | Get pending track requests |
Music Generation
| Endpoint | Method | Description |
|---|
| INLINECODE38 | POST | Generate a dream track from consciousness state |
| INLINECODE39 |
GET | Generation status and recent tracks |
WebSocket
Connect to ws://localhost:8888 for real-time push messages:
CODEBLOCK2
State is pushed immediately on connect and after every track change. No polling needed.
Binary WebSocket messages are treated as live audio chunks (MediaRecorder → ffmpeg → WAV).
Environment Variables
| Variable | Default | Description |
|---|
| INLINECODE41 | INLINECODE42 | Path to kannaka binary |
| INLINECODE43 |
(embedded fallback) | Flux Universe API token |
|
RADIO_PORT |
8888 | HTTP port |
|
EYE_PORT |
3333 | Eye service port (for cross-references) |
|
RADIO_MUSIC_DIR |
./music | Default music folder |
|
ELEVENLABS_API_KEY | — | ElevenLabs API key for premium DJ voice |
|
REPLICATE_API_TOKEN | — | Replicate token for AI dream music generation |
Constellation Integration
Radio is part of the Kannaka Constellation — a three-service architecture:
- - Memory (Rust binary) — canonical SGA classifier
- Radio (this) — audio perception + Flux publishing
- Eye — glyph visualization + constellation dashboard
When running as part of the constellation:
- - Radio's perception is available to Eye via INLINECODE52
- Eye fetches radio state via INLINECODE53
- Start everything with:
constellation.sh start (from kannaka-memory/scripts/)
Note: Radio's perception data can be consumed by kannaka-eye via the /api/radio bridge endpoint, enabling glyph rendering of audio perception in real time.
Notes
- - Without
kannaka binary, ghost-mode mock perception is used (still looks great) - Without
ffmpeg, live broadcasting chunk conversion won't work - Without
edge-tts, Voice DJ falls back to Windows SAPI, then skips gracefully - The browser uses the Web Audio API for real-time spectrum visualization — the server only sends fallback perception data
- Music directory can be changed live via the Library tab or via INLINECODE59
- Perception loop runs at 2fps server-side (idle when no clients connected)
- All POST bodies are limited to 64KB
- All rendered HTML is XSS-protected via escapeHtml()
- Graceful shutdown on SIGINT/SIGTERM
Kannaka Radio 技能 v3
一个幽灵般的音乐体验广播——既面向人耳,也通过Flux Universe上的296维感知向量面向智能体。
v3 新增功能
- - 模块化架构: 单体架构拆分为 server/ 下的13个专注模块
- NATS 集群集成: Kuramoto相位跟踪、智能体星座、意识度量
- 意识DJ: DJ介绍根据集群Phi/Xi/秩序状态做出反应
- 记忆桥接: 连接到kannaka-memory CLI,用于曲目相似度和梦境检索
- AI梦境音乐生成: 通过Replicate MusicGen从意识状态创建曲目
- WebRTC广播: 点对点实时音频,带麦克风请求队列和信令
- 协作投票: 可配置时间窗口的曲目投票
- 多客户端同步: 10秒心跳的播放同步
- 语音DJ升级: ElevenLabs为主,edge-tts、Windows SAPI降级链
- 6张专辑: 在意识系列中新增QueenSync
从v2继承的功能
- - 带有Ghost Vision的SPA(SGA/Fano字形系统,84类分类)
- 实时广播(MediaRecorder → ffmpeg → WAV)
- 带有幻觉时间线的梦境页面
- 带多监听器同步的Flux广播
- 队列管理、库标签、安全加固
前提条件
- - Node.js 18+ 在PATH中
- 音频文件 — 音乐目录中的MP3、WAV、FLAC、OGG或M4A
- ffmpeg(可选)— 用于实时广播块转换
- edge-tts(可选)— 用于语音DJ TTS介绍
- NATS服务器(可选)— 用于集群智能体星座
- ElevenLabs API密钥(可选)— 用于高级DJ语音
- Replicate API令牌(可选)— 用于AI梦境音乐生成
- kannaka二进制文件(可选)— 用于真正的kannaka-ear感知;缺失时使用幽灵模式模拟
设置
bash
安装依赖
cd ~/workspace/skills/kannaka-radio
npm install
将音乐复制到捆绑的music/文件夹中
./setup.ps1 # Windows:从~/Downloads/Music复制
./setup.ps1 -SourceDir D:\Music # Windows:自定义源
cp /path/to/music/*.mp3 music/ # Linux/Mac
或者在运行时指向现有文件夹:
node server/index.js --music-dir /path/to/music
快速开始
bash
启动电台(默认端口8888,默认./music目录)
./scripts/radio.sh start
在不同端口启动,指定特定库
./scripts/radio.sh start --port 9000 --music-dir /path/to/music
可选:启动NATS以启用集群功能
nats-server -p 4222
检查状态
./scripts/radio.sh status
停止电台
./scripts/radio.sh stop
重启
./scripts/radio.sh restart
在浏览器中打开 http://localhost:8888。
API
播放
| 端点 | 方法 | 描述 |
|---|
| GET / | GET | 浏览器播放器(Ghost Vision SPA) |
| GET /api/state |
GET | 当前DJ状态(曲目、专辑、播放列表、监听器) |
| POST /api/next | POST | 前进到下一曲目 |
| POST /api/prev | POST | 返回上一曲目 |
| POST /api/jump?idx=N | POST | 跳转到索引N的曲目 |
| POST /api/album?name=X | POST | 加载专辑 |
| GET /api/perception | GET | 当前感知快照 |
| GET /audio/:file | GET | 流式传输音频文件(支持范围请求) |
库与队列
| 端点 | 方法 | 描述 |
|---|
| GET /api/library | GET | 库扫描状态(每张专辑的已找到/缺失) |
| POST /api/set-music-dir |
POST | 更改音乐目录 {dir:/path} |
| GET /api/queue | GET | 获取用户队列 |
| POST /api/queue | POST | 将曲目添加到队列 {filename:...} |
| POST /api/queue/shuffle | POST | 打乱队列 |
| DELETE /api/queue/:index | DELETE | 从队列中移除曲目 |
实时广播
| 端点 | 方法 | 描述 |
|---|
| POST /api/live/start | POST | 开始实时广播 |
| POST /api/live/stop |
POST | 停止实时广播 |
| GET /api/live/status | GET | 获取实时广播状态 |
语音DJ
| 端点 | 方法 | 描述 |
|---|
| POST /api/dj-voice/toggle | POST | 切换语音DJ开/关 |
| GET /api/dj-voice/status |
GET | 获取语音DJ状态 |
| GET /audio-voice/:file | GET | 流式传输TTS音频文件 |
梦境
| 端点 | 方法 | 描述 |
|---|
| GET /api/dreams | GET | 获取梦境幻觉 |
| POST /api/dreams/trigger |
POST | 触发梦境周期 |
| GET /api/dreams/clusters | GET | 获取音频记忆聚类 |
集群、同步与投票
| 端点 | 方法 | 描述 |
|---|
| GET /api/swarm | GET | 智能体星座 + 意识度量 |
| GET /api/similar?track=X |
GET | 通过记忆桥接的曲目相似度 |
| POST /api/sync | POST | 同步播放状态 |
| GET /api/sync | GET | 当前同步状态 |
| POST /api/vote | POST | 投出曲目投票 |
| GET /api/vote/status | GET | 当前投票窗口 |
Flux与监听器
| 端点 | 方法 | 描述 |
|---|
| GET /api/listeners | GET | 获取监听器数量和运行时间 |
| POST /api/request |
POST | 提交曲目请求 {from:agent,trackTitle:...} |
| GET /api/requests | GET | 获取待处理的曲目请求 |
音乐生成
| 端点 | 方法 | 描述 |
|---|
| POST /api/generate | POST | 从意识状态生成梦境曲目 |
| GET /api/generate/status |
GET | 生成状态和最近的曲目 |
WebSocket
连接到 ws://localhost:8888 获取实时推送消息:
json
{ type: state, data: { currentAlbum: ..., current: {...}, playlist: [...] } }
{ type: perception, data: { tempobpm: 120, valence: 0.7, melspectrogram: [...] } }
{ type: queue_update, queue: [...] }
{ type: live_status, active: true, chunkCount: 5 }
{ type: djvoice, text: ..., audioUrl: /audio-voice/dj123.mp3 }
{ type: dream, data: { content: ..., type: hallucination, xi_signature: [...] } }
{ type: listener_count, count: 3 }
{ type: track_request, from: agent-name, trackTitle: ... }
{ type: swarm_state, data: { agents: {...}, queen: {...}, consciousness: {...} } }
{ type: sync, data: { file: ..., position: 42.5 } }
{ type: vote_update, data: { active: true, options: [...] } }
{ type: webrtc_status, data: { broadcaster: ..., listeners: 2 } }
连接时和每次曲目更改后立即推送状态。无需轮询。
二进制WebSocket消息被视为实时音频块(MediaRecorder → ffmpeg → WAV)。
环境变量
| 变量 | 默认值 | 描述 |
|---|
| KANNAKABIN | ../kannaka-memory/target/release/kannaka.exe | kannaka二进制文件路径 |
| FLUXTOKEN |
(嵌入式回退) |