Konuşma Sentezi API'si: Uygulamanıza Doğal Konuşma Ekleyin
Bir konuşma sentezi API'si, yazılı metni doğal sesli sese dönüştüren altyapıdır. Metni HTTP üzerinden gönderirsiniz ve bir ses dosyası geri alırsınız — ancak bu dönüşümün kalitesi, hızı ve esnekliği sağlayıcılar arasında çok değişir.
İşte konuşma sentezi API'lerinin gerçekte ne yaptığı, birini seçerken nelerin önemli olduğu ve nasıl entegre edileceği.
Konuşma Sentezi Nasıl Çalışır?
Geleneksel metin okuma, önceden kaydedilmiş fonemleri bir araya getirerek birleştirmeli sentez kullanırdı. Sonuç robotik ve doğal olmayan bir sesti.
Modern API'ler, sinirsel konuşma sentezi kullanır ve derin öğrenme mimarileri üzerine kuruludur:
- Metin ön işleme — kısaltmaları, sayıları, URL'leri, özel karakterleri normalleştirir
- Dilsel analiz — kelime sınırlarını, konuşma bölümlerini, cümle yapısını belirler
- Prozodi tahmini — dilsel özellikleri zamanlama, perde ve vurgu ile eşler
- Dalga formu üretimi — akustik özelliklerden ham ses sentezler
Sonuç: bir makinenin okuması gibi değil, bir insanın konuşması gibi ses çıkaran sestir.
Değerlendirilecek Temel Özellikler
Ses Kalitesi
İyi ve kötü sinirsel TTS arasındaki fark duyulabilir. Kalite en çok şunlar için önemlidir:
- Uzun biçimli içerik (sesli kitaplar, podcast'ler), yorgunluğun robotik seslerle başladığı yerler
- Sesin markanızı temsil ettiği müşteriye yönelik uygulamalar
- Netliğin anlaşılırlığı etkilediği eğitim içeriği
Bir sağlayıcıya taahhütte bulunmadan önce örnekleri dinleyin.
Gecikme
İki tür gecikme önemlidir:
- İlk bayt gecikmesi — sesin gelmeye ne kadar çabuk başladığı (gerçek zamanlı/akış kullanımı için kritik)
- Toplam üretim süresi — tam dosyanın hazır olana kadar ne kadar sürdüğü (toplu işler için önemlidir)
Etkileşimli uygulamalar (sesli aracılar, gerçek zamanlı geri bildirim) için, 300 ms'nin altındaki ilk bayt gecikmesini hedefleyin. Toplu işler için toplam süre daha önemlidir.
Ses Seçimi
Daha fazla ses her zaman daha iyi değildir. Önemli olan:
- Hedef dilleriniz için sesler var mı?
- Hem erkek hem de kadın seçenekleri var mı?
- Ses stilleri kullanım durumunuzla eşleşiyor mu (nötr, konuşkan, otoriter)?
SSML Desteği
SSML (Konuşma Sentezi İşaretleme Dili), telaffuzu hassas bir şekilde kontrol etmenizi sağlar:
<speak>
Lütfen
<say-as interpret-as="cardinal">4</say-as> haneli PIN'inizi girin,
ardından
<emphasis level="strong">kare tuşuna</emphasis> basın.
<break time="1s"/>
Kalan süreniz
<say-as interpret-as="time" format="hms12">2:30pm</say-as>.
</speak>SSML olmadan, modelin metninizi yorumlamasına takılıp kalırsınız.
Çıktı Formatı Esnekliği
| Format | En İyi Kullanım | Ödünleşim |
|---|---|---|
| MP3 | Web oynatma, podcast'ler | Kayıplı sıkıştırma |
| WAV | Ses düzenleme, oyun geliştirme | Büyük dosyalar |
| OGG | Daha küçük boyutlu web | Daha az uyumlu |
| PCM akışı | Gerçek zamanlı oynatma | Ham, kapsayıcı yok |
Konuşma Sentezi API Entegrasyonu
Temel İstek (curl)
curl -X POST https://api.speekoapp.com/v1/tts \
-H "X-API-Key: $SPEEKO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Siparişiniz kargoya verildi ve Cuma gününe kadar ulaşacak.",
"voice": "en-US-1",
"format": "mp3",
"speed": 1.0
}' \
--output notification.mp3Python: FastAPI'den Üret ve Döndür
from fastapi import FastAPI, Response
import requests
import os
app = FastAPI()
@app.post("/speak")
async def speak(text: str, voice: str = "en-US-1"):
resp = requests.post(
"https://api.speekoapp.com/v1/tts",
headers={"X-API-Key": os.environ["SPEEKO_API_KEY"]},
json={"text": text, "voice": voice, "format": "mp3"},
)
resp.raise_for_status()
return Response(content=resp.content, media_type="audio/mpeg")Node.js: Sesi Tarayıcıya Akıt
import express from 'express';
const app = express();
app.get('/speak', async (req, res) => {
const { text, voice = 'en-US-1' } = req.query;
const ttsResponse = await fetch('https://api.speekoapp.com/v1/tts', {
method: 'POST',
headers: {
'X-API-Key': process.env.SPEEKO_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ text, voice, format: 'mp3' }),
});
if (!ttsResponse.ok) {
return res.status(ttsResponse.status).json({ error: 'TTS başarısız oldu' });
}
res.set('Content-Type', 'audio/mpeg');
ttsResponse.body.pipeTo(
new WritableStream({
write(chunk) { res.write(chunk); },
close() { res.end(); },
})
);
});Sağlayıcı Karşılaştırması
| Sağlayıcı | Kalite | SSML | Diller | 1K karakter başına fiyat |
|---|---|---|---|---|
| Speeko | Mükemmel | ✓ | 30+ | 0,03$ |
| Google Neural2 | Mükemmel | ✓ Tam | 50+ | 0,016$ |
| AWS Polly Sinirsel | Çok İyi | ✓ Tam | 30+ | 0,016$ |
| Azure Sinirsel TTS | Mükemmel | ✓ Tam | 100+ | 0,016$ |
| OpenAI TTS | Çok İyi | ✗ | 57 | 0,015$ |
| ElevenLabs | En İyi | Kısmi | 30+ | ~0,06$ |
Uç Durumları Yönetme
Sayılar ve tarihler: API'nin "10/05/25"i doğru yorumlayacağına güvenmeyin — farklı formatlarda bir tarih, kesir veya tek tek rakamlar olarak okuyabilir. SSML <say-as> kullanın veya açıkça yazın.
Kısaltmalar: "Dr." bağlama göre "drive" veya "doktor" olarak okunur. Bağlam önemliyse, genişletin: "Doktor Smith".
İngilizce metinde yabancı kelimeler: Çoğu API yaygın yabancı kelimeleri yönetir, ancak marka adları veya teknik terimler fonem ipuçlarına ihtiyaç duyabilir:
<phoneme alphabet="ipa" ph="ˈfɪɡmə">Figma</phoneme>Uzun metin: Göndermeden önce cümle sınırlarında bölün. Çoğu API, istek başına 3.000–10.000 karakterle sınırlar.
Sentezlenmiş Sesi Önbelleğe Alma
Statik içerik için — ürün açıklamaları, kurs anlatımı, uygulama mesajları — her istekte yeniden üretmek yerine sentezlenmiş sesi önbelleğe alın. İçerik değişmez, bu nedenle ses de değişmemelidir.
İçerik özeti kullanarak basit dosya önbelleği:
import hashlib
import os
from pathlib import Path
CACHE_DIR = Path(".tts_cache")
CACHE_DIR.mkdir(exist_ok=True)
def synthesize_cached(text: str, voice: str = "am_michael") -> bytes:
cache_key = hashlib.sha256(f"{voice}:{text}".encode()).hexdigest()
cache_path = CACHE_DIR / f"{cache_key}.mp3"
if cache_path.exists():
return cache_path.read_bytes() # Önbellek isabeti — API çağrısı yok
response = requests.post(
"https://api.speekoapp.com/v1/tts",
headers={"Authorization": f"Bearer {os.environ['SPEEKO_API_KEY']}"},
json={"text": text, "voice": voice, "format": "mp3"},
)
response.raise_for_status()
cache_path.write_bytes(response.content)
return response.contentMetin değiştiğinde, özet değişir ve otomatik olarak yeni bir dosya üretilir. Eski önbellek dosyaları, değiştirilme zamanına göre temizlenebilir:
# 30 günden eski önbelleğe alınmış dosyaları sil
find .tts_cache -name "*.mp3" -mtime +30 -deleteÜretim dağıtımları için, dosya önbelleğini Redis veya CDN destekli bir önbellekle değiştirin.
Başlarken
speekoapp.com/register adresinden kaydolun — 5$ ücretsiz kredi, kredi kartı gerekmez. İlk ses sentezi isteğinizin kurulumu bir dakikadan az sürer.
Uzun biçimli içerik üretimi için, bkz. Blogdan Podcast'e Otomasyon. SSML için, bkz. SSML Gelişmiş Kılavuzu.