You need to enable JavaScript to run this app.
导航
声音复刻API-2.0
最近更新时间:2024.11.05 16:05:52首次发布时间:2024.07.10 20:51:57

注意

声音复刻从2024.07.10开始提供2.0升级效果。所有还剩余训练次数的音色均可以调用2.0训练接口进行训练。
调用时注意传递model_type=1,另外原始音频如果不是中文也必须指定语种。

注意

model_type=1时,在合成时需要替换cluster。
如使用字符版,控制台显示的旧cluster为volcano_mega,需替换为volcano_icl;
如使用并发版,控制台显示的旧cluster为volcano_mega_concurr,需替换为volcano_icl_concurr

创建音色
  1. 请求方式

域名: https://openspeech.bytedance.com
具体请求方式可参考下方示例代码

uploadAndStatus.py
未知大小

  1. 训练(upload接口)

接口路径: POST/api/v1/mega_tts/audio/upload
接口描述: 提交音频训练音色
认证方式使用Bearer Token,在请求的header中加上"Authorization": "Bearer; {token}",并在请求的json中填入对应的appid。

注意

Bearer和token使用分号 ; 分隔,替换时请勿保留{}
AppID/Token/Cluster 等信息可参考 控制台使用FAQ-Q1

请求参数

Header:

参数名称

参数类型

必须参数

备注

Authorization

string

必填

Bearer;${Access Token}

Resource-Id

string

必填

volc.megatts.voiceclone
(声音复刻2.0目前已经支持双向流式)

Body:

参数名称

层级

参数类型

必须参数

备注

appid

1

string

必填

speaker_id

1

string

必填

唯一音色代号

audios

1

list

必填

音频格式支持:wav、mp3、ogg、m4a、aac、pcm,其中pcm仅支持24k 单通道目前限制单文件上传最大10MB,每次最多上传1个音频文件

audio_bytes

2

string

必填

二进制音频字节,需对二进制音频进行base64编码

audio_format

2

string

音频格式,pcm、m4a必传,其余可选

text

2

string

可以让用户按照该文本念诵,服务会对比音频与该文本的差异。若差异过大会返回1109 WERError

source

1

int

必填

固定值:2

language

1

int

cn = 0 中文(默认)
en = 1 英文
ja = 2 日语
es = 3 西班牙语
id = 4 印尼语
pt = 5 葡萄牙语

model_type

1

int

默认为0
1为2.0效果,0为1.0效果

json示例

{
        "speaker_id": "S_*******",
        "appid": "your appid",
        "audios": [{
                "audio_bytes": "base64编码后的音频",
                "audio_format": "wav"
        }],
        "source": 2,
        "language": 0,
        "model_type": 1
}

返回数据

Body:

参数名称

层级

参数类型

必须参数

备注

BaseResp

1

object

必填

StatusCode

2

int

必填

成功:0

StatusMessage

2

string

错误信息

speaker_id

1

string

必填

唯一音色代号

json示例

{
    "BaseResp":{
        "StatusCode":0,
        "StatusMessage":""
    },
    "speaker_id":"S_*******"
}
  1. 返回码:

Success

0

成功

BadRequestError

1001

请求参数有误

AudioUploadError

1101

音频上传失败

ASRError

1102

ASR(语音识别成文字)转写失败

SIDError

1103

SID声纹检测失败

SIDFailError

1104

声纹检测未通过,声纹跟名人相似度过高

GetAudioDataError

1105

获取音频数据失败

SpeakerIDDuplicationError

1106

SpeakerID重复

SpeakerIDNotFoundError

1107

SpeakerID未找到

AudioConvertError

1108

音频转码失败

WERError

1109

wer检测错误,上传音频与请求携带文本对比字错率过高

AEDError

1111

aed检测错误,通常由于音频不包含说话声

SNRError

1112

SNR检测错误,通常由于信噪比过高

DenoiseError

1113

降噪处理失败

AudioQualityError

1114

音频质量低,降噪失败

ASRNoSpeakerError

1122

未检测到人声

已达上传次数限制

1123

上传接口已经达到次数限制,目前同一个音色支持10次上传

  1. 状态查询(status接口)

接口路径: POST/api/v1/mega_tts/status
接口描述: 查询音色训练状态

请求参数

Header:

参数名称

参数类型

必须参数

备注

Authorization

string

必填

Bearer;${Access Token}

Resource-Id

string

必填

填入volc.megatts.voiceclone

Body:

参数名称

层级

类型

必填

备注

appid

1

string

必填

speaker_id

1

string

必填

唯一音色代号

json示例

{
    "appid": "your appid",
    "speaker_id": "S_*******"
}

返回数据

Body:

参数名称

层级

参数类型

必须参数

备注

BaseResp

1

object

必填

StatusCode

2

int

必填

成功:0

StatusMessage

2

string

错误信息

speaker_id

1

string

必填

唯一音色代号

status

1

enum { NotFound = 0 Training = 1 Success = 2 Failed = 3 Active = 4 }

必填

训练状态,状态为2或4时都可以调用tts

create_time

1

int

必填

创建时间

version

1

string

选填

训练版本

demo_audio

1

string

选填

Success状态时返回,一小时有效,若需要,请下载后使用

json示例

{
    "BaseResp":{
        "StatusCode":0,
        "StatusMessage":""
    },
    "creaet_time":1701055304000,
    "version": "V1",
    "demo_audio": "http://**********.wav"
    "speaker_id":"S_*******",
    "status":2
}

TTS 语音合成接口(WS/HTTP)

音色训练成功后,需要通过调用TTS接口来使用音色合成指定文本的音频。

注意

接口与TTS参数有差别,需要将cluster换成volcano_icl,voice_type声音id

Websocket

使用账号申请部分申请到的appid&access_token进行调用
文本一次性送入,后端边合成边返回音频数据

1. 接口说明

接口地址为 wss://openspeech.bytedance.com/api/v1/tts/ws_binary

2. 身份认证

认证方式使用Bearer Token,在请求的header中加上"Authorization": "Bearer; {token}",并在请求的json中填入对应的appid。

注意

Bearer和token使用分号 ; 分隔,替换时请勿保留{}

AppID/Token/Cluster 等信息可参考 控制台使用FAQ-Q1

3. 请求方式

3.1 二进制协议

报文格式(Message format)

Image
所有字段以 Big Endian(大端序) 的方式存储。

字段描述

字段 Field (大小, 单位bit)

描述 Description

值 Values

协议版本(Protocol version) (4)

可能会在将来使用不同的协议版本,所以这个字段是为了让客户端和服务器在版本上保持一致。

0b0001 - 版本 1 (目前只有版本1)

报头大小(Header size) (4)

header实际大小是 header size value x 4 bytes.
这里有个特殊值 0b1111 表示header大小大于或等于60(15 x 4 bytes),也就是会存在header extension字段。

0b0001 - 报头大小 = 4 (1 x 4)
0b0010 - 报头大小 = 8 (2 x 4)
0b1010 - 报头大小 = 40 (10 x 4)
0b1110 - 报头大小 = 56 (14 x 4)
0b1111 - 报头大小为60或更大; 实际大小在header extension中定义

消息类型(Message type) (4)

定义消息类型。

0b0001 - full client request.
~~0b1001~~ - full server response(弃用).
0b1011 - Audio-only server response (ACK).
0b1111 - Error message from server (例如错误的消息类型,不支持的序列化方法等等)

Message type specific flags (4)

flags含义取决于消息类型。
具体内容请看消息类型小节.

序列化方法(Message serialization method) (4)

定义序列化payload的方法。
注意:它只对某些特定的消息类型有意义 (例如Audio-only server response 0b1011 就不需要序列化).

0b0000 - 无序列化 (raw bytes)
0b0001 - JSON
0b1111 - 自定义类型, 在header extension中定义

压缩方法(Message Compression) (4)

定义payload的压缩方法。
Payload size字段不压缩(如果有的话,取决于消息类型),而且Payload size指的是payload压缩后的大小。
Header不压缩。

0b0000 - 无压缩
0b0001 - gzip
0b1111 - 自定义压缩方法, 在header extension中定义

保留字段(Reserved) (8)

保留字段,同时作为边界 (使整个报头大小为4个字节).

0x00 - 目前只有0

消息类型详细说明

目前所有TTS websocket请求都使用full client request格式,无论"query"还是"submit"。

Full client request
  • Header size为b0001(即4B,没有header extension)。
  • Message type为b0001.
  • Message type specific flags固定为b0000.
  • Message serialization method为b0001JSON。字段参考上方表格。
  • 如果使用gzip压缩payload,则payload size为压缩后的大小。

Audio-only server response
  • Header size应该为b0001.
  • Message type为b1011.
  • Message type specific flags可能的值有:
    • b0000 - 没有sequence number.
    • b0001 - sequence number > 0.
    • b0010orb0011 - sequence number < 0,表示来自服务器的最后一条消息,此时客户端应合并所有音频片段(如果有多条)。
  • Message serialization method为b0000(raw bytes).

4.注意事项

  • websocket单条链接仅支持单次合成,若需要合成多次,则需要多次建立链接
  • 每次合成时reqid这个参数需要重新设置,且要保证唯一性(建议使用uuid.V4生成)
  • operation需要设置为submit

5.Demo

python

tts_websocket_demo.py
6.89KB

Java

tts-demo-java.zip
7.01KB

Go

tts_websocket_demo.go
7.68KB

HTTP

使用账号申请部分申请到的appid&access_token进行调用
文本全部合成完毕之后,一次性返回全部的音频数据

1. 接口说明

接口地址为 https://openspeech.bytedance.com/api/v1/tts

2. 身份认证

认证方式采用 Bearer Token.
1)需要在请求的 Header 中填入"Authorization":"Bearer;${token}"

注意

Bearer和token使用分号 ; 分隔,替换时请勿保留${}

AppID/Token/Cluster 等信息可参考 控制台使用FAQ-Q1

3. 注意事项

  • 使用 HTTP Post 方式进行请求,返回的结果为 JSON 格式,需要进行解析
  • 因 json 格式无法直接携带二进制音频,音频经base64编码。使用base64解码后,即为二进制音频
  • 每次合成时 reqid 这个参数需要重新设置,且要保证唯一性(建议使用 UUID/GUID 等生成)
  1. Demo

Python

tts_http_demo.py
1.33KB

Java

tts_http_demo.zip
13.27KB

Go

tts_http_demo.go
3.44KB

参数说明

字段

含义

层级

格式

必需

备注

app

应用相关配置

1

dict

appid

应用标识

2

string

需要申请

token

应用令牌

2

string

可传任意非空字符串

cluster

业务集群

2

string

volcano_icl或volcano_icl_concurr

user

用户相关配置

1

dict

uid

用户标识

2

string

可传任意非空字符串,传入值可以通过服务端日志追溯

audio

音频相关配置

1

dict

语音合成参考音色列表;声音复刻语音合成请通过下单获取

voice_type

音色类型

2

string

填入S_开头的声音id(SpeakerId)

encoding

音频编码格式

2

string

wav / pcm / ogg_opus / mp3,默认为 pcm
注意:wav 不支持流式

request

请求相关配置

1

dict

reqid

请求标识

2

string

需要保证每次调用传入值唯一,建议使用 UUID

text

文本

2

string

合成语音的文本,长度限制 1024 字节(UTF-8编码)

text_type

文本类型

2

string

默认plain纯文本,ssml可以支持ssml

operation

操作

2

string

query(非流式,http只能query) / submit(流式)

备注:

  1. 支持ssml能力,参考SSML标记语言--语音技术-火山引擎 (volcengine.com)
  2. 暂时不支持音高、音量调节
  3. 支持中英混,支持语种自动识别

请求示例

{
    "app": {
        "appid": "appid123",
        "token": "access_token",
        "cluster": "volcano_icl"
    },
    "user": {
        "uid": "uid123"
    },
    "audio": {
        "voice_type": "S_xxxx",
        "encoding": "mp3",
        "speed_ratio": 1
    },
    "request": {
        "reqid": "uuid",
        "text": "字节跳动语音合成",
        "operation": "query"
    }
}

返回参数

字段

含义

层级

格式

备注

reqid

请求 ID

1

string

请求 ID,与传入的参数中 reqid 一致

code

请求状态码

1

int

错误码,参考下方说明

message

请求状态信息

1

string

错误信息

sequence

音频段序号

1

int

负数表示合成完毕

data

合成音频

1

string

返回的音频数据,base64 编码

addition

额外信息

1

string

额外信息父节点

duration

音频时长

2

string

返回音频的长度,单位ms

响应示例

{
    "reqid": "reqid",
    "code": 3000,
    "operation": "query",
    "message": "Success",
    "sequence": -1,
    "data": "base64 encoded binary data",
    "addition": {
        "duration": "1960"
    }
}

返回码说明

错误码

错误描述

举例

建议行为

3000

请求正确

正常合成

正常处理

3001

无效的请求

一些参数的值非法,比如operation配置错误

检查参数

3003

并发超限

超过在线设置的并发阈值

重试;使用sdk的情况下切换离线

3005

后端服务忙

后端服务器负载高

重试;使用sdk的情况下切换离线

3006

服务中断

请求已完成/失败之后,相同reqid再次请求

检查参数

3010

文本长度超限

单次请求超过设置的文本长度阈值

检查参数

3011

无效文本

参数有误或者文本为空、文本与语种不匹配、文本只含标点

检查参数

3030

处理超时

单次请求超过服务最长时间限制

重试或检查文本

3031

处理错误

后端出现异常

重试;使用sdk的情况下切换离线

3032

等待获取音频超时

后端网络异常

重试;使用sdk的情况下切换离线

3040

后端链路连接错误

后端网络异常

重试

3050

音色不存在

检查使用的voice_type代号

检查参数

常见错误返回说明

  1. 错误返回:

    "message": "quota exceeded for types: xxxxxxxxx_lifetime"
    错误原因:试用版用量用完了,需要开通正式版才能继续使用

  2. 错误返回:

"message": "quota exceeded for types: concurrency"
错误原因:并发超过了限定值,需要减少并发调用情况或者增购并发

  1. 错误返回:

    "message": "Fail to feed text, reason Init Engine Instance failed"
    错误原因:voice_type / cluster 传递错误

  2. 错误返回:

"message": "illegal input text!"
错误原因:传入的text无效,没有可合成的有效文本。比如全部是标点符号或者emoji表情,或者使用中文音色时,传递日语,以此类推。多语种音色,也需要使用language指定对应的语种

  1. 错误返回:

"message": "authenticate request: load grant: requested grant not found"
错误原因:鉴权失败,需要检查appid&token的值是否设置正确,同时,鉴权的正确格式为
headers["Authorization"] = "Bearer;${token}"

查询接口

API接入说明

访问鉴权

  1. 鉴权方式说明 公共参数--API签名调用指南-火山引擎 (volcengine.com)

线上请求地址域名 open.volcengineapi.com

  1. 固定公共参数
Region = "cn-north-1"
Service = "speech_saas_prod"
Version = "2023-11-07"
解释
  1. AKSK获取 访问控制-火山引擎 (volcengine.com)

说明:Access Key(密钥)管理--API访问密钥(Access Key)-火山引擎 (volcengine.com)

  1. 调用方式
    1. SDK SDK概览--API签名调用指南-火山引擎 (volcengine.com)
    2. 直接签名后调用

结合文档内api说明调用 ListMegaTTSTrainStatus 的例子(*其他语言和使用sdk调用的方式请参考火山鉴权源码说明 一)

  1. 示例代码:
sign.go
未知大小
sign.py
未知大小
sign.java
未知大小

错误码

  1. 2xx 开头的HTTP返回状态码被可以认为是错误
  2. 错误的HTTP返回结构体如下
{
    "ResponseMetadata": 
    {
        "RequestId": "20220214145719010211209131054BC103", // header中的X-Top-Request-Id参数
        "Action": "ListMegaTTSTrainStatus",
        "Version": "2023-11-07",
        "Service": "{Service}",// header中的X-Top-Service参数
        "Region": "{Region}", // header中的X-Top-Region参数
        "Error": 
        {
            "Code": "InternalError.NotCaptured",
            "Message": "xxx"
        }
    }
}
  1. "ResponseMetadata.Error.Code" 客户端可以依照这个字段判断错误种类,已知种类和含义如下

Code

Description

OperationDenied.InvalidSpeakerID

账号或AppID无权限操作或无法操作SpeakerID列表中的一个或多个实例

OperationDenied.InvalidParameter

请求体字段不合法(缺失必填字段、类型错误等)

InternalError.NotCaptured

未知的服务内部错误

API列表

查询 SpeakerID 状态信息 ListMegaTTSTrainStatus

接口说明

查询已购买的音色状态信息,支持按SpeakerIDsState过滤。
如果查询条件为空,返回账号的AppID下所有的列表(音色超过1000,强烈建议使用分页接口BatchListMegaTTSTrainStatus)。

请求方式

POST

请求参数

Parameter

Type

Must

Argument type

Description

Content-Type

string

Y

header

固定字符串: application/json; charset=utf-8

Action

string

Y

query

ListMegaTTSTrainStatus

Version

string

Y

query

2023/11/7

AppID

string

Y

body

AppID

SpeakerIDs

[]string

N

body

SpeakerID的列表,如果忽略SpeakerIDs查询数据,强烈建议使用分页接口:BatchListMegaTTSTrainStatus

State

string

N

body

音色状态,支持取值:Unknown、Training、Success、Active、Expired、Reclaimed
详见附录:State状态枚举值

返回数据

{
          "ResponseMetadata": {
              "RequestId": "20220214145719010211209131054BC103", // header中的X-Top-Request-Id参数
              "Action": "",
              "Version": "",
              "Service": "{Service}",// header中的X-Top-Service参数
              "Region": "{Region}" // header中的X-Top-Region参数
          },
          "Result":{
                  "Statuses": [
                         {
                              "CreateTime": 1700727790000, // unix epoch格式的创建时间,单位ms
                              "DemoAudio": "https://example.com", // http demo链接
                              "InstanceNO": "Model_storage_meUQ8YtIPm", // 火山引擎实例number
                              "IsActivable": true, // 是否可激活
                              "SpeakerID": "S_VYBmqB0A", // speakerID
                              "State": "Success", // speakerID的状态
                              "Version": "V1", // speakerID已训练过的次数
                              "ExpireTime": 1732895999000, //过期时间
                              "Alias": "", //别名,和控制台同步
                              "AvailableTrainingTimes": 9 //剩余训练次数,激活音色为0
                        },
                        {
                              "SpeakerID": "S_VYBmqB0B", // speakerID
                              "State": "Unknown", // speakerID的状态
                        }
                  ]
          }
      }

分页查询SpeakerID状态 BatchListMegaTTSTrainStatus

接口说明

查询已购买的音色状态;相比ListMegaTTSTrainStatus 增加了分页相关参数和返回;支持使用token和声明页数两种分页方式;其中,

  • 分页token在最后一页为空
  • 分页token采用私有密钥进行加密
  • 分页接口为新接口,不影响已有接口行为

请求方式

POST

请求参数

Parameter

Type

Must

Argument type

Description

Content-Type

Y

header

固定字符串: application/json; charset=utf-8

Action

string

Y

query

BatchListMegaTTSTrainStatus

Version

string

Y

query

2023/11/7

AppID

string

Y

body

AppID

SpeakerIDs

[]string

N

body

SpeakerID的列表,传空为返回指定APPID下的全部SpeakerID

State

string

N

body

音色状态,支持取值:Unknown、Training、Success、Active、Expired、Reclaimed
详见附录:State状态枚举值

PageNumber

int

N

body

页数, 需大于0, 默认为1

PageSize

int

N

body

每页条数, 必须在范围[1, 100]内, 默认为10

NextToken

string

N

body

上次请求返回的字符串; 如果不为空的话, 将覆盖PageNumber及PageSize的值

MaxResults

int

N

body

与NextToken相配合控制返回结果的最大数量; 如果不为空则必须在范围[1, 100]内, 默认为10

返回数据

{
    "ResponseMetadata": 
    {
        "RequestId": "20220214145719010211209131054BC103", // header中的X-Top-Request-Id参数
        "Action": "BatchListMegaTTSTrainStatus",
        "Version": "2023-11-07",
        "Service": "{Service}",// header中的X-Top-Service参数
        "Region": "{Region}" // header中的X-Top-Region参数},
        "Result":
        {
            "AppID": "xxx",
            "TotalCount": 2, // speakerIDs总数量
            "NextToken": "", // NextToken字符串,可发送请求后面的结果; 如果没有更多结果将为空
            "PageNumber": 1, // 使用分页参数时的当前页数
            "PageSize": 2, // 使用分页参数时当前页包含的条数
            "Statuses": 
            [
                {
                    "CreateTime": 1700727790000, // unix epoch格式的创建时间,单位ms
                    "DemoAudio": "https://example.com", // http demo链接
                    "InstanceNO": "Model_storage_meUQ8YtIPm", // 火山引擎实例Number
                    "IsActivable": true, // 是否可激活
                    "SpeakerID": "S_VYBmqB0A", // speakerID
                    "State": "Success", // speakerID的状态
                    "Version": "V1" // speakerID已训练过的次数
                },
                {
                    "SpeakerID": "S_VYBmqB0B", // speakerID
                    "State": "Unknown", // speakerID的状态
                    "Version": "V1" // speakerID已训练过的次数
                }
            ]
        }
}

附录

State状态枚举值

State

Description

Unknown

SpeakerID尚未进行训练

Training

声音复刻训练中(长时间处于复刻中状态请联系火山引擎技术人员)

Success

声音复刻训练成功,可以进行TTS合成

Active

已激活(无法再次训练)

Expired

火山控制台实例已过期或账号欠费

Reclaimed

火山控制台实例已回收