whatsapp-claude-gpt
Version:
WhatsApp-Claude-GPT is a WhatsApp chatbot that supports multiple AI providers for chat, optional image generation/editing, and voice (speech-to-text and text-to-speech). It’s built for natural, contextual conversations and can now also handle reminders an
55 lines (47 loc) • 1.62 kB
text/typescript
import axios, { AxiosResponse } from 'axios';
import logger from '../logger';
import { AIConfig } from '../config';
import { sanitizeForLog } from '../utils';
export enum CVoices {
GEORGE = 'JBFqnCBsd6RMkjVDRZzb',
SARAH = 'EXAVITQu4vr4xnSDxMaL',
LILY = 'pFZP5JQG7iQjIQuC4Bku',
ALICE = 'Xb7hH8MSUJpSbSDYk0k2',
ARIA = '9BWtsMINqrJLrRacOk9x'
}
export async function elevenTTS(msg: string, voice: CVoices = CVoices.LILY): Promise<string> {
logger.debug(`[${AIConfig.SpeechConfig.provider}->speech] Creating speech audio (${msg?.length ?? 0} chars)`);
const url = `https://api.elevenlabs.io/v1/text-to-speech/${voice ?? AIConfig.SpeechConfig.voice}?output_format=mp3_44100_128`;
const body = {
text: msg,
model_id: AIConfig.SpeechConfig.model,
voice_settings: {
stability: 0.7,
similarity_boost: 0.7,
style: 0.25,
use_speaker_boost: true
},
};
const headers = {
'xi-api-key': AIConfig.SpeechConfig.apiKey,
'Content-Type': 'application/json',
};
const options: any = {
responseType: 'arraybuffer',
method: 'POST',
headers: headers,
data: body,
url,
};
try {
const response: AxiosResponse<any> = await axios(options);
if (!response.data || response.data.length === 0) {
throw new Error('ElevenLabs returned empty audio data.');
}
const audioBuffer = Buffer.from(response.data);
return audioBuffer.toString('base64');
} catch (error: any) {
logger.error(`[ElevenLabs->TTS] Error: ${JSON.stringify(sanitizeForLog(error))}`);
throw new Error(`ElevenLabs TTS failed: ${error.message}`);
}
}