/**
 * Voice feature entry point: resolve which TTS engine a bot should use
 * (per-bot override → global config), report whether voice is configured
 * (gates the "🔊 语音总结" button), and synthesize text → a ready-to-send
 * ogg/opus file.
 *
 * Engine is pluggable behind a tiny contract (text → PCM): `sami` (in-tree
 * JSON-over-WS, internal) and `openai` (OpenAI-compatible HTTP, open-source
 * default). Neither pulls a heavyweight dependency into the package.
 */
import { type OpusResult } from './audio.js';
import type { VoiceConfig } from './types.js';
export type { VoiceConfig, VoiceEngine } from './types.js';
/** Default SAMI voice — 灿灿 (bigtts), the product-chosen default. */
export declare const DEFAULT_SAMI_SPEAKER = "zh_female_cancan_mars_bigtts";
/** Default OpenAI-compatible voice. */
export declare const DEFAULT_OPENAI_SPEAKER = "alloy";
/** Pure evaluation: per-bot `voice` merged over global `voice`, validated for
 *  usable creds. Exported for testing the button-gating logic without disk. */
export declare function evaluateVoiceConfig(global?: VoiceConfig, perBot?: VoiceConfig): VoiceConfig | null;
/** Resolve effective voice config for a bot: per-bot `voice` merged over the
 *  global `voice` block. Returns null when nothing usable is configured. */
export declare function resolveVoiceConfig(larkAppId?: string): VoiceConfig | null;
/** Cheap predicate for conditionally rendering the voice button. */
export declare function isVoiceConfigured(larkAppId?: string): boolean;
/**
 * Synthesize `text` into an ogg/opus file for a Feishu voice bubble.
 * Caller owns the returned temp dir and must rm -rf it after sending.
 * Throws when voice isn't configured for this bot or synthesis fails.
 */
export declare function synthesizeVoiceOpus(larkAppId: string | undefined, text: string): Promise<OpusResult>;
//# sourceMappingURL=index.d.ts.map