ID ▾
API Teks Tanpa Sensor untuk Pipelines TTShttps://api.ttsapihub.com/v1

Kunci API TTS di Python: Setup, Streaming, Mode JSON

Ini adalah panduan Python untuk API di balik situs ini: simpan kunci, buat klien, stream balasan, paksa output JSON, dan tangani batas laju. Satu catatan: ini menghasilkan teks, bukan audio.

Diperbarui

Kunci bersinar di atas terminal dengan aliran data, mengilustrasikan penggunaan kunci API dari Python

Poin utama

  • Endpoint ini kompatibel dengan OpenAI, sehingga paket Python openai bekerja dengan base_url diatur ke https://api.ttsapihub.com/v1.
  • Simpan kunci di variabel lingkungan, jangan di kode sumber.
  • Streaming, mode JSON, dan pemanggilan fungsi didukung; output audio tidak didukung.
  • Tangani HTTP 429 dengan jeda singkat, dan baca X-Balance-USD untuk melacak pengeluaran.

Periksa apa yang dibuka oleh kunci

Orang yang mencari contoh kunci api tts python biasanya ingin mengubah teks menjadi audio ucapan. Kunci dari layanan ini tidak melakukan itu. Ini mengautentikasi permintaan ke LLM teks: POST /v1/chat/completions dan GET /v1/models, menggunakan model uncensored. Tidak ada sintesis suara, tidak ada unggahan audio, dan tidak ada embedding.

Jika itu sesuai dengan proyek Anda, misalnya karena Anda membuat skrip, dialog, atau narasi yang diteruskan ke alat suara terpisah, sisa halaman ini memberikan kode Python yang siap pakai. Jika Anda memerlukan output audio langsung dari API, ini bukan layanan yang tepat, dan lebih baik mengetahuinya sekarang. dokumentasi mencantumkan fitur yang tepat.

Cara praktis untuk menggunakan generasi teks dalam proyek audio adalah menganggapnya sebagai tahap penulisan. Model membuat draf narasi, menulis ulang baris agar sesuai dengan batas waktu, atau mengubah catatan menjadi dialog dengan beberapa pembicara. Kode Python Anda kemudian menyerahkan teks akhir ke alat sintesis suara yang Anda gunakan. Memisahkan tahap-tahap ini juga berarti Anda dapat mengganti salah satunya tanpa menyentuh yang lain, dan Anda hanya membayar API ini untuk kata-kata yang ditulisnya.

Untuk mengikuti langkah-langkahnya, Anda memerlukan Python 3.9 atau yang lebih baru dan sebuah kunci. Daftar di halaman kunci API dan klaim kredit uji coba seharga $0,50 dengan satu klik; kredit ini berlaku selama 7 hari dan tidak memerlukan kartu.

Simpan kunci dan instal paket

Jangan menulis kunci ke dalam file yang Anda unggah ke repositori. Letakkan di variabel lingkungan dan baca saat runtime.

# base URL used below: https://api.ttsapihub.com/v1 , model: uncensored
pip install openai
export API_KEY="paste-your-key-here"

Di Windows PowerShell, yang setara adalah $env:API_KEY = "paste-your-key-here". Untuk proyek, file .env yang dimuat dengan paket seperti python-dotenv adalah pola umum, selama .env ada di .gitignore Anda.

Jika kunci bocor ke dalam repositori, anggap kunci tersebut telah dibakar: hapus dari riwayat jika memungkinkan, dan minta kunci baru. Ingat bahwa kunci menghabiskan saldo prabayar, sehingga kunci yang bocor juga merupakan kebocoran keuangan.

Buat klien dan buat panggilan pertama

Paket resmi menerima base_url. Selain itu, bentuk panggilan OpenAI adalah seperti biasa.

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)

Objek usage menunjukkan berapa banyak token yang digunakan oleh panggilan, sehingga Anda dapat menghitung biaya: token input dikalikan $0.15 per juta, ditambah token output dikalikan $0.50 per juta. Jika panggilan di atas menggunakan 60 token input dan 80 token output, biayanya adalah $0.000009 ditambah $0.00004, yang totalnya $0.000049. Permintaan yang gagal atau ditolak tidak dikenakan biaya.

max_tokens bersifat opsional. Tanpa itu, completion dapat menggunakan sisa dari jendela 100.000 token, sehingga atur nilai ini ketika Anda ingin batas keras pada panjang dan biaya.

Alirkan balasan

Streaming mengembalikan token saat token tersebut dihasilkan menggunakan server-sent events. Atur stream=True dan iterasi.

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)

Penjagaan untuk daftar choices kosong ada karena event akhir dari stream dapat membawa data penggunaan dan tidak ada teks. Lewati event ini untuk menghindari kesalahan indeks. Satu detail operasional: permintaan yang di-streaming memegang slot konkurensinya hingga stream berakhir. Jika Anda memulai banyak stream dalam thread dan tidak pernah selesai membacanya, Anda akan mencapai batas konkurensi meskipun laju permintaan Anda rendah.

Minta JSON dan panggil alat

Mode JSON

Tetapkan response_format ke objek JSON agar respons dapat diparsing. Juga beri tahu model dalam prompt bahwa Anda menginginkan JSON; pengaturan ini membatasi format, dan prompt memberi tahu model bentuk yang diinginkan.

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"]))

Bungkus json.loads dalam blok try. Balasan yang mencapai max_tokens dapat terpotong di tengah objek.

Pemanggilan alat

Berikan tools dan opsionalnya tool_choice. Ketika model meminta alat, jalankan sendiri dan kirimkan hasilnya kembali sebagai pesan dengan role: "tool".

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)

Jaga percakapan dan pantau anggaran token

API bersifat stateless. Jika Anda menginginkan obrolan yang mengingat apa yang telah diucapkan, simpan daftar pesan di program Anda dan kirimkan semuanya dengan setiap panggilan. Kelas kecil melakukan pekerjaan ini, dan itu juga tempat yang tepat untuk membatasi riwayat agar biaya tidak membengkak.

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])

Pemangkasan lebih penting untuk uang daripada untuk jendela konteks. Model menerima hingga 100.000 token secara total, tetapi jika setiap giliran mengirim ulang 30.000 token riwayat, setiap panggilan biayanya $0.0045 hanya untuk input (30.000 dikalikan $0.15 per juta). Lima puluh giliran seperti itu berjumlah $0.225 sebelum satu token output dihitung. Menyimpan belasan giliran terakhir, atau meringkas giliran lama menjadi catatan singkat, biasanya menjaga kualitas dan memotong tagihan secara tajam.

Konkurensi adalah hal lain yang harus dirancang. Jika program Anda melayani beberapa pengguna sekaligus, semaphore yang berukuran sesuai batas kunci Anda (8 untuk kunci penuh, 2 untuk kunci uji coba) mencegah Anda melebihi batas sehingga memicu kesalahan concurrency. Panggilan di atas batas akan menunggu di antrian Anda sendiri daripada gagal, yang lebih ramah daripada melakukan coba ulang pada kode 429.

Pengujian juga perlu disebutkan. Tulis satu skrip kecil yang memanggil API dengan seed tetap, suhu rendah, dan max_tokens pendek, lalu jalankan setiap kali Anda mengubah prompt atau pengaturan. Seed dan suhu rendah membuat output lebih dapat diulang, yang memungkinkan Anda membandingkan dua versi prompt tanpa gangguan. Jaga pengujian ini kecil; pengujian yang memakan biaya sepersekian sen dapat dijalankan pada setiap commit tanpa ada yang memperhatikan tagihan.

Akhirnya, log ID permintaan dari setiap respons. Ketika panggilan berperilaku aneh, ID tersebut adalah cara tercepat untuk menunjuk dukungan ke permintaan yang tepat.

Tangani batas, kesalahan, dan saldo

Kunci penuh memungkinkan 8 permintaan konkuren dan 300 permintaan per menit. Kunci uji coba memungkinkan 2 dan 60. Melebihi batas pertama mengembalikan HTTP 429 dengan kode kesalahan concurrency, dan melebihi batas kedua mengembalikan 429 dengan rate_limited. Beban berlebih sementara juga mengembalikan 429 dengan header Retry-After: 5.

Paket OpenAI mencoba ulang beberapa kegagalan secara mandiri, dan Anda dapat menambahkannya dengan max_retries. Untuk pekerjaan batch, tambahkan batas sendiri untuk pekerjaan paralel juga, agar Anda tetap berada di bawah batas konkurensi daripada mengandalkan percobaan ulang.

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)

Header respons X-Request-Id dan X-Balance-USD berguna dalam log. Kutip ID permintaan ketika Anda menghubungi dukungan. Biaya tercantum di halaman harga: $0,15 per 1M token input dan $0,50 per 1M token output, dengan isi saldo dari $20 hingga $500 dan bonus 5%, 10% dan 15% pada $50, $100 dan $200. Kartu (Visa, Mastercard, Apple Pay, Google Pay) dan kripto (USDT di TRC20, USDC di Base) diterima. Prompt tidak digunakan untuk pelatihan. Model ini ditujukan untuk penggunaan dewasa yang sah, dan konten seksual yang melibatkan anak di bawah umur tidak pernah diizinkan.

Tanya jawab

Apakah kunci API ini berfungsi untuk konversi teks ke ucapan di Python?

Tidak. Kunci ini mengautentikasi API LLM teks tanpa output audio. Gunakan untuk menghasilkan teks, lalu teruskan teks tersebut ke alat speech.

Paket Python apa yang harus Anda gunakan?

Paket openai resmi. Atur base_url ke https://api.ttsapihub.com/v1 dan model ke uncensored.

Bagaimana cara menjaga kunci agar tidak ada di dalam kode?

Baca dari variabel lingkungan seperti API_KEY, dan simpan file .env agar tidak masuk ke kontrol versi.

Bagaimana saya bisa melihat berapa biaya satu panggilan?

Baca resp.usage untuk jumlah token dan header respons X-Balance-USD untuk saldo tersisa.

Apa yang terjadi saat Anda mencapai batas laju?

API mengembalikan HTTP 429 dengan kode rate_limited atau concurrency. Tunggu beberapa detik dan coba lagi; permintaan yang gagal tidak dikenakan biaya.

Kunci Anda hanya selangkah lagi dari satu formulir

Buat akun, salin kunci, ubah URL dasar. Itu saja seluruh proses pengaturannya.

Dapatkan kunci API