voxcpm_api.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/usr/bin/env python3
  2. """
  3. VoxCPM2 声音克隆 - 最终版
  4. 支持两种方式:
  5. 1. 使用文件路径(音频在API服务器上)
  6. 2. 使用base64编码(音频在本地电脑)
  7. """
  8. import requests
  9. import base64
  10. import os
  11. # ==================== 配置 ====================
  12. API_URL = "http://183.252.196.135:6003"
  13. SAVE_DIR = "/Users/alien/Desktop/Digital_Human/Image_Analysis/knowledge_kelong"
  14. os.makedirs(SAVE_DIR, exist_ok=True)
  15. TEXT = "音频可以在本地电脑,自动传输到服务器。"
  16. # 本地音频文件路径(在你的调用电脑上)
  17. LOCAL_REFERENCE_WAV = "/Users/alien/Desktop/Digital_Human/voice_output.wav"
  18. # ==================== 方式1: 使用base64编码(推荐) ====================
  19. def generate_tts_clone_base64():
  20. """
  21. 方式1: 将本地音频编码为base64发送给API
  22. 优点:不需要提前上传文件到API服务器
  23. """
  24. print("=" * 60)
  25. print("🚀 开始声音克隆(方式1:base64传输)")
  26. print("=" * 60)
  27. print(f"📝 文本: {TEXT}")
  28. print(f"🔊 本地音频: {LOCAL_REFERENCE_WAV}")
  29. # 检查本地文件是否存在
  30. if not os.path.exists(LOCAL_REFERENCE_WAV):
  31. print(f"❌ 本地音频文件不存在: {LOCAL_REFERENCE_WAV}")
  32. return
  33. # 读取本地音频并编码为base64
  34. print(f"📦 正在编码音频为base64...")
  35. with open(LOCAL_REFERENCE_WAV, "rb") as f:
  36. ref_base64 = base64.b64encode(f.read()).decode("utf-8")
  37. print(f"✅ 编码完成,大小: {len(ref_base64) / 1024:.2f} KB")
  38. # 发送请求 - 使用base64编码
  39. resp = requests.post(
  40. f"{API_URL}/v1/tts/generate",
  41. json={
  42. "text": TEXT,
  43. "reference_wav_base64": ref_base64, # ✅ 使用base64字段
  44. "cfg_value": 2.0,
  45. "inference_timesteps": 20,
  46. "return_base64": True
  47. },
  48. timeout=300
  49. )
  50. # 检查响应
  51. if resp.status_code != 200:
  52. print(f"❌ 请求失败: {resp.status_code}")
  53. print(f"错误信息: {resp.text}")
  54. return
  55. # 保存音频
  56. result = resp.json()
  57. if not result.get('audio_base64'):
  58. print("❌ 未返回音频数据")
  59. print(f"响应内容: {result}")
  60. return
  61. audio_data = base64.b64decode(result["audio_base64"])
  62. out_path = os.path.join(SAVE_DIR, "clone_result_base64.wav")
  63. with open(out_path, "wb") as f:
  64. f.write(audio_data)
  65. print(f"✅ 声音克隆完成!")
  66. print(f"💾 已保存到: {out_path}")
  67. print(f"📊 文件大小: {len(audio_data) / 1024:.2f} KB")
  68. print("=" * 60)
  69. # ==================== 方式2: 使用文件路径 ====================
  70. def generate_tts_clone_path():
  71. """
  72. 方式2: 使用API服务器上的文件路径
  73. 前提:音频文件必须已经在API服务器上
  74. """
  75. print("=" * 60)
  76. print("🚀 开始声音克隆(方式2:文件路径)")
  77. print("=" * 60)
  78. # 这个路径必须在API服务器 192.168.22.9 上存在
  79. SERVER_REFERENCE_WAV = "/tmp/voice_output.wav"
  80. print(f"📝 文本: {TEXT}")
  81. print(f"🔊 服务器音频: {SERVER_REFERENCE_WAV}")
  82. resp = requests.post(
  83. f"{API_URL}/v1/tts/generate",
  84. json={
  85. "text": TEXT,
  86. "reference_wav_path": SERVER_REFERENCE_WAV, # ✅ 使用文件路径
  87. "cfg_value": 2.0,
  88. "inference_timesteps": 20,
  89. "return_base64": True
  90. },
  91. timeout=300
  92. )
  93. if resp.status_code != 200:
  94. print(f"❌ 请求失败: {resp.status_code}")
  95. print(f"错误信息: {resp.text}")
  96. return
  97. result = resp.json()
  98. if not result.get('audio_base64'):
  99. print("❌ 未返回音频数据")
  100. print(f"响应内容: {result}")
  101. return
  102. audio_data = base64.b64decode(result["audio_base64"])
  103. out_path = os.path.join(SAVE_DIR, "clone_result_path.wav")
  104. with open(out_path, "wb") as f:
  105. f.write(audio_data)
  106. print(f"✅ 声音克隆完成!")
  107. print(f"💾 已保存到: {out_path}")
  108. print(f"📊 文件大小: {len(audio_data) / 1024:.2f} KB")
  109. print("=" * 60)
  110. # ==================== 主函数 ====================
  111. if __name__ == "__main__":
  112. print("\n📋 选择声音克隆方式:")
  113. print("1. 音频在本地电脑 → 使用方式1(base64)")
  114. print("2. 音频在API服务器 → 使用方式2(文件路径)")
  115. print()
  116. # 默认使用方式1(base64)
  117. print("🔹 使用方式1(base64传输)...")
  118. generate_tts_clone_base64()
  119. # 如需使用方式2,取消注释:
  120. # generate_tts_clone_path()
  121. print("\n💡 提示:")
  122. print(" - 方式1(base64): 音频可以在本地电脑,自动传输到服务器")
  123. print(" - 方式2(路径): 音频必须先在API服务器上")
  124. print(" - 推荐使用方式1,更方便灵活")