blackantt 发表于 2024-11-30 11:58:44

请根据文档给出dubbingX的python调用代码?

https://doc.dubbingx.com/guide/TTS.html


TTS 流式生成文档
请求地址以及请求头
streaming-api.dubbingx.com/ws

必要参数        值
api_key        请求的api_key
api_secret        请求的api_secrect
API Key以及secret在客户端中生成即可

1.连接ws服务器
鉴权

ws://streaming-api.dubbingx.com/ws?date={date}&authorization={authorization}&api_key={api_key}
1
or wss


wss://streaming-api.dubbingx.com/ws?date={date}&authorization={authorization}&api_key={api_key}
1
必要参数        值
date        Thu, 26 Sep 2024 06:43:00 UTC
api_key        api_key
authorization        见下方法
JS示例代码

let date = new Date().toUTCString();

getAuthStr(date) {
        // SHA256
let signatureSha = CryptoJS.HmacSHA256(date, this.config.apiSecret)
let signature = CryptoJS.enc.Base64.stringify(signatureSha)
let authorizationOrigin = 'api_key='+this.config.apiKey+',date='+date+',signature='+signature;
let authStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(authorizationOrigin))
return authStr
},

JAVA示例代码

java
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = format.format(new Date());

// SHA256
Mac mac = Mac.getInstance("hmacsha256");
SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "hmacsha256");
mac.init(spec);
byte[] hexDigits = mac.doFinal(date.getBytes(StandardCharsets.UTF_8));
// Base64
String sha = Base64.getEncoder().encodeToString(hexDigits);
String authorizationOrigin = "api_key="+apiKey+",date="+date+",signature="+sha;
String authStr = Base64.getEncoder().encodeToString((authorizationOrigin.getBytes(StandardCharsets.UTF_8)));
return authStr.contains(authorization);

步骤解析:

1.使用api_secrect对date进行SHA加密

2.对步骤一的结果进行base64

3.进行字符串拼接api_key={api_key},date={date},signature={signature}顺序必须保持一致

4.对3结果进行base64

2.获取音色列表
https://tts-api.dubbingx.com/v1/getTTSTimbreList

请求参数

json
{"pageIndex":1,"pageSize":100}
1
请求方法 POST 返回值

字段        备注
id        音色ID
grade        premium 多语态;ordinary 单语态
gender        0女;1男;
voiceUrl        试听音频
json
{
    "code": 200,
    "success": true,
    "msg": "操作成功",
    "data": {
      "total": 1,
      "list": [
            {
                "id": "30002",
                "grade": "premium",
                "isOfficial": true,
                "name": "智吾褚",
                "description": "中青年稳重   温暖",
                "gender": 1,
                "avatar": "https://public.dubbingx.com/avatar/10092/20240329-143217.png",
                "voiceUrl": "https://public.dubbingx.com/audition/10092/mujin.wav",
                "status": true,
                "createTime": "2023-11-03 18:24:12"
            }
      ]
    },
    "time": "2024-04-10 16:24:55",
    "traceId": "1777976038257512450"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
3.发送TTS合成指令(ws)
使用SSML格式传递

xml
<speak voiceId="30065" emotion="常规-日常说话-1" language="zh" audioPitch="1" audioSpeed="1" messageId="1234567890">这是一<phoneme ph="duan2">段</phoneme>测试音频</speak>
1
字段        备注
voiceId        getTTSTimbreList获取的音色ID
emotion        如果不传递将根据文本自动判断情绪,也可以手动指定,https://public.dubbingx.com/emotion/emotion_language.json 下的各个情绪,每个情绪有5档,需手动拼接,
chatId        会话ID,用于标识一个会话,记录上下文进行情感判断,可不传
messageId        必传,消息ID,为Int类型,流式返回时会原样返回
language        zh;jp;en;yue;分别表示中,日,英 粤
audioPitch        语调,1.0为原音高,0.7到1.3,可不传
audioSpeed        语速,1.0为原语速,0.7到1.3,可不传
phoneme        音素标注,只支持中文,包裹内只支持一个文字,多个文字请分多次包裹,格式为<phoneme ph="duan2">段</phoneme>
返回值 数据将会以json格式进行返回

字段        备注
id        如果开始进入合成队列,会返回任务ID
audioBase64        音频的base64格式化数据,当前格式为wav格式,后续提供ogg等格式
status        0表示待开始,-1表示失败,1表示进行中,2表示结束
text        当前音频的文字
json
{
    "id": 1804052251079184400,
    "audioBase64":"",
    "messageId": 1234567890,
    "msg": "操作成功",
    "status": "0",
    "text": ""
}       

FishC 发表于 2024-11-30 12:05:08

根据提供的文档信息,以下是一个使用Python调用dubbingX TTS API的示例代码:

import websocket
import hashlib
import hmac
import base64
import datetime

# 配置API密钥和密钥
api_key = 'your_api_key'
api_secret = 'your_api_secret'

# 获取当前UTC时间并格式化
date = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')

# 生成签名
signature_sha = hmac.new(api_secret.encode('utf-8'), date.encode('utf-8'), hashlib.sha256)
signature = base64.b64encode(signature_sha.digest()).decode('utf-8')

# 拼接授权字符串
authorization_origin = f'api_key={api_key},date={date},signature={signature}'
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode('utf-8')

# WebSocket连接地址
ws_url = f'wss://streaming-api.dubbingx.com/ws?date={date}&authorization={authorization}&api_key={api_key}'

# 连接到WebSocket服务器
def on_message(ws, message):
    print("Received message:", message)

def on_error(ws, error):
    print("Error:", error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    print("WebSocket is open")

if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp(
      ws_url,
      on_message=on_message,
      on_error=on_error,
      on_close=on_close
    )
    ws.on_open = on_open
    ws.run_forever()

请注意替换 `'your_api_key'` 和 `'your_api_secret'` 为您的实际 API Key 和 Secret。这个脚本演示了如何连接到 dX 的 WebSocket API,监听消息和错误事件。根据您的需求,您可能需要在 `on_open` 函数中发送初始数据。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 请根据文档给出dubbingX的python调用代码?