PythonでのTTS APIキー:セットアップ、ストリーミング、JSONモード
これは当サイトのAPI向けのPythonチュートリアルです:キーの保存、クライアントの作成、ストリーミング、JSON出力の強制、レート制限の処理を行います。まず注意点として、これはテキストを生成するものであり、音声は生成しません。
更新

主要ポイント
- エンドポイントはOpenAI互換なので、base_urlをhttps://api.ttsapihub.com/v1に設定してopenai Pythonパッケージが使用できます。
- キーは環境変数に保存し、ソースコードには直接書き込まないでください。
- ストリーミング、JSONモード、ツール呼び出しがサポートされていますが、音声出力はサポートされていません。
- HTTP 429を短い待機時間で処理し、X-Balance-USDを読んで支出を追跡してください。
キーが何を開くかを確認
「tts api key python example」で検索する人は通常、テキストを音声に変換したいと考えています。このサービスのキーはそれを行いません。これはテキストLLMへのリクエストを認証するものであり、POST /v1/chat/completionsおよびGET /v1/modelsを使用し、モデルuncensoredを利用します。音声合成、音声アップロード、埋め込みはありません。
スクリプト、対話、ナレーションを生成して別の音声ツールに渡す場合など、プロジェクトに合っている場合は、このページ以降で動作するPythonコードを提供します。API自体から音声出力が必要な場合は、このサービスは不適切です。そのことを今知っておくのが良いでしょう。機能セットの詳細はdocsをご覧ください。
音声プロジェクトでテキスト生成を効果的に利用するには、それを「執筆段階」として扱う方法があります。モデルがナレーションの下書きを作成したり、時間制限に合わせて文章を書き直したり、複数の話者による対話に変換したりします。その後、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"が相当します。プロジェクトではpython-dotenvなどのパッケージで読み込む.envファイルが一般的で、.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オブジェクトは、呼び出しに使用されたトークン数を示すため、コストを計算できます:入力トークン数×100万トークンあたり$0.15、出力トークン数×100万トークンあたり$0.50。上記の呼び出しが入力トークン60個、出力トークン80個を使用した場合、コストは$0.000009と$0.00004で、合計$0.000049となります。失敗または拒否されたリクエストには課金されません。
max_tokensはオプションです。指定しない場合、完了は100,000トークンのウィンドウの残りを何でも使用できるため、長さやコストに上限を設定したい場合は指定してください。
ストリーミングで応答を取得
ストリーミングはサーバー送信イベントを使用して、生成されたトークンを返します。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)会話を維持し、トークン予算を監視する
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トークンまで受け付けますが、各ターンで履歴の30,000トークンを再送信すると、入力のみで1回あたり$0.0045(100万トークンあたり$0.15の30,000倍)かかります。そのようなターンが50回続くと、出力トークンが1つカウントされる前に$0.225に達します。最後の12ターンを保持するか、それ以前の会話を短いノートに要約することで、品質を維持しつつ請求額を大幅に削減できます。
同時実行数も設計すべき点です。プログラムが複数のユーザーにサービスを提供する場合、キーの制限(フルキーは8、トライアルキーは2)に合わせたセマフォを使用することで、concurrencyエラーを回避できます。制限を超える呼び出しは失敗するのではなく独自のキューで待機するため、429で再試行するよりもフレンドリーです。
テストについても一言触れておきます。固定されたseed、低いtemperature、短いmax_tokensでAPIを呼び出す小さなスクリプトを書き、プロンプトや設定を変更するたびに実行してください。シードと低い温度は出力の再現性を高め、ノイズなしで2つのプロンプトバージョンを比較できます。これらのチェックは小さく保ってください。1セント未満のコストのテストであれば、誰かが請求書に気づかずにすべてのコミットで実行できます。
最後に、各レスポンスのリクエストIDをログに記録してください。呼び出しが奇妙な動作をした場合、そのIDはサポートに正確なリクエストを指し示す最も迅速な方法です。
制限、エラー、残高の処理
フルキーは8つの同時リクエストと1分あたり300リクエストを許可します。トライアルキーは2と60を許可します。前者を超えるとHTTP 429が返され、エラーコードはconcurrency、後者を超えると429が返され、エラーコードはrate_limitedになります。一時的な過負荷もRetry-After: 5ヘッダー付きで429を返します。
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あたり$0.15、出力トークン1Mあたり$0.50。チャージは$20〜$500、ボーナスは$50、$100、$200のチャージでそれぞれ5%、10%、15%です。カード(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ファイルをバージョン管理から除外してください。
1回の呼び出しの料金を確認するにはどうすればよいですか?
トークン数はresp.usageから、残高はX-Balance-USDレスポンスヘッダーから確認できます。
レート制限に達するとどうなりますか?
APIはHTTP 429を返し、コードはrate_limitedまたはconcurrencyです。数秒待ってから再試行してください。失敗したリクエストには課金されません。