| |
| """OpenAI-Compatible 客户端示例:把 S3 speech tokens POST 到 /v1/audio/speech 生成 wav。 |
| |
| 用法: |
| python3 openai_client.py --tokens "12,34,56" --out out.wav |
| python3 openai_client.py --tokens-npy sample_input/tokens.npy --out out.wav --fmt mp3 |
| """ |
|
|
| import argparse |
| import json |
| import sys |
| import urllib.request |
| from pathlib import Path |
|
|
| import numpy as np |
|
|
|
|
| def main(): |
| p = argparse.ArgumentParser(description="OpenAI-Compatible 板端 TTS client") |
| p.add_argument("--url", default="http://127.0.0.1:8000/v1/audio/speech") |
| p.add_argument("--tokens", default="", help="逗号分隔的 S3 token id 列表") |
| p.add_argument("--tokens-npy", default="", help="或从 npy 读取 token 序列") |
| p.add_argument("--out", default="output.wav") |
| p.add_argument("--fmt", default="wav", choices=["wav", "mel"]) |
| p.add_argument("--model", default="chatterbox-onestep") |
| args = p.parse_args() |
|
|
| if args.tokens: |
| tokens = [int(t) for t in args.tokens.split(",") if t.strip()] |
| elif args.tokens_npy: |
| arr = np.load(args.tokens_npy).reshape(-1) |
| tokens = [int(t) for t in arr if t > 0] |
| else: |
| print("请提供 --tokens 或 --tokens-npy") |
| sys.exit(1) |
|
|
| body = json.dumps({ |
| "model": args.model, "input": tokens, "voice": "default", "response_format": args.fmt, |
| }).encode("utf-8") |
| req = urllib.request.Request(args.url, data=body, headers={"Content-Type": "application/json"}) |
| try: |
| with urllib.request.urlopen(req, timeout=180) as resp: |
| audio = resp.read() |
| except urllib.error.HTTPError as e: |
| print("server error:", e.code, e.read().decode()[:500]) |
| sys.exit(1) |
| Path(args.out).write_bytes(audio) |
| print(f"OK: {len(audio)} bytes -> {args.out}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|