Python'da TTS API Anahtarı: Kurulum, Akış, JSON Modu
Bu site arkasındaki API için bir Python rehberi: anahtarı saklayın, bir istemci oluşturun, yanıtı akış olarak alın, JSON çıktısını zorlayın ve hız limitlerini yönetin. Öncelikle bir uyarı: Bu API ses değil, metin üretir.
güncellendi

Temel noktalar
- Uç nokta OpenAI uyumludur, bu nedenle openai Python paketi base_url https://api.ttsapihub.com/v1 olarak ayarlandığında çalışır.
- Anahtarı kaynak kodunda değil, bir ortam değişkeninde tutun.
- Akış, JSON modu ve fonksiyon çağırma desteklenir; ses çıkışı desteklenmez.
- HTTP 429 durumunu kısa bir beklemeyle yönetin ve harcamaları takip etmek için X-Balance-USD'yi okuyun.
Anahtarın neyi açtığını kontrol edin
Bir tts api key python örneği arayanlar genellikle metni konuşulan sese dönüştürmek ister. Bu hizmetin anahtarı bunu yapmaz. Metin LLM'sine istekleri doğrular: POST /v1/chat/completions ve GET /v1/models, uncensored modelini kullanarak. Konuşma sentezi, ses yükleme ve gömme yoktur.
Bu, örneğin ayrı bir konuşma aracına ilettiğiniz senaryolar, diyalog veya anlatım oluşturuyorsanız projenize uyuyorsa, bu sayfanın geri kalanı size çalışan Python kodu verir. API'den doğrudan ses çıktısı almanız gerekiyorsa, bu yanlış hizmettir ve bunu şimdi bilmek daha iyidir. dokümantasyon kesin özellik setini listeler.
Bir ses projesinde metin üretimi kullanmanın pratik bir yolu, onu yazım aşaması olarak görmektir. Model anlatı taslağı oluşturur, bir zaman sınırına uyması için bir satırı yeniden yazar veya notları birden fazla konuşmacılı diyaloga dönüştürür. Python kodunuz son metni kullandığınız konuşma aracına iletir. Aşamaları ayrı tutmak, bunlardan birini diğerine dokunmadan değiştirmenizi sağlar ve yalnızca yazdığı kelimeler için bu API'ye ödeme yaparsınız.
İzleyebilmek için Python 3.9 veya daha yeni bir sürüm ve bir anahtara ihtiyacınız vardır. API anahtarı sayfası üzerinde kaydolun ve tek tıkla $0.50 deneme kredisi talep edin; 7 gün geçerlidir ve kart gerektirmez.
Anahtarı saklayın ve paketi yükleyin
Anahtarı commit edeceğiniz dosyaya yazmayın. Onu bir ortam değişkenine koyun ve çalışma zamanında okuyun.
# base URL used below: https://api.ttsapihub.com/v1 , model: uncensored
pip install openai
export API_KEY="paste-your-key-here"Windows PowerShell'de eşdeğeri $env:API_KEY = "paste-your-key-here" şeklindedir. Bir proje için, python-dotenv gibi bir paketle yüklenen bir .env dosyası yaygın bir kalıptır, eğer .env dosyanızın .gitignore dosyasında olması şartıyla.
Bir anahtar bir depoya sızarsa, onu tüketilmiş olarak kabul edin: Mümkünse geçmişten kaldırın ve yeni bir tane isteyin. Anahtarların ön ödemeli krediyi harcadığını unutmayın; sızan bir anahtar aynı zamanda bir finansal sızıntıdır.
İstemciyi oluşturun ve ilk çağrıyı yapın
Resmi paket bir base_url kabul eder. Geri kalanı, tipik OpenAI çağrı yapısıdır.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.ttsapihub.com/v1",
api_key=os.environ["API_KEY"],
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You write short narration scripts."},
{"role": "user", "content": "Draft a 40-word intro for a podcast about night trains."},
],
temperature=0.8,
max_tokens=200,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)usage nesnesi, çağrının kaç token kullandığını gösterir, böylece maliyeti hesaplayabilirsiniz: giriş token'ları için milyon başına $0.15, artı çıktı token'ları için milyon başına $0.50. Yukarıdaki çağrı 60 giriş token'ı ve 80 çıktı token'ı kullandıysa, maliyet $0.000009 artı $0.00004, yani $0.000049'dur. Başarısız veya reddedilen istekler için ücret alınmaz.
max_tokens isteğe bağlıdır. Bu olmadan tamamlama, 100.000 token'lık pencerede kalanı kullanabilir, bu nedenle uzunluk ve maliyet için bir üst sınır koymak istediğinizde bunu ayarlayın.
Yanıtı akış olarak al
Akış, tokenlar oluşturuldukça sunucu tarafından gönderilen olaylar (SSE) kullanılarak tokenları döndürür. stream=True ayarlayın ve yineleyin.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.ttsapihub.com/v1", api_key=os.environ["API_KEY"])
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Describe a rainy station platform in four sentences."}],
stream=True,
)
parts = []
for chunk in stream:
if not chunk.choices:
continue
delta = chunk.choices[0].delta.content or ""
parts.append(delta)
print(delta, end="", flush=True)
text = "".join(parts)Boş bir choices listesi için güvenlik kontrolü, akışın son olayının kullanım verisi taşıyabileceği ve metin olmaması içindir. Bunu atlamak bir indeks hatasından kaçınır. Bir iş detayı: akışlı bir istek, akış bitene kadar eşzamanlılık slotunu tutar. Eğer birçok akışı iş parçacıklarında başlatır ve okumayı asla tamamlamazsanız, istek hızınız düşük olsa bile eşzamanlılık sınırına takılırsınız.
JSON isteyin ve araçları çağırın
JSON modu
Yanıtın ayrıştırılabilir olması için response_format'i bir JSON nesnesine ayarlayın. Ayrıca modele istemde JSON istediğinizi söyleyin; ayar formatı kısıtlar, istem ise şekli belirtir.
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://api.ttsapihub.com/v1", api_key=os.environ["API_KEY"])
resp = client.chat.completions.create(
model="uncensored",
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": "Reply only with JSON: {\"title\": str, \"beats\": [str]}"},
{"role": "user", "content": "Outline a three-beat radio drama about a lost key."},
],
)
data = json.loads(resp.choices[0].message.content)
print(data["title"], len(data["beats"]))Yine de json.loads'i bir try bloğu içine alın. max_tokens sınırına takılan bir yanıt, bir nesnenin ortasında kesilebilir.
Araç çağırma
tools ve isteğe bağlı olarak tool_choice geçirin. Model bir araç istediğinde, onu kendiniz çalıştırın ve sonucu role: "tool" ile bir mesaj olarak geri gönderin.
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://api.ttsapihub.com/v1", api_key=os.environ["API_KEY"])
tools = [{
"type": "function",
"function": {
"name": "word_count",
"description": "Count the words in a text",
"parameters": {
"type": "object",
"properties": {"text": {"type": "string"}},
"required": ["text"],
},
},
}]
messages = [{"role": "user", "content": "How many words are in: the quick brown fox?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
msg = first.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
args = json.loads(call.function.arguments)
result = len(args["text"].split())
messages.append(msg)
messages.append({"role": "tool", "tool_call_id": call.id, "content": str(result)})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)Bir konuşma sürdürün ve token bütçesine dikkat edin
API durum bilgisi tutmaz. Ne söylendiğini hatırlayan bir sohbet istiyorsanız, mesaj listesini programınızda tutun ve her çağrıda tamamını gönderin. Küçük bir sınıf bu işi görür ve ayrıca maliyetin artmasını engellemek için geçmişi sınırlamak için doğru yerdir.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.ttsapihub.com/v1", api_key=os.environ["API_KEY"])
history = [{"role": "system", "content": "You are a dialogue writer. Keep replies under 120 words."}]
def say(user_text, keep_last=12):
history.append({"role": "user", "content": user_text})
# keep the system message plus the most recent turns
trimmed = [history[0]] + history[1:][-keep_last:]
resp = client.chat.completions.create(model="uncensored", messages=trimmed, max_tokens=250)
reply = resp.choices[0].message.content
history.append({"role": "assistant", "content": reply})
return reply, resp.usage.total_tokens
print(say("Open a scene in a ticket office at closing time.")[0])Para için öneme sahip olan temizleme, pencere için olduğundan daha önemlidir. Model toplamda 100.000 tokena kadar kabul eder, ancak her adımda geçmişin 30.000 tokenı yeniden gönderiliyorsa, her çağrı yalnızca giriş için $0.0045 maliyetinde olur (30.000 x milyon başına $0.15). Böyle elli adım, tek bir çıktı tokenı sayılmadan önce $0.225'e ulaşır. Son on iki adımı tutmak veya daha eskilerini kısa bir nota özetlemek genellikle kaliteyi korur ve faturayı keskin bir şekilde düşürür.
Eşzamanlılık, tasarlanacak diğer şeydir. Programınız aynı anda birkaç kullanıcıya hizmet ediyorsa, anahtarınızın limitine (tam anahtar için 8, deneme anahtarı için 2) göre boyutlandırılmış bir semafor, concurrency hatasını tetiklemenizi engeller. Limitin üzerindeki çağrılar başarısız olmak yerine kendi kuyruğunuzda bekler, bu da 429'da yeniden denemeden daha dostça bir yaklaşımdır.
Testler de söz konusu. Sabit bir seed, düşük bir sıcaklık ve kısa bir max_tokens ile API'yi çağıran küçük bir betik yazın ve istemleri veya ayarları değiştirdiğinizde bunu çalıştırın. Bir seed ve düşük sıcaklık, çıktıyı daha tekrarlanabilir hale getirir; bu da gürültü olmadan iki istem sürümünü karşılaştırmanızı sağlar. Bu kontrolleri küçük tutun; sentin çok küçük bir kesrine mal olan bir test, faturayı kimse fark etmeden her commit'te çalışabilir.
Son olarak, her yanıtın istek kimliğini (request ID) günlüğe kaydedin. Bir çağrı garip davrandığında, bu ID destek ekibine tam isteği göstermenin en hızlı yoludur.
Limitleri, hataları ve bakiyeyi yönetin
Tam bir anahtar 8 eşzamanlı istek ve dakika başına 300 istek izni verir. Deneme anahtarı 2 ve 60 izni verir. İlkini aşmak, concurrency hata koduyla HTTP 429 döndürür; ikincisini aşmak, rate_limited ile 429 döndürür. Geçici aşırı yüklenme de Retry-After: 5 başlığıyla 429 döndürür.
OpenAI paketi bazı hataları kendi başına yeniden dener ve bunu max_retries ile artırabilirsiniz. Bir toplu iş için, paralel iş için kendi üst sınırınızı da ekleyin; böylece yeniden denemelere güvenmek yerine eşzamanlılık limitinin altında kalın.
import os
from openai import OpenAI, RateLimitError
client = OpenAI(base_url="https://api.ttsapihub.com/v1", api_key=os.environ["API_KEY"], max_retries=3)
raw = client.chat.completions.with_raw_response.create(
model="uncensored",
messages=[{"role": "user", "content": "One sentence about trains."}],
max_tokens=60,
)
print("balance:", raw.headers.get("X-Balance-USD"))
print("request id:", raw.headers.get("X-Request-Id"))
print(raw.parse().choices[0].message.content)Yanıt başlıkları X-Request-Id ve X-Balance-USD günlüklerde kullanışlıdır. Destekle iletişime geçtiğinizde istek kimliğini alıntılayın. Maliyetler fiyatlandırma sayfasında listelenir: 1M giriş token'ı başına $0.15 ve 1M çıktı token'ı başına $0.50, $20 ile $500 arasında bakiye yüklemeler ve $50, $100 ve $200'de %5, %10 ve %15 bonuslar. Kart (Visa, Mastercard, Apple Pay, Google Pay) ve kripto (TRC20 üzerinde USDT, Base üzerinde USDC) kabul edilir. İstemler eğitim için kullanılmaz. Model yasal yetişkin kullanımı içindir ve reşit olmayanlar içeren cinsel içerik asla izin verilmez.
Daha fazla kılavuz
Sorular ve cevaplar
Bu API anahtarı Python'da metinden sese dönüşüm için çalışır mı?
Hayır. Anahtar, ses çıkışı olmayan bir metin LLM API'sini doğrular. Metin oluşturmak için kullanın, ardından bu metni bir konuşma aracına aktarın.
Hangi Python paketini kullanmalıyım?
Resmi openai paketi. base_url'yi https://api.ttsapihub.com/v1 olarak ayarlayın ve modeli uncensored olarak belirleyin.
Anahtarı kodumdan nasıl uzak tutarım?
API_KEY gibi bir ortam değişkeninden okuyun ve .env dosyasını sürüm kontrolünden çıkarın.
Bir çağrının ne kadar maliyetli olduğunu nasıl görebilirim?
Token sayıları için resp.usage'ı ve kalan bakiye için X-Balance-USD yanıt başlığını okuyun.
Hız limitine (rate limit) ulaştığımda ne olur?
API, rate_limited veya concurrency hata koduyla HTTP 429 döndürür. Birkaç saniye bekleyip yeniden deneyin; başarısız istek için ücret alınmaz.
Anahtarınız tek bir formun uzağında
Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulum bu kadar basit.