Skip to content

Repository files navigation

TRTC-ASR Python SDK

基于 TRTC 鉴权体系的语音识别(ASR)Python SDK,支持实时语音识别(WebSocket)、一句话识别(HTTP)和录音文件识别(异步 HTTP)三种模式。

其他语言 SDK:Go | Node.js | Java | Rust | C++

安装

集成到你的项目中(推荐):

pip install git+https://github.com/Tencent-RTC/trtc-asr-sdk-python.git

clone 后运行示例

git clone https://github.com/Tencent-RTC/trtc-asr-sdk-python.git
cd trtc-asr-sdk-python
pip install -r requirements.txt

要求:Python >= 3.8

快速开始

importasynciofromtrtc_asrimportCredential, SITE_INTL, SpeechRecognizer, SpeechRecognitionListener, SpeechRecognitionResponse# 只需实现关心的回调;其余事件沿用基类空实现即可。classMyListener(SpeechRecognitionListener):
defon_sentence_end(self, response: SpeechRecognitionResponse) ->None:
print(f"Sentence end: {response.result.voice_text_str}")
defon_fail(self, response, error: Exception) ->None:
print(f"Failed: {error}")
asyncdefmain():
# 1. 创建凭证credential=Credential(
app_id=1300403317, # 腾讯云 APPIDsdk_app_id=1400188366, # TRTC SDKAppIDsecret_key="your-sdk-secret-key", # SDK密钥
)
# credential.set_site(SITE_INTL) # 国际站;不调用则走国内站# 2. 创建识别器listener=MyListener()
recognizer=SpeechRecognizer(credential, "16k_zh", listener)
# 3. 可选配置# recognizer.set_hotword_id("hotword-id") # 设置热词# recognizer.set_vad_silence_time(500) # VAD 静音时间# 4. 启动识别awaitrecognizer.start()
# 5. 发送音频数据withopen("audio.pcm", "rb") asf:
whileTrue:
chunk=f.read(6400) # 200ms of 16kHz 16bit mono PCMifnotchunk:
breakawaitrecognizer.write(chunk)
awaitasyncio.sleep(0.2) # 模拟实时# 6. 停止识别awaitrecognizer.stop()
asyncio.run(main())

一句话识别

fromtrtc_asrimportCredentialfromtrtc_asr.sentence_recognizerimportSentenceRecognizer# 1. 创建凭证credential=Credential(
app_id=0, # 腾讯云 APPIDsdk_app_id=0, # TRTC SDKAppIDsecret_key="your-sdk-secret-key", # SDK密钥
)
# 2. 创建一句话识别器recognizer=SentenceRecognizer(credential)
# 3. 从本地文件识别(自动 base64 编码)withopen("audio.pcm", "rb") asf:
data=f.read()
result=recognizer.recognize_data(data, "pcm", "16k_zh_en")
print(f"识别结果: {result.result}")
print(f"音频时长: {result.audio_duration} ms")
# 或者从 URL 识别# result = recognizer.recognize_url("https://example.com/audio.wav", "wav", "16k_zh_en")

录音文件识别

fromtrtc_asrimportCredentialfromtrtc_asr.file_recognizerimportFileRecognizer# 1. 创建凭证credential=Credential(
app_id=0, # 腾讯云 APPIDsdk_app_id=0, # TRTC SDKAppIDsecret_key="your-sdk-secret-key", # SDK密钥
)
# 2. 创建录音文件识别器recognizer=FileRecognizer(credential)
# 3. 提交识别任务(本地文件)withopen("audio.wav", "rb") asf:
data=f.read()
task_id=recognizer.create_task_from_data(data, "16k_zh_en")
print(f"任务已提交: {task_id}")
# 4. 轮询等待结果(默认 1 秒间隔,10 分钟超时)status=recognizer.wait_for_result(task_id)
print(f"识别结果: {status.result}")
print(f"音频时长: {status.audio_duration:.2f} s")
# 或者从 URL 提交(支持更大文件,≤1GB / ≤12h)# task_id = recognizer.create_task_from_url("https://example.com/audio.wav", "16k_zh_en")# 或者自定义轮询间隔(秒)# status = recognizer.wait_for_result_with_interval(task_id, 2.0, 1800.0)

前提条件

使用本 SDK 前,您需要准备三个凭证:AppIDSDKAppIDSecretKey。国内站与国际站的账号体系不同,请按您的站点参照官方快速接入指南完成注册、创建应用与服务开通:

  • 国内站快速接入指南 — 注册腾讯云账号并完成实名认证 → 在 TRTC 控制台创建应用 → 开通「AI 智能识别」(体验版可免费试用)
  • 国际站Quick Start — 在 trtc.io 注册(自动开通 Tencentcloud 账号,无需实名认证)→ 在 console.trtc.io 创建应用 → 开通「AI Speech Recognition」(仅 RTC Engine Lite 及以上包月套餐,Free Trial 不支持)

注意:国际站的 AppID 不在 trtc.io 控制台显示,需在 Tencentcloud 控制台「账号信息」页查看(头像 → Account Information);SDKAppIDSecretKey 均在应用详情页获取。

协议说明

WebSocket 连接

  • 连接地址
    • 国内站:wss://asr.cloud-rtc.com/asr/v2/<appid>?{请求参数}
    • 国际站:wss://asr-intl.cloud-rtc.com/asr/v2/<appid>?{请求参数}credential.set_site(SITE_INTL)

其中 <appid> 为腾讯云账号的 APPID,国内站可通过 API 密钥管理页面 获取,国际站见 Tencentcloud 控制台「账号信息」。

鉴权方式

鉴权信息携带在 URL query 参数中(浏览器原生 WebSocket 无法自定义 header,因此走 query 传递):

参数说明
sdkappidTRTC 应用 ID,从 TRTC 控制台获取(国内站 / 国际站
usersigTRTC 签名,计算文档,UserID 等于 voice_id

两者均由 SDK 自动填充,用户无需关心。

请求参数

参数必填类型说明
secretidStringSDK 内部自动用 APPID 填充
sdkappidIntegerTRTC 应用 ID,SDK 内部自动填充
usersigStringTRTC 签名,SDK 内部自动生成(值与 signature 一致)
timestampInteger当前 UNIX 时间戳(秒)
expiredInteger签名有效期截止时间戳,必须大于 timestamp
nonceInteger随机正整数,最长10位
engine_model_typeString引擎类型:8k_zh(中文电话)、16k_zh(中文通用)、16k_zh_en(中英文)
voice_idString音频流全局唯一标识(推荐 UUID),最长128位
voice_formatInteger语音编码:1 PCM(默认)
needvadInteger0 关闭 VAD,1 开启(默认)
hotword_idString热词表 ID
hotword_listString临时热词列表:`词1
customization_idString自学习模型 ID
replace_text_idString替换词表 ID
filter_dirtyInteger过滤脏词:0 不过滤,1 过滤,2 替换为 *
filter_modalInteger过滤语气词:0 不过滤,1 部分,2 严格
filter_puncInteger过滤句末句号:0 不过滤,1 过滤
filter_empty_resultInteger空结果回调:0 回调,1 不回调(服务端默认)
convert_num_modeInteger数字转换:0 不转,1 智能转换(默认),3 数学转换
word_infoInt显示词级时间:0 不显示,1 显示,2 含标点
vad_silence_timeInteger静音断句阈值(ms),范围 240-2000,默认 800
vad_levelIntegerVAD 场景档:0 高召回,1 远场过滤(服务端默认)
noise_thresholdFloatVAD 噪声微调,范围 0.0-4.0;设置后覆盖 vad_level 档位
max_speak_timeInteger强制断句时间(ms),范围 5000-90000,默认 60000
input_sample_rateInteger输入 PCM 采样率,仅支持 8000(8k 音频喂 16k 引擎)
speaker_diarizationInteger说话人分离:0 关闭(默认),1 匿名聚类,3 声纹角色认证
speaker_numberInteger说话人数量提示(分离开启时生效,用于在线聚类);0 自动检测
speaker_rolesString临时声纹角色 JSON 数组,仅 speaker_diarization=3,如 [{"RoleName":"teacher","AudioUrl":"https://.../a.wav"}]
voiceprintidsString已注册声纹 ID JSON 数组,仅 speaker_diarization=3
languageString指定识别语言(如 zhen),留空为自动检测
signatureString接口签名参数,值与 usersig 一致

实时识别响应

字段类型说明
code / messageInteger / String错误码与提示,0 表示成功
voice_id / message_idString音频流 ID / 单条消息 ID
finalInteger1 表示会话结束包
result.slice_typeInteger0 句子开始,1 中间结果,2 句末稳定结果
result.indexInteger句子序号
result.start_time / end_timeInteger当前结果起止时间(ms)
result.voice_text_strString当前结果文本
result.word_size / word_listInteger / Array词级(字级)时间戳,需 word_info != 0
result.speaker_segmentsArray说话人分段,开启说话人分离后返回
result.languageString识别语言(引擎上报时)
result.finish_silence_msInteger触发断句的尾部静音时长(ms)
result.last_token_runtime_msInteger末字服务端解码耗时(ms)

说话人分离(实时)

开启 speaker_diarization 后,说话人归属通过两个入口返回:

  • result.speaker_segments[]推荐入口。一个 result 可能包含多个说话人,句子级归属天然有歧义,因此协议按说话人切段返回。len(speaker_segments) == 1 即为单说话人句。
  • result.word_list[].speaker_id:字级归属,需同时设置 word_info != 0

speaker_id 语义:会话内有效,从 1 开始编号,-1 表示未知,0 为保留值。

speaker_segments[] 字段:

字段类型说明
speaker_idInteger说话人编号
speaker_nameString角色名,仅 speaker_diarization=3 命中注册声纹时返回,等于请求侧 RoleName
start_time / end_timeInteger该分段起止时间(ms)
textString该分段文本
word_start / word_endInteger对应 word_list 的闭区间下标,即 word_list[word_start:word_end+1]word_info=0 时不返回
stable_flagInteger该分段是否稳定:1 稳定,0 非稳定

Python 用法示例:

fromtrtc_asrimportCredential, SpeechRecognizer, SpeechRecognitionListener, SPEAKER_DIARIZATION_CLUSTERrecognizer=SpeechRecognizer(credential, "16k_zh", MyListener())
recognizer.set_word_info(1) # 需要字级说话人时开启recognizer.set_speaker_diarization(SPEAKER_DIARIZATION_CLUSTER) # 1:匿名聚类# 声纹角色认证(返回角色名):# recognizer.set_speaker_diarization(SPEAKER_DIARIZATION_VOICEPRINT) # 3# recognizer.set_speaker_roles([SpeakerRole(role_name="teacher", audio_url="https://example.com/teacher.wav")])# recognizer.set_voiceprint_ids(["vp-1"]) # 已注册声纹# recognizer.set_speaker_number(2) # 0 = 自动检测;两种分离模式都生效# 回调里读取:defon_sentence_end(self, response):
forseginresponse.result.speaker_segments:
name=seg.speaker_name# speaker_diarization=3 才有ifnotname:
name=f"spk{seg.speaker_id}"print(f"[{name}] {seg.text}")

VAD 调优(noise_threshold / vad_level)

方法取值说明
set_vad_level(level)0 / 10 高召回,1 远场过滤(服务端默认)
set_noise_threshold(v)0.0 - 4.0噪声抑制微调,值越大抑制越强、召回越低;设置后覆盖 vad_level 档位
set_vad_silence_time(ms)240 - 2000静音断句阈值

两者都是三态语义:只有显式调用 setter 才会下发,因此显式传 0 与「不配置」可以区分(服务端 vad_level 默认是 1)。超出范围会在 start() 阶段本地报错,不会浪费一次连接。

一句话识别接口

  • 请求地址
    • 国内站:https://asr.cloud-rtc.com/v1/SentenceRecognition?{请求参数}
    • 国际站:https://asr-intl.cloud-rtc.com/v1/SentenceRecognition?{请求参数}
  • 请求方法:HTTP POST,Content-Type 为 application/json; charset=utf-8

鉴权方式

HTTP 接口的鉴权信息携带在请求 Header 中(与流式不同,不走 query):

Header说明
X-TRTC-SdkAppIdTRTC 应用 ID,从 TRTC 控制台获取(国内站 / 国际站
X-TRTC-UserSigTRTC 签名,UserID 等于 URL 参数中的 RequestId(SDK 内部自动生成)

URL 请求参数

参数必填类型说明
AppIdString腾讯云 APPID
SecretidStringSDK 内部自动用 APPID 填充
RequestIdString全局请求唯一 ID(UUID),用于生成 UserSig
TimestampInteger当前 UNIX 时间戳(秒)

请求体参数(JSON)

参数必填类型说明
EngSerViceTypeString引擎类型:16k_zh(中文)、16k_zh_en(中英文)
SourceTypeInteger0 URL 上传、1 本地数据(base64)
VoiceFormatString音频格式:wavpcmogg-opusmp3m4a
Data条件Stringbase64 编码的音频数据(SourceType=1 时必填)
DataLen条件Integer音频数据原始长度(SourceType=1 时必填)
Url条件String音频 URL(SourceType=0 时必填)
WordInfoInteger词级时间:0 不显示、1 显示、2 含标点
FilterDirtyInteger脏词过滤:0 不过滤、1 过滤、2 替换
FilterModalInteger语气词过滤:0 不过滤、1 部分、2 严格
FilterPuncInteger标点过滤:0 不过滤、2 过滤全部
ConvertNumModeInteger数字转换:0 不转、1 智能转换(默认)
HotwordIdString热词表 ID
HotwordListString临时热词列表
CustomizationIdString自学习模型 ID
InputSampleRateIntegerPCM 输入采样率(仅 PCM 格式,支持 8000)
LanguageString指定识别语言,留空为自动检测

限制:音频时长 ≤ 60s,文件大小 ≤ 3MB,单账号并发 ≤ 30次/秒

录音文件识别接口

录音文件识别是异步接口,适用于较长音频(≤12h)。工作流程为:提交任务 → 轮询结果。

创建任务:CreateRecTask

  • 请求地址
    • 国内站:https://asr.cloud-rtc.com/v1/CreateRecTask?{请求参数}
    • 国际站:https://asr-intl.cloud-rtc.com/v1/CreateRecTask?{请求参数}
  • 请求方法:HTTP POST,Content-Type 为 application/json; charset=utf-8
  • 并发限制:默认 20次/秒

鉴权方式(Header 中的 X-TRTC-SdkAppId / X-TRTC-UserSig)与 URL 请求参数(AppId、Secretid、RequestId、Timestamp)均与一句话识别相同。

请求体参数(JSON)
参数必填类型说明
EngineModelTypeString引擎类型:16k_zh(中文)、16k_zh_en(中英文)
ChannelNumInteger声道数:1 单声道;2 双声道(8k 电话,自动区分说话人并返回 ChannelId:1=左/2=右)
ResTextFormatInteger结果格式:0 基础、1 含词级时间、2 含标点时间
SourceTypeInteger0 URL 上传、1 本地数据(base64)
Url条件String音频 URL(SourceType=0,时长≤12h,大小≤1GB)
Data条件Stringbase64 编码音频数据(SourceType=1,大小≤5MB)
DataLen条件Integer音频数据原始长度(SourceType=1)
CallbackUrlString回调 URL,任务完成后 POST 结果
FilterDirtyInteger脏词过滤
FilterModalInteger语气词过滤
FilterPuncInteger标点过滤
ConvertNumModeInteger数字转换
HotwordIdString热词表 ID
HotwordListString临时热词列表
CustomizationIdString自学习模型 ID
ReplaceTextIdString替换词表 ID
LanguageString指定识别语言,留空为自动检测
SpeakerDiarizationInteger说话人分离:0 关闭(默认),1 匿名聚类,3 声纹角色认证
SpeakerNumberInteger说话人数量提示,0 自动检测
SpeakerRolesArray临时声纹角色,元素含 RoleNameAudioUrl,仅 SpeakerDiarization=3
VoiceprintIdsArray已注册声纹 ID 列表,仅 SpeakerDiarization=3
VadSilenceMsInteger静音断句阈值(ms)
VadLevelIntegerVAD 场景档:0 高召回(默认),1 远场过滤
NoiseThresholdFloatVAD 噪声微调,范围 0.0-4.0;设置后覆盖 VadLevel 档位

VadLevel / NoiseThreshold 在 Python 结构体里是 Optionalvad_level=None / noise_threshold=None),因为 0 是合法取值,用 None 才能区分「显式传 0」与「不配置」。

响应

返回 RecTaskId(任务 ID),用于后续查询。任务有效期 24 小时。

查询结果:DescribeTaskStatus

  • 请求地址
    • 国内站:https://asr.cloud-rtc.com/v1/DescribeTaskStatus?{请求参数}
    • 国际站:https://asr-intl.cloud-rtc.com/v1/DescribeTaskStatus?{请求参数}
  • 请求方法:HTTP POST
  • 并发限制:默认 50次/秒
请求体参数(JSON)
参数必填类型说明
RecTaskIdStringCreateRecTask 返回的任务 ID
响应(TaskStatus)
字段类型说明
RecTaskIdString任务 ID
StatusInteger0 等待、1 执行中、2 成功、3 失败
StatusStrStringwaiting / executing / success / failed
ProgressInteger处理进度(0-100)
ResultString识别结果文本
ErrorMsgString失败原因
ResultDetailArray句级详细结果(含词级时间偏移)
AudioDurationFloat音频时长(秒)

ResultDetail[] 中与说话人相关的字段:

字段类型说明
SpeakerIdInteger说话人编号,开启 SpeakerDiarization 后返回
SpeakerRoleNameString角色名,SpeakerDiarization=3 命中注册声纹时返回
ChannelIdInteger双声道(ChannelNum=2)时的声道编号:1=左、2=右;此场景下优先用它区分说话人
LanguageString该句识别语言(引擎上报时)

凭证获取

参数国内站国际站说明
app_idCAM 密钥管理Tencentcloud 控制台「账号信息」(trtc.io 不显示)腾讯云账号 APPID,用于 URL 路径
sdk_app_idTRTC 控制台 > 应用管理console.trtc.io > 应用详情TRTC 应用 ID
secret_keyTRTC 控制台 > 应用概览 > SDK密钥console.trtc.io > 应用详情用于生成 UserSig,不会传输到网络

配置项

实时语音识别(SpeechRecognizer):

方法说明默认值
set_voice_format(f)音频格式1 (PCM)
set_need_vad(v)是否开启 VAD1 (开启)
set_convert_num_mode(m)数字转换模式1 (智能)
set_hotword_id(id)热词表 ID-
set_hotword_list(list)临时热词列表 词|权重,...-
set_customization_id(id)自学习模型 ID-
set_replace_text_id(id)替换词表 ID-
set_filter_dirty(m)脏词过滤0 (关闭)
set_filter_modal(m)语气词过滤0 (关闭)
set_filter_punc(m)句号过滤0 (关闭)
set_filter_empty_result(m)空结果是否回调1 (不回调)
set_word_info(m)词级/字级时间0 (关闭)
set_vad_silence_time(ms)VAD 静音阈值(240-2000)800ms
set_vad_level(level)VAD 场景档:0 高召回 / 1 远场过滤1
set_noise_threshold(v)VAD 噪声微调(0.0-4.0),覆盖场景档未设置
set_max_speak_time(ms)强制断句时间(5000-90000)60000ms
set_input_sample_rate(r)输入 PCM 采样率,仅 8000-
set_speaker_diarization(m)说话人分离:0 关 / 1 聚类 / 3 声纹角色0 (关闭)
set_speaker_number(n)说话人数量提示(分离开启时生效)0 (自动)
set_speaker_roles(roles)临时声纹角色(仅模式 3)-
set_voiceprint_ids(ids)已注册声纹 ID(仅模式 3)-
set_language(lang)指定识别语言自动检测
set_voice_id(id)自定义 voice_id自动 UUID

引擎模型

类型说明
8k_zh中文通用,常用于电话场景
16k_zh中文通用(推荐)
16k_zh_en中英文通用

示例

完整示例请参见:

运行示例:

git clone https://github.com/Tencent-RTC/trtc-asr-sdk-python.git
cd trtc-asr-sdk-python
pip install -r requirements.txt
# 实时语音识别
python examples/realtime_asr.py -f examples/test.pcm
# 一句话识别
python examples/sentence_asr.py -f examples/test.pcm
# 录音文件识别
python examples/file_asr.py -f examples/test.wav
# 说话人分离(实时:匿名聚类 + 字级说话人)
python examples/realtime_asr.py -f examples/test.pcm --diarization 1 --word-info 1
# 说话人分离(实时:声纹角色认证,返回角色名)
python examples/realtime_asr.py -f examples/test.pcm --diarization 3 \
--roles "teacher=https://example.com/teacher.wav,student=https://example.com/student.wav"# VAD 调优(远场过滤 + 噪声阈值)
python examples/realtime_asr.py -f examples/test.pcm --vad-level 1 --noise-threshold 1.5
# 说话人分离(录音文件)
python examples/file_asr.py -u https://example.com/call.wav --diarization 1
# 查看所有选项
python examples/realtime_asr.py -h
python examples/sentence_asr.py -h

项目结构

trtc-asr-sdk-python/
├── trtc_asr/ # 包源码
│ ├── __init__.py # 包入口,统一导出
│ ├── credential.py # 凭证管理(APPID + SDKAppID + SDK密钥)
│ ├── usersig.py # TRTC UserSig 生成
│ ├── signature.py # URL 请求参数构建
│ ├── speech_recognizer.py # 实时语音识别器(WebSocket)
│ ├── params.py # 说话人分离 / VAD 调优参数校验
│ ├── sentence_recognizer.py # 一句话识别器(HTTP)
│ ├── file_recognizer.py # 录音文件识别器(异步 HTTP)
│ └── errors.py # 错误定义
├── examples/ # 示例代码
│ ├── test.pcm # 测试音频文件
│ ├── realtime_asr.py # 实时语音识别示例
│ ├── sentence_asr.py # 一句话识别示例
│ └── file_asr.py # 录音文件识别示例
├── tests/ # 测试
│ ├── test_signature.py # 签名参数测试
│ ├── test_signature_speaker.py # 说话人分离 / VAD 调优参数测试
│ ├── test_params.py # 参数校验测试
│ ├── test_diarization.py # 说话人分离端到端测试
│ ├── test_recognizer_lifecycle.py # 生命周期健壮性测试
│ ├── test_sentence_recognizer.py # 一句话识别测试
│ └── test_file_recognizer.py # 录音文件识别测试
├── pyproject.toml # 包定义
├── setup.py # 兼容安装
└── .gitignore

常见问题

APPID 和 SDKAppID 有什么区别?

  • APPID(如 13xxxxxxxx):腾讯云账号级别的 ID,用于 WebSocket URL 路径;国内站从 CAM 密钥管理 获取,国际站见 Tencentcloud 控制台「账号信息」
  • SDKAppID(如 14xxxxxxxx):TRTC 应用级别的 ID,用于鉴权(SDK 自动填入 URL query 的 sdkappid);国内站从 TRTC 控制台 获取,国际站从 console.trtc.io 获取

UserSig 是什么?

UserSig 是基于 SDKAppID 和 SDK 密钥计算的签名,用于 TRTC 服务鉴权。SDK 会自动生成,无需手动计算。详见鉴权文档

signature 参数怎么计算?

根据协议,signatureusersig 的值都等于 UserSig,SDK 内部自动处理,用户无需关心。

支持哪些音频格式?

  • 实时语音识别:支持 PCM 格式(voice_format=1),建议 16kHz、16bit、单声道
  • 一句话识别:支持 wav、pcm、ogg-opus、mp3、m4a,音频时长 ≤ 60s,文件 ≤ 3MB
  • 录音文件识别:支持 wav、ogg-opus、mp3、m4a,本地文件 ≤ 5MB,URL ≤ 1GB / ≤ 12h

License

MIT License

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages