Akıllı Önbellekleme Stratejileriyle TTS Maliyetlerini Azaltma
Speeko zaten rakiplerden %90 daha ucuz. Önbellekleme ekleyin, maliyetleri bir %80 daha azaltırsınız.
Önbellekleme Durumu
Çoğu TTS isteği tekrardır. Yaygın ifadeler (karşılama mesajları, hata bildirimleri, kategori duyuruları) binlerce kez üretilir. Bir kez üretin, sonsuza kadar sunun.
Cache Key Tasarımı
Çıktıyı etkileyen giriş parametrelerini hash'leyin:
const crypto = require('crypto');
function cacheKey(text, voice, format, speed) {
const input = JSON.stringify({ text, voice, format, speed });
return crypto.createHash('sha256').update(input).digest('hex');
}Farklı girdiler → farklı anahtarlar. Aynı girdiler → aynı anahtar → cache hit.
Cache Katmanları
L1: Uygulama belleği (LRU)
const LRU = require('lru-cache');
const cache = new LRU({ max: 1000, ttl: 1000 * 60 * 60 });Nanosaniye erişim. Küçük kapasite. Yeniden başlatmada kaybolur.
L2: Redis
const redis = require('redis');
const client = redis.createClient();
async function getAudio(key) {
const cached = await client.get(key);
if (cached) return Buffer.from(cached, 'base64');
return null;
}Milisaniye erişim. Ağa bağlı. Instance'lar arasında paylaşılır.
L3: Object storage + CDN
Üretilen sesi S3/R2/GCS'te saklayın, CloudFront/Cloudflare üzerinden sunun. Küresel dağıtımlı, ucuz, dayanıklı.
Tam Akış
async function generateOrFetch(text, voice) {
const key = cacheKey(text, voice);
if (memCache.has(key)) return memCache.get(key);
const redisHit = await redis.get(key);
if (redisHit) {
memCache.set(key, redisHit);
return redisHit;
}
const s3Url = `https://cdn.ornek.com/tts/${key}.mp3`;
if (await s3Exists(s3Url)) {
const audio = await fetch(s3Url).then(r => r.buffer());
await redis.set(key, audio, 'EX', 3600);
return audio;
}
const audio = await speeko.tts(text, voice);
await s3Upload(s3Url, audio);
await redis.set(key, audio, 'EX', 3600);
memCache.set(key, audio);
return audio;
}Cache Geçersiz Kılma
Ne zaman geçersiz kılmalı?
- Ses modeli yükseltmeleri (nadir, Speeko tarafından duyurulur)
- Marka sesi değişikliği (kasıtlı)
- Kaynak metindeki içerik hataları
Aksi halde: sonsuza kadar önbelleğe alın.
Maliyet Örneği
Günde 10.000 çağrı, çağrı başına 5 karşılama, her biri 100 karakter olan IVR:
- Önbelleksiz: Günde 50M karakter × $0.03/1K = $1.500/gün
- Önbellekli: Bir kerelik 500 karakter = $0.015
Aylık tasarruf: $45.000.
Anti-Desenler
- Ses/format içermeyen anahtarları önbelleğe almak (yanlış ses sunar)
- Sınırsız cache (bellek tükenmesi)
- Tek seferlik kullanıcı girdilerini önbelleğe almak (cache kirlenmesi)