import { G2PResult, PreserveLiteralsMode } from "./tokenizer.js";
export interface PronunciationTerm {
    id?: string;
    text: string;
    canonical?: string;
    pronunciations?: Array<string | string[]>;
    aliases?: string[];
    metadata?: Record<string, unknown>;
}
export interface PronunciationScanOptions {
    language?: string;
    spanUnit?: "token" | "character";
    maxDistanceRatio?: number;
    minDistance?: number;
    maxDistance?: number | null;
    thresholdBasis?: "phonemes" | "characters";
    wordBoundaryMode?: "strict" | "flexible";
    tokenSlack?: number;
    qgramSize?: number;
    maxTermPronunciations?: number;
    verifier?: "auto" | "ukkonen" | "myers";
    scoring?: "phoneme" | "hybrid";
    phonemeWeight?: number;
    textWeight?: number;
    minScore?: number;
    resolveOverlaps?: "all" | "best_non_overlapping" | "per_term_best";
    allowShortFuzzy?: boolean;
    returnPhonemes?: boolean;
    debug?: boolean;
}
export interface PronunciationMatch {
    termId?: string | null;
    termText: string;
    canonical: string;
    aliasText?: string | null;
    matchedText: string;
    startChar: number;
    endChar: number;
    startToken: number;
    endToken: number;
    score: number;
    phonemeDistance: number;
    phonemeThreshold: number;
    phonemeSimilarity: number;
    textDistance?: number | null;
    textSimilarity?: number | null;
    termPronunciation?: string[] | string | null;
    matchedPronunciation?: string[] | string | null;
    metadata?: Record<string, unknown> | null;
}
export interface PronunciationScanStats {
    tokenCount?: number;
    windowCount?: number;
    candidateVariantsConsidered?: number;
    candidateVariantsVerified?: number;
    matchesReturned?: number;
    rejectedByLength?: number;
    rejectedByInputLimit?: number;
    rejectedByQgram?: number;
    rejectedByDistance?: number;
}
export interface PronunciationScanResult {
    matches: PronunciationMatch[];
    stats: PronunciationScanStats;
}
export interface PronunciationReplaceOptions {
    language?: string;
    spanUnit?: "token" | "character";
    maxDistanceRatio?: number;
    minDistance?: number;
    maxDistance?: number | null;
    thresholdBasis?: "phonemes" | "characters";
    wordBoundaryMode?: "strict" | "flexible";
    tokenSlack?: number;
    qgramSize?: number;
    maxTermPronunciations?: number;
    verifier?: "auto" | "ukkonen" | "myers";
    scoring?: "phoneme" | "hybrid";
    phonemeWeight?: number;
    textWeight?: number;
    minScore?: number;
    allowShortFuzzy?: boolean;
    returnPhonemes?: boolean;
    debug?: boolean;
    replacementSource?: "canonical" | "term_text" | "alias_text";
    caseStrategy?: "canonical" | "match_simple";
    conflictPolicy?: "weighted_interval" | "greedy_left_to_right" | "error";
    ambiguousPolicy?: "skip" | "keep_best";
    ambiguityMargin?: number;
    includeUnchanged?: boolean;
    includeDiscarded?: boolean;
    keepScanMatches?: boolean;
}
export interface PronunciationPatch {
    status?: "applied" | "unchanged" | "discarded_overlap" | "discarded_ambiguous" | "discarded_duplicate";
    discardReason?: string | null;
    termId?: string | null;
    termText: string;
    canonical: string;
    aliasText?: string | null;
    matchedText: string;
    replacementText: string;
    startChar: number;
    endChar: number;
    outputStartChar?: number | null;
    outputEndChar?: number | null;
    startToken: number;
    endToken: number;
    score: number;
    phonemeDistance: number;
    phonemeThreshold: number;
    phonemeSimilarity: number;
    textDistance?: number | null;
    textSimilarity?: number | null;
    changed: boolean;
    deltaChars: number;
    termPronunciation?: string[] | string | null;
    matchedPronunciation?: string[] | string | null;
    metadata?: Record<string, unknown> | null;
}
export interface PronunciationReplaceStats {
    tokenCount?: number;
    windowCount?: number;
    candidateVariantsConsidered?: number;
    candidateVariantsVerified?: number;
    rejectedByLength?: number;
    rejectedByQgram?: number;
    rejectedByDistance?: number;
    rawMatches?: number;
    dedupedMatches?: number;
    ambiguousDiscarded?: number;
    overlapDiscarded?: number;
    duplicateDiscarded?: number;
    appliedCount?: number;
    unchangedCount?: number;
}
export interface PronunciationReplaceResult {
    originalText: string;
    text: string;
    applied: PronunciationPatch[];
    discarded: PronunciationPatch[];
    patches: PronunciationPatch[];
    stats: PronunciationReplaceStats;
    rawMatches?: PronunciationMatch[] | null;
}
export interface PronunciationPredictor {
    predict(text: string, options?: {
        splitDelimiter?: string | RegExp | null;
        outputDelimiter?: string;
        preserveLiterals?: PreserveLiteralsMode;
    }): Promise<G2PResult>;
    getMaxInputLen?(): number | null;
}
export declare function pronunciationScanWithModel(model: PronunciationPredictor, text: string, terms: Array<string | PronunciationTerm>, options?: PronunciationScanOptions): Promise<PronunciationScanResult>;
export declare function pronunciationReplaceWithModel(model: PronunciationPredictor, text: string, terms: Array<string | PronunciationTerm>, options?: PronunciationReplaceOptions): Promise<PronunciationReplaceResult>;
export declare const mergeScanOptions: (options?: PronunciationScanOptions) => Required<PronunciationScanOptions>;
export declare const mergeReplaceOptions: (options?: PronunciationReplaceOptions) => Required<PronunciationReplaceOptions>;
