Bỏ qua để đến nội dung

Chuyển văn bản thành giọng nói

Chuyển văn bản thành giọng nói đọc một đoạn văn bản và trả về tệp âm thanh. Endpoint theo đúng quy ước của OpenAI: request body là JSON, response body chính là âm thanh, không có tác vụ bất đồng bộ hay bước thăm dò.

Nếu Base URL của client được cấu hình không kèm /v1, POST /audio/speech cũng dùng được; gateway tự viết lại thành /v1/audio/speech ở bên trong.

POST /v1/audio/speech
https://api.routeapi.ai/v1/audio/speech

Body là JSON. Chỉ model được chính RouteAPI kiểm tra; các trường còn lại được chuyển tiếp tới mô hình upstream, và các giá trị được chấp nhận phụ thuộc vào mô hình đó.

TrườngKiểuBắt buộcMô tả
modelstringCóID mô hình TTS, ví dụ tts-1, tts-1-hd hoặc gpt-4o-mini-tts. Trường này bắt buộc phải có trong body: giá trị rỗng hoặc thiếu sẽ trả về 400 với Missing required field: model (định tuyến có dự phòng tts-1, nhưng bước kiểm tra chạy trước)
inputstringUpstream bắt buộcVăn bản cần tổng hợp thành giọng nói. Gateway cũng ước tính token đầu vào từ trường này để tính phí
voicestringUpstream bắt buộcTên giọng nói. Tập giọng hợp lệ phụ thuộc vào từng mô hình
response_formatstringKhôngĐịnh dạng chứa âm thanh, được chuyển tiếp tới upstream. Khi bỏ qua, giá trị mặc định của upstream được áp dụng. Gateway cũng dùng giá trị này để đo thời lượng âm thanh trả về nhằm tính phí và coi giá trị bị bỏ qua là mp3; pcm được đo ở 24 kHz, 16-bit, mono
speednumberKhôngHệ số tốc độ phát, được chuyển tiếp nguyên vẹn khi có
instructionsstringKhôngChỉ dẫn về cách thể hiện/phong cách cho các mô hình hỗ trợ (như gpt-4o-mini-tts)
stream_formatstringKhôngĐặt thành sse để nhận âm thanh dưới dạng Server-Sent Events thay vì một body nhị phân. Giá trị được chuyển tiếp; chỉ những upstream hỗ trợ TTS streaming mới thực sự stream
metadataobjectKhôngCác trường bổ sung mà một số loại kênh hợp nhất vào yêu cầu upstream của riêng chúng (ví dụ Volcengine TTS hoặc MiniMax)
Terminal window
curl https://api.routeapi.ai/v1/audio/speech \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "tts-1",
"voice": "alloy",
"input": "RouteAPI aggregates many AI providers behind a single API.",
"response_format": "mp3"
}' \
--output speech.mp3
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
with client.audio.speech.with_streaming_response.create(
model="tts-1",
voice="alloy",
input="RouteAPI aggregates many AI providers behind a single API.",
response_format="mp3",
) as response:
response.stream_to_file("speech.mp3")

client.audio.speech.create(...) cũng dùng được và trả về response.content, dữ liệu âm thanh thô. Lưu lại bằng open("speech.mp3", "wb").write(response.content).

Body chính là tệp âm thanh, không phải JSON. Gateway đọc body upstream để đo thời lượng nhằm tính phí, sau đó ghi ra kèm Content-Length khớp với những gì bạn thực sự nhận được. Chỉ một danh sách trắng nhỏ các header upstream được chuyển tiếp — đáng chú ý là Content-Type (ví dụ audio/mpeg), bạn có thể dựa vào đó để chọn phần mở rộng tệp; các header upstream khác như Server bị loại bỏ. Content-Encoding chỉ được chuyển tiếp khi body upstream chưa được gateway giải nén.

Với "stream_format": "sse", phản hồi là text/event-stream. Mỗi đoạn âm thanh đến dưới dạng một frame data:, và nếu upstream gửi một chunk usage cuối cùng thì gateway đọc nó để tính phí; nếu không, gateway tính phí theo ước tính.

Các lần gọi âm thanh dùng cùng cơ chế ví và quota như mọi lần gọi API mô hình khác: một khoản ước tính được tạm giữ trước, yêu cầu được quyết toán sau khi upstream phản hồi, và yêu cầu thất bại được hoàn lại. Giá lấy từ cấu hình của mô hình — xem Giá mô hình để biết giá được hiển thị thế nào trên trang chi tiết mô hình.

Phương thức áp dụng phụ thuộc vào cách mô hình được định giá, và trang chi tiết mô hình sẽ hiển thị điều đó:

  • Giá cố định theo lần yêu cầu. Nếu mô hình có cấu hình giá theo lần yêu cầu, yêu cầu được tính đúng giá đó nhân với hệ số nhóm của bạn và token không ảnh hưởng tới số tiền. Trong bộ mặc định tích hợp sẵn, gpt-4o-mini-tts đã được cấu hình theo cách này — hãy kiểm tra trang chi tiết thay vì giả định là tính phí theo token.
  • Theo token. Nếu không, khoản phí được tính từ mức sử dụng bên dưới.

Đầu vào được ước tính từ input. Gateway đếm ký tự với hầu hết mô hình và dùng tokenizer với các mô hình có ID chứa gpt, sau đó tính phí số đó theo hệ số của mô hình.

Âm thanh được tạo được đo bằng token theo 1000 token mỗi phút âm thanh: gateway đọc thời lượng từ âm thanh trả về và tính ceil(duration) / 60 × 1000 token đầu ra, với giá bằng hệ số của mô hình nhân hệ số âm thanh nhân hệ số hoàn thành âm thanh. Nếu không đo được thời lượng âm thanh, gateway dự phòng khoảng một token cho mỗi kilobyte âm thanh.

Hệ số hoàn thành âm thanh tích hợp sẵn là 0 với dòng tts-1 / tts-1-hd, nên khi tính phí theo token, âm thanh được tạo không cộng thêm gì cho các mô hình đó và phần đầu vào dựa trên ký tự thực chất là toàn bộ khoản phí. Các mô hình có hệ số hoàn thành âm thanh khác 0 còn bị tính phí cho âm thanh được tạo.

Việc đo thời lượng phụ thuộc vào response_format: pcm không có header định dạng chứa, nên thời lượng được tính từ số byte ở 24 kHz / 16-bit / mono; các định dạng khác được phân tích từ định dạng chứa.

Vì token đầu ra được suy ra từ tệp trả về, khoản phí phản ánh những gì thực sự được tạo, không chỉ độ dài của input.

Lỗi dùng body chuẩn { "error": { ... } }, và thông báo có kèm request ID để bạn tra trong nhật ký console. Xem Lỗi thường gặp để biết danh sách đầy đủ.

Mã trạng tháiMã lỗiNguyên nhân
400invalid_requestmodel bị thiếu hoặc rỗng (Missing required field: model)
403insufficient_user_quota / pre_consume_token_quota_failedSố dư tài khoản hoặc quota của Key không đủ cho chi phí ước tính
403—Mô hình nằm ngoài danh sách trắng mô hình của Key (This token has no access to model ...)
429—Vượt quá giới hạn tốc độ yêu cầu
503model_not_foundKhông có kênh khả dụng cho mô hình (No valid upstream service)
500convert_request_failedKhông thể chuyển đổi yêu cầu cho kênh — ví dụ kênh có bộ chuyển đổi chưa triển khai chuyển văn bản thành giọng nói
4xx / 5xxMã lỗi của upstreamNhà cung cấp từ chối yêu cầu; mã trạng thái và thông báo được chuyển tiếp nguyên vẹn
{
"error": {
"message": "Missing required field: model (request id: 20261023153000123456789AbCdEfGh)",
"type": "error",
"code": "invalid_request"
}
}

Khi yêu cầu thất bại, khoản tạm giữ được hoàn lại.