- /speak <voice> enables TTS with selected voice (irina, denis, dmitri)
- /speak stop disables TTS in the chat
- Private chats keep always-on TTS behavior
- Add PIPER_VOICES env var for voice-to-URL mapping
- Add chat type field to distinguish private/group chats
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Root cause: parseFromSlice returns slices pointing into the raw JSON
body, but body was freed immediately after parsing in getUpdates
- Fix: return OwnedParsed wrapper that keeps both parsed result and
raw body alive together
- Switch HTTP layer to curl subprocess (more reliable than std.http
with static linking)
- Fix downloadToFile: use spawnAndWait instead of collectOutput
(collectOutput requires both pipes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Long-polling bot that accepts voice messages and video notes,
sends them to Whisper STT API, and replies with transcription text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>