1. 接入准备
1.1 SDK 获取
1.2 接入须知
开发者在调用前请先查看实时说话人分离的 接口说明,了解接口的使用要求和使用步骤。
该接口需要手机能够连接网络(3G、4G、5G 或 Wi-Fi 等)
运行 Demo 必须设置 AppID、SecretID、SecretKey,可在 API 密钥管理 中获取。
1.3 开发环境
添加实时说话人分离 SDK har
"dependencies": {"qcloudrealtimespeaksep": "file:../qcloudrealtimespeaksep.har"}
注意:
需根据实际路径替换配置。
2. 快速接入
以下为 Demo 中的代码片段,完整代码请参考 SDK 交付包内的 Demo 工程。
2.1 配置识别任务
import { QCloud, SpeakSeparationBuilder } from 'qcloudrealtimespeaksep'...let builder: SpeakSeparationBuilder = new SpeakSeparationBuilder()builder.appID = this._app_idbuilder.secretID = this._secret_idbuilder.secretKey = this._secret_keybuilder.token = this._token
2.2 启动识别任务
使用上面的 Builder 可以创建并启动识别任务。说话人分离场景下,识别结果通过
onData 回调返回包含说话人信息的 JSON 数据。// 设置引擎模型类型为说话人分离专用模型builder.setApiParam(QCloud.RealTime.kEngineModelType, '16k_zh_en_speaker')this._controller = builder.build(this._source, {onData: (data: string) => {console.log(`----- ${data}`)// 解析说话人分离结果let resp = JSON.parse(data)if (resp.code == 0 && resp.sentences && resp.sentences.sentence_list) {for (let sentence of resp.sentences.sentence_list) {// sentence.speaker_id: 说话人ID// sentence.sentence: 识别文本// sentence.sentence_type: 0=非稳态(中间结果), 1=稳态(最终结果)// sentence.start_time: 开始时间(ms)// sentence.end_time: 结束时间(ms)console.log(`[Speaker${sentence.speaker_id}] ${sentence.sentence}`)}}},onSilence: () => {this._controller?.cancel()console.log(`----- silence`)},onVolume: (db) => {this._volume = db},onLogger(level, message) {console.log(`${message}`)},})
2.3 停止识别任务
停止识别任务可以通过控制器的 stop 方法停止。
this._controller!.stop()
当数据源的 empty 返回 true 时识别也会停止。
3. 主要接口类和方法说明
3.1 SpeakSeparationBuilder 类说明
SpeakSeparationBuilder 继承自
QCloud.RealTime.Builder,用于创建说话人分离识别任务。
方法
1. setApiParam(key: string, value: string | number | null): SpeakSeparationBuilder
名称 | 类型 | 描述 |
key | string | 请求后台的参数名称 |
value | string|number|null | 请求后台的参数值,null 时将删除已设置的参数,number 会转为 string 后设置 |
说明:
返回
SpeakSeparationBuilder 实例自身,支持链式调用。
2. getApiParam(key: string): string | number | null
获取已设置的请求参数。
名称 | 类型 | 描述 |
key | string | 参数名称 |
3. build(source: DataSource, listener: Listener): Controller
创建并启动识别任务同时返回识别任务控制器。
属性
名称 | 类型 | 描述 |
appID | string | 腾讯云 AppID |
secretID | string | 腾讯云临时 SecretId |
secretKey | string | 腾讯云临时 SecretKey |
token | string | |
slice | number | 分片时间,单位 ms,开启 opus 时必须为40的倍数,不建议更改此参数 |
enableOpus | boolean | 开启 opus 编码 |
enableSilence | boolean | 开启静音检测,开启后识别到静音后会触发一次静音回调,不会停止任务 |
enableDetectVolume | boolean | 开启音量检测,开启后会通过音量回调返回当前音量 |
silenceTimeout | number | 静音检测时长,开启静音检测后生效 |
loggerLevel | LoggerLevel | 日志等级,日志回调只会返回大于该等级的日志 |
saveDataPath | string | 保存音频数据路径,路径为空不生效,否则将会存储数据源读取到的音频数据到该路径 |
host | string | 自定义 WebSocket 连接的 host 地址,为空字符串时则使用默认域名 |
3.2 Controller 类说明
Controller 用于控制识别任务的流程。
属性
名称 | 类型 | 描述 |
task | Promise<void> | 识别任务,识别任务正常结束则此 Promise 正常返回,否则抛出异常 |
voice_id | string | 连接成功后的 voiceid,否则为空字符 |
方法
1. stop(): void
停止识别任务,调用此方法会向后台发送停止识别的消息,成功停止后 task 会结束。
2. cancel(): void
取消识别任务,调用此方法会取消当前识别任务,成功取消后 task 会抛出 SDKErrorImpl 类型的异常,且此异常的 code 为 CANCEL_ERROR。
3. writeContent(content: string): void
在识别过程中向服务端发送一条 string 类型的自定义文本消息(透传业务上下文/控制信令,JSON 格式,详情参考交付 Demo 源码)。消息作为 WebSocket 文本帧透传给服务端,不参与音频通道的处理。
名称 | 类型 | 描述 |
content | string | 要发送的上下文 |
调用条件: 仅在合法识别中状态下可调用:
WebSocket 已建立且首个携带 voice_id 的响应已下发
调用方尚未调用 stop()/cancel()
任务尚未因服务端 final 或错误而结束
异常说明: 校验失败会同步抛出 SDKError:
PARAMETER_ERROR: content 为空
NETWORK_ERROR: WebSocket 未就绪、任务已停止/取消/结束/失败,或底层 send 失败
3.3 Listener 类说明
Listener 类用于接收识别过程中的信息。
注意:
在说话人分离场景下,识别结果统一通过
onData 返回。属性
名称 | 类型 | 描述 |
onData? | (data: string) => void | 收到后台 WebSocket 的消息后回调该方法,返回包含说话人分离信息的 JSON 数据 |
onLogger? | (level: LoggerLevel, message: string) => void | 日志回调,Builder 的 loggerLevel 会影响此回调的内容 |
onSilence? | () => void | 静音回调,开启 Builder 的 enableSilence 后检测到静音后回调 |
onVolume? | (db: number) => void | 音量回调,开启 Builder 的 enableDetectVolume 后回调 |
onData 回调数据格式
{"code": 0,"message": "success","voice_id": "xxx","sentences": {"sentence_list": [{"sentence": "识别的文本内容","sentence_type": 1,"sentence_id": 0,"speaker_id": 0,"start_time": 0,"end_time": 3000}]}}
字段说明:
字段名 | 类型 | 描述 |
sentence | string | 识别的文本内容 |
sentence_type | number | 0=非稳态(中间结果,可能被后续结果修正),1=稳态(最终结果,不会再改变) |
sentence_id | number | 句子序号 |
speaker_id | number | 说话人 ID,用于区分不同说话人 |
start_time | number | 句子开始时间(毫秒) |
end_time | number | 句子结束时间(毫秒) |
3.4 DataSource 类说明
DataSource 类用来提供用于识别的音频数据。
属性
名称 | 类型 | 描述 |
voice_format | string | 音频编码,目前仅支持 pcm,即数据类型为16000hz,16bit,小端的 pcm 数据流 |
empty | boolean | 返回是否还有音频数据 |
start | () => Promise<void> | SDK 开始识别时会调用此方法,此方法发生的异常会通过 task 抛出 |
stop | () => Promise<void> | SDK 停止识别时会调用此方法,此方法发生的异常会通过 task 抛出 |
read | (ms: number) => Promise<ArrayBuffer> | SDK 读取音频数据,ms 为读取数据的时长,voice_format 为 pcm 时,此方法需返回40 *16 * 2长度的数据,此方法发生的异常会通过 task 抛出 |
4. 错误码
识别任务抛出类型为 SDKErrorImpl 时的错误码。
错误码 | 名称 | 描述 |
-1 | UNKNOWN_ERROR | 未知错误 |
1 | NETWORK_ERROR | 网络错误 |
2 | SERVER_ERROR | 服务端错误,详情通过 message 查看 |
3 | SIGNATURE_ERROR | 签名错误 |
4 | PARAMETER_ERROR | 参数错误,Builder 设置的参数无法创建识别任务 |
5 | CANCEL_ERROR | 取消错误,调用 cancel 方法取消任务时出现 |
6 | CREATE_FILE_ERROR | 创建文件失败 |
7 | DATA_LENGTH_ERROR | 数据源返回的数据长度不符合要求 |
5. 常见问题
5.1 speaker_context_id 的作用?
speaker_context_id 是服务端返回的声纹 ID(24h 内有效)。将上次返回的 ID 通过 setApiParam 传入下次识别任务,可使同一说话人的 ID 保持连续,适用于多轮对话场景。// 将上次识别返回的 speaker_context_id 传入下次任务builder.setApiParam('speaker_context_id', lastSpeakerContextId)
5.2 sentence_type=0 和 sentence_type=1 的区别?
sentence_type=0:中间态(非稳态),可能被后续结果修正,建议实时显示时使用灰色样式。
sentence_type=1:确定态(稳态),不会再改变,适合最终展示。
5.3 cancel 与 stop 的区别?
stop:自然结束当前识别任务,等待服务端返回最终结果后再关闭连接。
cancel:立即终止识别,不等待服务端返回任何结果,直接关闭 WebSocket 连接。