js-tts-wrapper
Version:
A JavaScript/TypeScript library that provides a unified API for working with multiple cloud-based Text-to-Speech (TTS) services
71 lines (70 loc) • 2.87 kB
TypeScript
import { AbstractTTSClient } from "../core/abstract-tts.js";
import type { SpeakOptions, TTSCredentials, UnifiedVoice } from "../types.js";
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 {};