Generate expressive AI voices, clone your own, and talk to AI characters
π Live Demo β’ πΊοΈ Roadmap β’ π Quick Start β’ β¨ Features β’ π οΈ Tech Stack β’ βοΈ Deployment and release checks
- Generate AI voices in 24+ supported languages and locales
- 57 public speech voices from Google Gemini (
gpro,gpro31,gpro38) and xAI Grok (xai), plus 6 built-in voices for calls - Voice cloning across 28 languages
- Credit-based usage system
- User authentication and profile management (Google)
- Architecture Overview
SexyVoice.ai brings voice generation, voice cloning, and live AI calls into one app. Generate expressive speech with Gemini and Grok voices, clone your own voice, or create a character with a personality and a voice you choose. Developers can use the external API for speech generation with the same credit balance as the dashboard. See GLOSSARY.md for domain names and definitions.
- AI Voice Generation: Create realistic voices powered by Google Gemini, xAI Grok, and additional TTS models
- Voice Cloning: Clone your own voice with as little as 10 seconds of audio
- Live AI Voice Calls: Talk to AI characters in real time; paid users can create characters and choose a cloned voice
- Voice Selection System: Choose from 57 public speech voices: Gemini voices such as
achernar,kore,puck, andzephyron Gemini 2.5, 3.1, and 3.8, Spanish role voices for Spain and Mexico, and Grok voices such asara,carina,eve,leo,rex,sal, andzagan - Multi-language Support: Generate speech in 24+ supported languages and locales, with broad multilingual coverage for generation, cloning, and real-time voice experiences
- Audio Transcription: Transcribe audio files to text offline in 99+ languages with optional translation to English using Whisper AI
- Secure Authentication: Multiple login options with Google (more coming soon)
- Credit-based System: Fair usage tracking with transparent pricing
- Profile Management: Personalized dashboard and settings
- Audio History: Track and manage all your generated content
- Responsive Design: Optimized for desktop and mobile devices
- International Support: Full i18n implementation powered by
next-intlfor global accessibility (EN/ES/DE/DA/IT/FR) - Localized Site Banners: Shared banner system for promos and announcements across landing, blog, and dashboard with independent dismiss state and one visible banner at a time
- Rate Limiting: Fair usage policies to ensure platform stability
- Real-time Updates: Live audio generation with progress tracking
- Public Tools: Free utility tools including audio transcription and format conversion
- Next.js 16 - React framework with App Router and TypeScript
- next-intl - Internationalization for Next.js App Router; messages in
apps/web/messages/*.json;getMessages()for server components,useTranslations()for client components - React 19 - Server Components (RSCs), Suspense, and Server Actions
- Tailwind CSS 4 - Utility-first CSS framework
- shadcn/ui - Modern component library
- Radix UI - Headless component primitives
- Supabase - Authentication and PostgreSQL database with SSR support
- Drizzle ORM - Type-safe database operations (planned)
- Cloudflare R2 - Scalable audio file storage with global CDN
- Vercel - Deployment and hosting platform
- Sentry - Error tracking and performance monitoring
- PostHog - Product analytics and feature flags
- Axiom - Structured request logging for API routes
- Stripe - Payment processing and subscription management
- Biome - Fast linter and formatter
- TypeScript - Type safety and developer experience
- Contentlayer - Type-safe content management
- Husky - Git hooks for automated tasks
- lint-staged - Runs commands on staged files
apps/web- Next.js web app deployed to Vercel.apps/docs- Fumadocs docs app fordocs.sexyvoice.ai.scripts- operational scripts kept outside the web app as@sexyvoice/scripts.docs- internal engineering and operational docs.
Root commands are orchestrated with Turborepo. Use package filters when you
only want one app, for example pnpm --filter @sexyvoice/web dev.
- Node.js 24+
- pnpm
- Supabase account - https://supabase.com
-
Clone the repository
git clone https://github.com/gianpaj/sexyvoice.git cd sexyvoice -
Install dependencies
pnpm install
-
Set up environment variables
cp apps/web/.env.example apps/web/.env.local
Fill in the required environment variables as defined in
apps/web/.env.example:- Supabase
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY- Safe for browser clients; database access remains controlled by RLSSUPABASE_SECRET_KEY- Server-only admin key that bypasses RLS; never expose it to clients or use aNEXT_PUBLIC_prefix
- Your Redis (Upstash)
KV_REST_API_URLKV_REST_API_TOKEN
- Cloudflare R2 storage
R2_ACCESS_KEY_IDR2_SECRET_ACCESS_KEYR2_BUCKET_NAMER2_SPEECH_API_BUCKET_NAME- Dedicated bucket for/api/v1/speechgenerated audioR2_ENDPOINT- Your Cloudflare R2 endpoint URL (https://xxx.r2.cloudflarestorage.com)
- AI 3rd party services
REPLICATE_API_TOKEN- Your Replicate API token for speech generation and one-off voice cloningFAL_KEY- Your fal.ai API key for reference audio enhancementGOOGLE_GENERATIVE_AI_API_KEY- Your Google Generative AI API key for text-to-speech and enhance text (automatically add emotion tags)XAI_API_KEY- Your xAI API key for Grok speech generation and call transcript analysisXAI_API_BASE_URL- Optional xAI REST host override for the Batch API client (defaulthttps://api.x.ai)CALL_ANALYSIS_REALTIME- Optional; set totrueto analyse call transcripts inline in the webhook instead of via the xAI Batch API queue (emergency bypass)
- Real-time Calls (LiveKit)
LIVEKIT_URLLIVEKIT_API_KEYLIVEKIT_API_SECRETLIVEKIT_AGENT_NAME- Optional; defaults tosexycall, and must match the deployed agent's registered name
- Stripe
STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETSTRIPE_TOPUP_STARTER_PRICE_IDSTRIPE_TOPUP_STANDARD_PRICE_IDSTRIPE_TOPUP_PRO_PRICE_IDSTRIPE_SUBSCRIPTION_STARTER_PRICE_IDSTRIPE_SUBSCRIPTION_STANDARD_PRICE_IDSTRIPE_SUBSCRIPTION_PRO_PRICE_IDSTRIPE_SUBSCRIPTION_FIRST_MONTH_COUPON_ID- Optional Stripe coupon applied automatically for eligible first-time subscribersSTRIPE_SUBSCRIPTION_FIRST_MONTH_DISCOUNT_PERCENT- Optional first-month discount percentage used to display discounted subscription pricing when the coupon is configured
- Banner and promotion configuration
NEXT_PUBLIC_PROMO_ENABLED- Enables promo banners and bonus-credit pricingNEXT_PUBLIC_ACTIVE_PROMO_BANNER- Active promo banner id fromapps/web/messages/*.jsonandapps/web/lib/banners/registry.tsNEXT_PUBLIC_ACTIVE_ANNOUNCEMENT_BANNER- Active announcement banner id fromapps/web/messages/*.jsonandapps/web/lib/banners/registry.tsNEXT_PUBLIC_PROMO_THEME- Banner theme (pink,orange,blue)NEXT_PUBLIC_PROMO_COUNTDOWN_END_DATE- Optional countdown end date for promo banners that support itNEXT_PUBLIC_PROMO_ID- Promo identifier still used by Stripe metadata and credit bonus flowsNEXT_PUBLIC_PROMO_BONUS_STARTERNEXT_PUBLIC_PROMO_BONUS_STANDARDNEXT_PUBLIC_PROMO_BONUS_PRO
- Telegram cronjob
TELEGRAM_WEBHOOK_URL- for daily stats notificationsCRON_SECRET- For securing the cron API routes (/api/daily-stats,/api/call-sessions/analyze/batch) - See Managing Cron Jobs
- Axiom logging (optional)
AXIOM_TOKEN- Your Axiom API token for structured request logging on/api/v1/speech
- API key security
API_KEY_HMAC_SECRET- Secret used to HMAC-SHA256 hash API keys before storing them in the database. Generate withopenssl rand -hex 32. Without this, keys fall back to plain SHA-256 (acceptable in development, never in production).
- Vercel Edge Config (optional)
EDGE_CONFIG- Your Vercel Edge Config connection string (automatically set when you link an Edge Config to your project)
- Additional optional variables for analytics and monitoring (Crisp, Posthog)
- E2E builds only
NEXT_PUBLIC_E2E_TEST_MODE- Build-time; set totrueto disable the browser Sentry client so CI runs don't report into production Sentry
For environment variables, infrastructure configuration, and release verification, see Deployment and release checks.
- Supabase
-
Set up Supabase
- Create a new project at Supabase
- Run database migrations:
cd apps/web supabase db push cd ../..
-
Start the development server
pnpm dev
-
Open your browser The web app runs through Portless at https://sv.dev. The
portless.jsonapp name only sets the route name;PORTLESS_TLD=devinapps/web/package.jsonmakes the route use.devinstead of the default.localhost.If you previously installed the Portless startup service, it may restart the default
.localhostproxy on port 443 and block.dev. Remove the service before starting the app:sudo portless service uninstall sudo portless proxy stop pnpm dev
The app uses a shared banner system for both promotions and announcements:
apps/web/components/banner.tsxrenders the banner UIapps/web/lib/banners/registry.tsdefines supported bannersapps/web/lib/banners/resolve-banner.tsresolves the single visible banner per placementapps/web/components/banner.tsxwrites dismissal cookies throughapps/web/lib/cookies.ts
Banner copy is localized in apps/web/messages/*.json.
Only one banner is shown at a time, and each banner has its own dismiss cookie.
| Command | Description |
|---|---|
pnpm dev |
Start all workspace dev tasks |
pnpm --filter @sexyvoice/web dev |
Start only the web app dev server |
pnpm build |
Build workspace apps with Turbo |
pnpm test |
Run test suites |
pnpm test:db |
Run Supabase pgTAP tests locally |
pnpm test:ui |
Run Vitest UI for the web app |
pnpm lint |
Lint web and docs code with Biome |
pnpm type-check |
Run TypeScript type checking |
pnpm format |
Check web and docs formatting with Biome |
pnpm check-translations |
Validate all locale files have matching keys |
pnpm build:content |
Build web app content layer |
pnpm clean |
Check unused dependencies with Knip |
pnpm fixall |
Apply Biome format, lint, and assist fixes |
Run the test suite:
pnpm testAfter applying pending migrations to the local Supabase database, run the pgTAP database tests:
pnpm test:dbFor the Vitest UI during development:
pnpm test:uiGenerate TypeScript types from Supabase Cloud Database:
pnpm run generate-supabase-typesPush schema changes to Supabase:
cd apps/web
supabase db push
cd ../..Fetch database migrations:
cd apps/web
supabase migration fetch
cd ../..Backup database and schema:
export SUPABASE_DB_URL=postgresql://postgres:xxx@db.yyyy.supabase.co:5432/postgres
sh ./scripts/db_backups.shThe docs site at docs.sexyvoice.ai is a Fumadocs (Next.js) app in
apps/docs. Content lives in apps/docs/content/.
- Run it locally with
pnpm --filter @sexyvoice/docs dev. - Regenerate the external API reference with
pnpm --filter @sexyvoice/docs generate-openapi-docsafter changing the/api/v1/*request/response schemas.
Generate waveform videos for audio files using seewav:
pip3 install seewav
seewav your_audio.mp3 --color '0.8,0.0,0.4'# Convert WAV to MP3 with specific audio settings
# -i input.wav: Input file
# -acodec libmp3lame: Use LAME MP3 encoder
# -q:a 2: Variable bit rate quality (0=highest, 9=lowest)
# -ar 24000: Set audio sample rate to 24kHz
# -ac 1: Set audio channels to mono (1 channel)
# output.mp3: Output file
ffmpeg -i input.wav -acodec libmp3lame -q:a 2 -ar 24000 -ac 1 output.mp3
# For high quality MP3
ffmpeg -i input.wav -acodec libmp3lame -q:a 0 -ar 44100 -ac 2 output-high-quality.mp3
# For lowest quality MP3 possible
ffmpeg -i input.wav -acodec libmp3lame -q:a 9 -ar 8000 -ac 1 output-lowest.mp3SexyVoice.ai implements multiple security layers:
- Authentication: Secure OAuth integration with Supabase Auth
- Data Protection: Row-level security (RLS) policies in PostgreSQL
- API Security: Rate limiting and request validation
- File Security: Secure R2 storage with access controls
- Error Handling: Comprehensive error tracking with Sentry
- Environment Isolation: Separate configurations for development and production
We welcome contributions!
- Report bugs
- Suggest features
- Submit pull requests
- Review Deployment and release checks when changing environment variables, infrastructure, or deployment configuration
Zed with Cspell extension
npm install -g cspell @cspell/dict-de-de @cspell/dict-es-es
asdf reshim nodejs
cspell link add @cspell/dict-de-de
cspell link add @cspell/dict-es-es
# restart Zed language serverThis project is licensed under the MIT License.
- Website: sexyvoice.ai
- Roadmap: Feature requests and roadmap
- Documentation: API Documentation NEW
- Support: Contact support or via Chat on the Dashboard
SexyVoice.ai is actively developed and maintained. Check the roadmap for upcoming features and improvements.
- β Core voice generation functionality
- β Voice cloning with custom audio samples
- β User authentication and profiles
- β Credit system and payment processing
- β
Website multi-language support (EN/ES/DE/DA/IT/FR) via
next-intl - β Audio transcription and translation tool
- β Real-time AI voice calls with configurable AI agents
- β API access
The public catalog has 63 voices: 57 text-to-speech voices and 6 voices for AI
voice calls. Public voices live in the voices table, and GET /api/v1/voices
returns the text-to-speech subset.
| Family | Model alias | Feature | Public voices | Languages |
|---|---|---|---|---|
| Gemini 3.8 Flash TTS | gpro38 |
tts |
28 | Multilingual, plus es-ES and es-MX |
| Gemini 3.1 Flash TTS | gpro31 |
tts |
11 | Multilingual (70+ languages) |
| Gemini 2.5 Pro TTS | gpro |
tts |
11 | Multilingual (24 languages) |
| xAI Grok | xai |
tts |
7 | Multilingual with automatic detection |
| xAI Grok | xai |
call |
6 | Multilingual |
The same eleven Gemini voice identities exist under each Gemini model alias, so
one name maps to three catalog rows. Select by voiceId, or pass the model
alias together with the voice name.
| Voice | Description |
|---|---|
achernar |
Soft |
aoede |
Breezy |
autonoe |
Bright |
callirrhoe |
Easy-going |
despina |
Smooth |
erinome |
Clear |
gacrux |
Mature |
kore |
Firm |
puck |
Upbeat |
sulafat |
Warm |
zephyr |
Bright |
Gemini 2.5 Pro (gpro) voices support style prompting and the following
language/locale set:
| Language | BCP-47 Code | Language | BCP-47 Code |
|---|---|---|---|
| Arabic (Egyptian) | ar-EG |
German (Germany) | de-DE |
| English (US) | en-US |
Spanish (US) | es-US |
| French (France) | fr-FR |
Hindi (India) | hi-IN |
| Indonesian (Indonesia) | id-ID |
Italian (Italy) | it-IT |
| Japanese (Japan) | ja-JP |
Korean (Korea) | ko-KR |
| Portuguese (Brazil) | pt-BR |
Russian (Russia) | ru-RU |
| Dutch (Netherlands) | nl-NL |
Polish (Poland) | pl-PL |
| Thai (Thailand) | th-TH |
Turkish (Turkey) | tr-TR |
| Vietnamese (Vietnam) | vi-VN |
Romanian (Romania) | ro-RO |
| Ukrainian (Ukraine) | uk-UA |
Bengali (Bangladesh) | bn-BD |
| English (India) | en-IN & hi-IN bundle |
Marathi (India) | mr-IN |
| Tamil (India) | ta-IN |
Telugu (India) | te-IN |
Use gpro31 only with voices returned by /api/v1/voices as model: "gpro31".
Voices returned as gpro stay on Gemini 2.5 Pro.
Supports all 24 languages above, plus (non-exhaustive):
Afrikaans (af-ZA), Albanian (sq-AL), Amharic (am-ET), Armenian (hy-AM),
Azerbaijani (az-AZ), Basque (eu-ES), Bulgarian (bg-BG), Catalan (ca-ES),
Chinese Simplified (zh-CN), Chinese Traditional (zh-TW), Croatian (hr-HR),
Czech (cs-CZ), Danish (da-DK), Estonian (et-EE), Filipino/Tagalog (fil-PH),
Finnish (fi-FI), Galician (gl-ES), Georgian (ka-GE), Greek (el-GR),
Gujarati (gu-IN), Hebrew (he-IL), Hungarian (hu-HU), Icelandic (is-IS),
Irish (ga-IE), Javanese (jv-ID), Kannada (kn-IN), Kazakh (kk-KZ),
Latvian (lv-LV), Lithuanian (lt-LT), Macedonian (mk-MK), Malay (ms-MY),
Maltese (mt-MT), Norwegian BokmΓ₯l (nb-NO), Persian (fa-IR), Punjabi (pa-IN),
Serbian (sr-RS), Slovak (sk-SK), Slovenian (sl-SI), Swahili (sw-KE),
Swedish (sv-SE), Urdu (ur-PK), Uzbek (uz-UZ), Welsh (cy-GB), Zulu (zu-ZA).
Plus English, Spanish, French, Portuguese, and Arabic regional variants.
Full list: https://cloud.google.com/text-to-speech/docs/gemini-tts#language_availability
Gemini 3.1 also supports 200+ inline audio expression tags ([cheerfully], [whispering], [pause], etc.).
Use gpro38 only with voices returned by /api/v1/voices as
model: "gpro38". Gemini 3.8 rows cover the eleven multilingual identities
above plus 17 Spanish role voices. Each Spanish voice description records its
role, accent, and pitch.
Castilian Spanish (es-ES):
| Voice | Role | Type | Pitch |
|---|---|---|---|
es-es-advisor-8 |
Authoritative Advisor | Female | Low |
es-es-assistant-3 |
Digital Assistant | Male | Low |
es-es-commercial-7 |
Commercial Voiceover | Female | Medium |
es-es-concierge-3 |
Concierge | Female | Medium |
es-es-csagent-6 |
Call Center Agent | Female | Low |
es-es-podcaster-7 |
Podcaster | Male | Low |
es-es-techagent-5 |
Tech Advisor | Female | Medium |
es-es-training-12 |
Training Voiceover | Female | High |
es-es-tutor-12 |
Tutor | Female | Medium |
Mexican Spanish (es-MX, provider locale es-419):
| Voice | Role | Type | Pitch |
|---|---|---|---|
es-419-advisor-4 |
Authoritative Advisor | Female | High |
es-419-assistant-9 |
Digital Assistant | Male | Medium |
es-419-commercial-1 |
Commercial Voiceover | Male | Low |
es-419-concierge-5 |
Concierge | Female | High |
es-419-csagent-8 |
Call Center Agent | Neutral | Medium |
es-419-podcaster-1 |
Podcaster | Male | Low |
es-419-training-8 |
Training Voiceover | Female | Medium |
es-419-tutor-3 |
Tutor | Female | Low |
Grok text-to-speech voices:
| Voice | Description |
|---|---|
ara |
Warm and friendly |
carina |
Breathy and enthusiastic |
eve |
Engaging and upbeat |
leo |
Authoritative and strong |
rex |
Confident and clear |
sal |
Versatile voice |
zagan |
Powerful, dramatic, and unmistakable |
AI voice calls use the Grok call voices Ara, Carina, Eve, Leo, Rex,
and Sal.
Custom characters can use owned saved Inworld or Mistral voices.
CALL_CLONE_PROVIDER=inworld selects the provider for new call clones; set it
to mistral to create Mistral profiles. Existing profiles retain their provider.
Set INWORLD_API_KEY to the Basic credential exactly as Inworld shows it
(already Base64; do not encode it again), with clone/write access
and give the SexyCall agent access to the same Inworld workspace. Mistral
profiles require MISTRAL_API_KEY in the web app and agent. An unset
CALL_CLONE_PROVIDER selects Inworld as soon as this web deployment is released.
Deploy the agent's inworld-tts support and configure INWORLD_API_KEY in both
deployments first. To defer the switch, explicitly set CALL_CLONE_PROVIDER=mistral
in Vercel before releasing the web app; set it to inworld and redeploy once
the agent and credentials are ready.
See saved call voices and
deployment setup.
These voices support expressive inline tags like [laugh] and wrapping tags like <fast>...</fast>, plus automatic language detection and the following language/locale options:
| Language / Locale | Code | Language / Locale | Code |
|---|---|---|---|
| English | en |
Japanese | ja |
| Arabic (Egypt) | ar-EG |
Korean | ko |
| Arabic (Saudi Arabia) | ar-SA |
Portuguese (Brazil) | pt-BR |
| Arabic (United Arab Emirates) | ar-AE |
Portuguese (Portugal) | pt-PT |
| Bengali | bn |
Russian | ru |
| Chinese (Simplified) | zh |
Spanish (Spain) | es-ES |
| French | fr |
Spanish (Mexico) | es-MX |
| German | de |
Turkish | tr |
| Hindi | hi |
Vietnamese | vi |
| Indonesian | id |
Italian | it |
Made with β€οΈ by Gianfranco