import type { CrowcoderConfig, VoiceConfig, VoiceSttConfig, VoiceTtsConfig, VoiceAccessibilityConfig } from './types.js'; export declare const DEFAULT_ASSISTANT_VOICE = "21m00Tcm4TlvDq8ikWAM"; export declare const DEFAULT_USER_VOICE = "AZnzlk1XvdvUeBnXmlld"; export declare function getVoiceConfig(config: CrowcoderConfig): VoiceConfig; export declare function isVoiceEnabled(config: CrowcoderConfig): boolean; export declare function getSttKey(config: CrowcoderConfig): string; export declare function getTtsKey(config: CrowcoderConfig): string; export declare function getSttConfig(config: CrowcoderConfig): Required> & { apiKey: string; }; export declare function getTtsConfig(config: CrowcoderConfig): Required> & { apiKey: string; }; export declare function getAccessibilityConfig(config: CrowcoderConfig): Required; /** * Remove fenced + inline code blocks from text before TTS. Code read aloud is * a wall of symbols ("backtick t s c semicolon") that's both useless to a * blind user and very long. We replace fenced blocks with a brief audible * announcement so the listener knows code WAS produced, just not read. */ export declare function stripCodeForTts(text: string): string; /** * Split text into sentence-ish chunks so we can stream TTS — play paragraph * 1 while paragraph 2 is being synthesized. Also lets the user skip/replay * at a meaningful granularity (Alt+D = skip, Alt+A = replay). * * Splits on paragraph boundaries first; chunks larger than ~400 chars are * further split on sentence boundaries. */ export declare function chunkForTts(text: string, maxChunkChars?: number): string[]; /** * Synthesize text to speech via ElevenLabs and return the audio bytes. * Returns null when not configured or on error — callers fall back silently * to text-only output rather than crashing the REPL. */ export interface TtsRequestOptions { voiceId: string; model?: string; speed?: number; stability?: number; similarityBoost?: number; } export declare function synthesizeSpeech(text: string, cfg: CrowcoderConfig, opts: TtsRequestOptions): Promise; /** * Convenience: synthesize + play. Returns true if played successfully. * Use this for short utterances (mode announcements, beeps, errors). * * Honors the panic-stop suppression window set by Shift+F6 — if * __voiceSuppressUntilMs is in the future, every speak() call no-ops * silently. F6 / F8 only abort the CURRENT chunk; panic-stop has to * also prevent incidental utterances (error announcements, mode * switches, audio cues) from immediately filling the silence. */ export declare function speak(text: string, cfg: CrowcoderConfig, opts: TtsRequestOptions & { signal?: AbortSignal; }): Promise; /** * Speak the assistant's response, chunked, with code stripped if configured. * Returns the number of chunks played. Honors the cancel signal so Ctrl+C * during playback halts cleanly. */ export declare function speakAssistantResponse(text: string, cfg: CrowcoderConfig, signal?: AbortSignal): Promise; /** * Speak the user's input back in the user-echo voice. Skipped for slash * commands (`/foo …`) since those aren't worth re-reading. */ export declare function speakUserEcho(text: string, cfg: CrowcoderConfig, signal?: AbortSignal): Promise; /** * Send recorded audio to Whisper and return the transcript. Returns null on * failure; caller logs + degrades. */ export declare function transcribeAudio(audio: Buffer, cfg: CrowcoderConfig, format?: 'wav' | 'mp3' | 'webm'): Promise; /** * Record from the mic, send to Whisper, return the transcript. Plays audio * cues at each state change so blind users can follow what's happening. * * Caller is responsible for starting/stopping the recording via the * `recordController` — but for the simple "one-shot" case (e.g. `/dictate` * slash command), `dictateOnce(maxSeconds)` is the easy entry point. */ export declare function dictateOnce(cfg: CrowcoderConfig, maxSeconds?: number): Promise; /** * Pretty-print voice config status for /voice (no args). */ export declare function printVoiceStatus(cfg: CrowcoderConfig): void;