import { AbstractTTSClient } from "../core/abstract-tts";
import type { SpeakOptions, TTSCredentials, UnifiedVoice } from "../types";
export type GeminiTTSModel = "gemini-3.1-flash-tts-preview" | "gemini-2.5-flash-preview-tts";
export type GeminiTTSVoice = "Zephyr" | "Puck" | "Charon" | "Kore" | "Fenrir" | "Leda" | "Orus" | "Aoede" | "Callirrhoe" | "Autonoe" | "Enceladus" | "Iapetus" | "Umbriel" | "Algieba" | "Despina" | "Erinome" | "Algenib" | "Rasalgethi" | "Laomedeia" | "Achernar" | "Alnilam" | "Schedar" | "Gacrux" | "Pulcherrima" | "Achird" | "Zubenelgenubi" | "Vindemiatrix" | "Sadachbia" | "Sadaltager" | "Sulafat";
export interface GeminiTTSOptions extends SpeakOptions {
    model?: GeminiTTSModel | string;
    voice?: GeminiTTSVoice | string;
    format?: "wav" | "pcm" | "mp3";
    providerOptions?: Record<string, unknown>;
}
export interface GeminiTTSCredentials extends TTSCredentials {
    apiKey?: string;
    baseURL?: string;
    model?: GeminiTTSModel | string;
    voice?: GeminiTTSVoice | string;
    properties?: Record<string, unknown> | string;
    propertiesJson?: string;
}
type GeminiVoiceGender = "Male" | "Female";
type GeminiVoiceInfo = {
    id: GeminiTTSVoice;
    name: GeminiTTSVoice;
    style: string;
    gender: GeminiVoiceGender;
};
/**
 * Gemini Flash TTS client.
 *
 * Uses the Gemini generateContent REST API directly. Gemini TTS returns PCM audio;
 * this client wraps it as WAV by default so normal playback and conversion paths work.
 */
export declare class GeminiTTSClient extends AbstractTTSClient {
    private apiKey;
    private baseUrl;
    private model;
    static readonly DEFAULT_MODEL: GeminiTTSModel;
    static readonly DEFAULT_VOICE: GeminiTTSVoice;
    static readonly VOICES: GeminiVoiceInfo[];
    constructor(credentials?: GeminiTTSCredentials);
    private getEnv;
    private applyCredentialProperties;
    private prepareText;
    setModel(model: string): void;
    setVoice(voiceId: string): void;
    getProperty(property: string): any;
    setProperty(property: string, value: any): void;
    protected getRequiredCredentials(): string[];
    checkCredentials(): Promise<boolean>;
    checkCredentialsDetailed(): Promise<{
        success: boolean;
        error?: string;
        voiceCount?: number;
    }>;
    protected _getVoices(): Promise<any[]>;
    protected _mapVoicesToUnified(rawVoices: any[]): Promise<UnifiedVoice[]>;
    synthToBytes(text: string, options?: GeminiTTSOptions): Promise<Uint8Array>;
    synthToBytestream(text: string, options?: GeminiTTSOptions): Promise<{
        audioStream: ReadableStream<Uint8Array>;
        wordBoundaries: Array<{
            text: string;
            offset: number;
            duration: number;
        }>;
    }>;
    private extractAudioBytes;
    private base64ToBytes;
    private pcm16ToWav;
    private writeAscii;
}
export {};
