繁中 ▾
用於 TTS 管線的無審查文字 APIhttps://api.ttsapihub.com/v1

TTS API 金鑰在 Python 中的設定、串流與 JSON 模式

這是本網站後端 API 的 Python 逐步操作:儲存金鑰、建立用戶端、串流輸出回覆、強制 JSON 輸出並處理速率限制。首先注意一點:它產生文字,而非音訊。

更新於

終端機上方發亮的金鑰與資料串流,說明從 Python 使用的 API 金鑰

重點摘要

  • 此端點與 OpenAI 相容,因此 openai Python 套件可搭配設為 https://api.ttsapihub.com/v1 的 base_url 使用
  • 將金鑰放在環境變數中,不要放在原始碼中。
  • 支援串流輸出、JSON 模式和函式呼叫;不支援音訊輸出。
  • 處理 HTTP 429 時請稍作等待,並讀取 X-Balance-USD 以追蹤支出。

檢查金鑰可開啟的功能

搜尋 tts api key python 範例的人通常想將文字轉為語音。此服務的金鑰並非用於此目的。它用於驗證對文字 LLM 的請求:POST /v1/chat/completions 與 GET /v1/models,並使用模型 uncensored。沒有語音合成、沒有音訊上傳,也沒有嵌入。

如果這符合你的專案需求(例如你產生腳本、對話或旁白,然後將其傳給獨立的語音工具),本頁面的其餘部分提供可運作的 Python 程式碼。如果你需要 API 本身產生音訊輸出,則此服務不適合,現在知道比較好。文件列出了確切的功能集。

在音訊專案中使用文字產生的一種實用方法是將其視為寫作階段。模型會起草旁白、重寫一行以符合時間限制,或將筆記轉化為多個角色的對話。你的 Python 程式碼隨後將最終文字交給你所使用的任何語音工具。將階段分開也意味著你可以更換其中任何一個而不影響另一個,且你只需為它寫出的文字支付此 API 的費用。

要跟著操作,你需要 Python 3.9 或更新版本以及金鑰。在 API 金鑰頁面 註冊並領取一次性 $0.50 試用額度;有效期 7 天且無需信用卡。

儲存金鑰並安裝套件

不要將金鑰寫入你會提交的檔案。將其放在環境變數中,並在執行階段讀取。

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

Windows PowerShell 的等效寫法為 $env:API_KEY = "paste-your-key-here"。專案中常用 .env 檔案搭配 python-dotenv 載入,前提是 .env 已加入 .gitignore。

如果金鑰洩漏至程式碼庫,請視為已損耗:盡可能從歷史記錄中移除,並申請新的金鑰。請記住,金鑰會消耗預付額度,因此金鑰洩漏也是一種財務損失。

建立用戶端並進行第一次呼叫

官方套件接受 base_url。其餘部分與一般的 OpenAI 呼叫格式相同。

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 物件顯示呼叫使用了多少 token,以便你計算成本:輸入 token 乘以每百萬 $0.15,加上輸出 token 乘以每百萬 $0.50。如果上述呼叫使用了 60 個輸入 token 和 80 個輸出 token,成本為 $0.000009 加上 $0.00004,即 $0.000049。失敗或被拒絕的請求不會計費。

max_tokens 是選用的。若未設定,完成內容可使用 100,000-token 視窗中剩餘的任何數量,因此當你希望對長度和成本設定硬性上限時,請設定它。

串流輸出回覆

串流輸出使用伺服器發送事件(SSE)在產生時回傳 token。設定 stream=True 並進行迭代。

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)

檢查空 choices 列表的存在是因為串流的最後一個事件可能包含使用資料而無文字。跳過它可避免索引錯誤。一個運作細節:串流請求會在其串流結束前佔用其並行槽位。如果你在執行緒中啟動許多串流且從未讀取完畢,即使你的請求速率很低,也會達到並行限制。

要求 JSON 並呼叫工具

JSON 模式

將 response_format 設為 JSON 物件以使回覆可解析。同時在提示詞中告知模型你想要 JSON;設定會限制格式,而提示詞會告知它所需的形狀。

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

仍請將 json.loads 包在 try 區塊中。達到 max_tokens 的回覆可能會在物件中間被截斷。

函式呼叫

傳遞 tools 以及可選的 tool_choice。當模型要求使用工具時,由你自己執行該工具,並將結果以 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)

保持對話並監控 token 預算

API 是無狀態的。如果你想要能記住所說內容的聊天,你需要在程式中保留訊息列表,並在每次呼叫時傳送所有內容。一個小型類別即可完成此工作,也是限制歷史記錄以控制成本的好去處。

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

截斷對資金的影響大於對上下文視窗的影響。模型總共接受最多 100,000 個 token,但如果每次對話輪次都重新發送 30,000 個 token 的歷史記錄,每次呼叫僅輸入成本就需 $0.0045(30,000 乘以每百萬 token $0.15)。五十次此類對話輪次累計達 $0.225,此時甚至尚未計算任何輸出 token。保留最後十二次對話輪次,或將較舊的對話摘要為簡短筆記,通常能在維持品質的同時大幅降低費用。

並行性是另一項需要設計的因素。如果你的程式同時服務多個使用者,將信號量大小設為你的金鑰限制(完整金鑰為 8,試用金鑰為 2)可避免觸發 concurrency 錯誤。超過限制的呼叫會等待在你自己的佇列中,這比在 429 時重試更友善。

測試也值得說明。撰寫一個小腳本,使用固定的 seed、低溫度與短的 max_tokens 呼叫 API,並在每次更改提示詞或設定時執行。seed 與低溫度能讓輸出更具可重複性,讓你能夠比較兩種提示詞版本而無需雜訊干擾。保持這些測試輕量;每次提交時執行成本僅幾分之一美分的測試,不會讓人察覺帳單的變化。

最後,記錄每個回應的請求 ID。當呼叫表現異常時,該 ID 是讓支援團隊定位特定請求的最快方式。

處理限制、錯誤和餘額

完整金鑰允許 8 個並行請求和每分鐘 300 個請求。試用金鑰允許 2 個和 60 個。超過前者會回傳 HTTP 429 且錯誤代碼為 concurrency,超過後者會回傳 429 且為 rate_limited。暫時超載也會回傳 429 且帶有 Retry-After: 5 標頭。

OpenAI 套件會自行重試某些失敗,你可以透過 max_retries 提高該值。對於批次工作,也請加入你自己的並行工作上限,以便保持在並行限制之下,而不是依賴重試。

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)

回應標頭 X-Request-Id 和 X-Balance-USD 在日誌中很有用。聯繫支援時請引用請求 ID。費用列於 定價頁面:每 1M 輸入 token $0.15,每 1M 輸出 token $0.50,儲值金額從 $20 到 $500,並享有 5%、10% 和 15% 的獎金,分別在 $50、$100 和 $200 時獲得。接受信用卡(Visa、Mastercard、Apple Pay、Google Pay)和加密貨幣(TRC20 上的 USDT、Base 上的 USDC)。提示詞不用於訓練。該模型適用於合法成人用途,且絕不允許涉及未成年人的性內容。

問答

此 API 金鑰可在 Python 中用於文字轉語音嗎?

不行。此金鑰用於驗證文字 LLM API,無音訊輸出。用它來產生文字,然後將文字傳給語音工具。

我應該使用哪個 Python 套件?

官方 openai 套件。將 base_url 設為 https://api.ttsapihub.com/v1,模型設為 uncensored。

我如何將金鑰排除在程式碼之外?

從環境變數(如 API_KEY)讀取,並將任何 .env 檔案排除在版本控制之外。

我如何查看一次呼叫的成本?

讀取 resp.usage 取得 token 計數,並讀取 X-Balance-USD 回應標頭以查看剩餘餘額。

當我達到速率限制時會發生什麼事?

API 會回傳 HTTP 429,錯誤代碼為 rate_limited 或 concurrency。等待幾秒後重試;失敗的請求不會計費。

只差一張表單,即可取得金鑰

建立帳號、複製金鑰、更改基礎 URL。這就是整個設定過程。

取得 API 金鑰