Install
openclaw skills install @thcjp/azure-transcriptionopenclaw skills install @thcjp/azure-transcriptionimport os
from azure.ai.transcription import TranscriptionClient
client = TranscriptionClient(
endpoint=os.environ["TRANSCRIPTION_ENDPOINT"],
credential=os.environ["TRANSCRIPTION_KEY"]
)
# 实时流式转写
stream = client.begin_stream_transcription(locale="zh-CN")
# 发送音频文件进行实时转写
stream.send_audio_file("realtime_audio.wav")
# 接收实时转写结果
for event in stream:
if event.is_partial:
print(f"[实时] {event.text}", end="\r")
else:
print(f"[完成] {event.text}")
执行批量转写队列管理操作,处理输入数据并返回结果
验证执行结果,确认输出符合预期格式
参考批量转写队列管理相关配置参数进行设置
执行实时流式转写操作,处理输入数据并返回结果
验证执行结果,确认输出符合预期格式
参考实时流式转写相关配置参数进行设置
# 启用说话人分离的批量转写
job = client.begin_transcription(
name="meeting-with-diarization",
locale="zh-CN",
content_urls=["https://<storage>/meeting.wav"],
diarization_enabled=True,
diarization_config={
"max_speakers": 5,
"enabled": True
}
)
result = job.result()
# 输出带说话人标识的转写结果
for segment in result.segments:
speaker = segment.speaker # 说话人标识: Speaker1, Speaker2, ...
print(f"[{speaker}] [{segment.start_time:.1f}s-{segment.end_time:.1f}s] {segment.text}")
输入: 用户提供说话人分离(Diarization)所需的指令和必要参数。 处理: 按照skill规范执行说话人分离(Diarization)操作,遵循单一意图原则。
说话人分离(Diarization)操作,处理输入数据并返回结果说话人分离(diarization) 选项import os
from concurrent.futures import ThreadPoolExecutor, as_completed
from azure.ai.transcription import TranscriptionClient
class BatchTranscriptionManager:
def __init__(self, endpoint, key, max_workers=5):
self.client = TranscriptionClient(endpoint=endpoint, credential=key)
self.max_workers = max_workers
self.results = []
self.failed = []
def submit_transcription(self, audio_url, name, locale="zh-CN",
diarization=True, callback=None):
"""提交单个转写任务"""
try:
job = self.client.begin_transcription(
name=name,
locale=locale,
content_urls=[audio_url],
diarization_enabled=diarization
)
result = job.result()
output = {
'name': name,
'status': result.status,
'transcript': result.transcript,
'segments': result.segments if hasattr(result, 'segments') else []
}
self.results.append(output)
if callback:
callback(output)
return output
except Exception as e:
self.failed.append({'name': name, 'error': str(e)})
return None
def batch_transcribe(self, audio_files, locale="zh-CN", diarization=True):
"""批量转写"""
with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
futures = []
for audio in audio_files:
future = executor.submit(
self.submit_transcription,
audio['url'], audio['name'], locale, diarization
)
futures.append(future)
for future in as_completed(futures):
future.result()
return {'success': self.results, 'failed': self.failed}
def export_results(self, format='srt', output_dir='./transcripts'):
"""导出转写结果"""
os.makedirs(output_dir, exist_ok=True)
for result in self.results:
if format == 'srt':
self._export_srt(result, output_dir)
elif format == 'vtt':
self._export_vtt(result, output_dir)
elif format == 'json':
self._export_json(result, output_dir)
def _export_srt(self, result, output_dir):
path = os.path.join(output_dir, f"{result['name']}.srt")
with open(path, 'w', encoding='utf-8') as f:
for i, seg in enumerate(result['segments'], 1):
start = self._format_time(seg.start_time)
end = self._format_time(seg.end_time)
speaker = f"[{seg.speaker}] " if hasattr(seg, 'speaker') else ""
f.write(f"{i}\n{start} --> {end}\n{speaker}{seg.text}\n\n")
def _format_time(self, seconds):
h = int(seconds // 3600)
m = int((seconds % 3600) // 60)
s = int(seconds % 60)
ms = int((seconds % 1) * 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
批量转写队列管理操作,处理输入数据并返回结果批量转写队列管理 选项本skill还覆盖以下能力场景: 企业级语音转写工、支持实时流式转写、批量处理与自定义、语音转写专业版、面向企业团队与专、业用户的高级语音、转写工具、核心能力、实时流式语音转写、支持麦克风输入与、流式音频、自动识别不同说话、支持大规模音频文、件处理、自定义语音模型集、提升专业领域识别、准确率、多语言混合转写。这些能力在上述核心功能中均有对应处理逻辑。
企业会议系统实时生成字幕与会议纪要。
# 会议实时字幕系统
meeting_manager = BatchTranscriptionManager(
endpoint=os.environ["TRANSCRIPTION_ENDPOINT"],
key=os.environ["TRANSCRIPTION_KEY"]
)
# 实时流式转写会议音频
stream = client.begin_stream_transcription(locale="zh-CN")
print("=== 会议实时字幕 ===")
for event in stream:
if not event.is_partial:
timestamp = event.timestamp
print(f"[{timestamp}] {event.text}")
# 会后批量处理录音(带说话人分离)
meeting_manager.submit_transcription(
audio_url="https://<storage>/meetings/full_meeting.wav",
name="quarterly-review-20260118",
locale="zh-CN",
diarization=True
)
客服中心批量转写通话录音,用于质检与分析。
# 批量转写客服通话
manager = BatchTranscriptionManager(
endpoint=os.environ["TRANSCRIPTION_ENDPOINT"],
key=os.environ["TRANSCRIPTION_KEY"],
max_workers=5
)
# 定义批量任务
call_recordings = [
{"url": "https://<storage>/calls/call_001.wav", "name": "call_001"},
{"url": "https://<storage>/calls/call_002.wav", "name": "call_002"},
{"url": "https://<storage>/calls/call_003.wav", "name": "call_003"},
{"url": "https://<storage>/calls/call_004.wav", "name": "call_004"},
{"url": "https://<storage>/calls/call_005.wav", "name": "call_005"},
]
# 批量转写(启用说话人分离)
results = manager.batch_transcribe(call_recordings, locale="zh-CN", diarization=True)
# 导出为SRT格式
manager.export_results(format='srt', output_dir='./call_transcripts')
print(f"成功: {len(results['success'])}, 失败: {len(results['failed'])}")
视频平台批量生成多语言字幕。
# 多语言字幕生成
video_manager = BatchTranscriptionManager(
endpoint=os.environ["TRANSCRIPTION_ENDPOINT"],
key=os.environ["TRANSCRIPTION_KEY"],
max_workers=3
)
# 中文视频生成中文字幕
chinese_videos = [
{"url": "https://<storage>/videos/video_cn_01.wav", "name": "video_cn_01"},
{"url": "https://<storage>/videos/video_cn_02.wav", "name": "video_cn_02"},
]
video_manager.batch_transcribe(chinese_videos, locale="zh-CN", diarization=False)
video_manager.export_results(format='vtt', output_dir='./subtitles/zh-CN')
# 英文视频生成英文字幕
english_videos = [
{"url": "https://<storage>/videos/video_en_01.wav", "name": "video_en_01"},
{"url": "https://<storage>/videos/video_en_02.wav", "name": "video_en_02"},
]
video_manager.batch_transcribe(english_videos, locale="en-US", diarization=False)
video_manager.export_results(format='vtt', output_dir='./subtitles/en-US')
# 依赖说明
pip install azure-ai-transcription
# 配置环境变量
export TRANSCRIPTION_ENDPOINT="https://<resource>.cognitiveservices.azure.com"
export TRANSCRIPTION_KEY="API_KEY"
import os
from azure.ai.transcription import TranscriptionClient
client = TranscriptionClient(
endpoint=os.environ["TRANSCRIPTION_ENDPOINT"],
credential=os.environ["TRANSCRIPTION_KEY"]
)
# 启动实时转写
stream = client.begin_stream_transcription(locale="zh-CN")
stream.send_audio_file("audio.wav")
for event in stream:
print(event.text)
manager = BatchTranscriptionManager(
endpoint=os.environ["TRANSCRIPTION_ENDPOINT"],
key=os.environ["TRANSCRIPTION_KEY"]
)
results = manager.batch_transcribe(
audio_files=[{"url": "https://<storage>/audio.wav", "name": "test"}],
locale="zh-CN",
diarization=True
)
manager.export_results(format='srt')
-with-diarization: 命令参数,用于指定操作选项-review-20260118: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项-US: 命令参数,用于指定操作选项-CN: 命令参数,用于指定操作选项| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| content | string | 是 | 相关说明 |
| content | string | 否 | 相关说明, 默认: 默认值 |
| content | string | 否 | 相关说明, 可选值: json/text/markdown |
| style | string | 否 | 输出风格, 参考 references/style.md |
{
"success": true,
"data": {
result: "相关说明",
result: "相关说明",
result: "相关说明",
"metadata": {
"template_used": "reviewer",
"word_count": 0,
"style": "专业"
}
},
"error": null
}
输出模板参考: assets/output.json
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
| Python 3 | 运行时 | 必需 | python.org 下载安装 |
| azure-ai-transcription | Python SDK | 必需 | pip install azure-ai-transcription |
| Azure认知服务 | 云服务 | 必需 | Azure门户创建资源 |
| concurrent.futures | Python标准库 | 必需 | Python自带 |
TRANSCRIPTION_ENDPOINT:Azure认知服务端点URLTRANSCRIPTION_KEY:Azure认知服务订阅密钥API Key配置方式:
export API_KEY="your_api_key_here"
配置后需重启会话或开启新终端生效。API Key应妥善保管,避免泄露到版本控制系统。
| 参数 | 说明 | 免费版 | 专业版 |
|---|---|---|---|
locale | 语言代码 | 支持 | 支持 |
diarization_enabled | 说话人分离 | 不支持 | 支持 |
max_speakers | 最大说话人数 | 不支持 | 可配置 |
custom_model | 自定义模型 | 不支持 | 支持 |
profanity_filter | 敏感词过滤 | 不支持 | 支持 |
punctuation | 标点恢复 | 不支持 | 支持 |
| 格式 | 用途 | 特点 |
|---|---|---|
| 纯文本 | 文档归档 | 最简格式 |
| SRT | 视频字幕 | 带序号与时间戳 |
| VTT | Web视频字幕 | HTML5标准 |
| JSON | 程序处理 | 含完整元数据 |
实时转写延迟受网络条件影响。建议使用稳定的网络连接,并适当增大音频缓冲区。
确保音频质量良好,说话人间隔清晰。设置合理的max_speakers参数,避免过多或过少。
专业版BatchTranscriptionManager自动记录失败任务,可通过retry_failed方法重试。
在Azure门户训练自定义模型后,在转写配置中指定custom_model参数即可。
完全兼容。专业版与免费版使用相同的TRANSCRIPTION_ENDPOINT和TRANSCRIPTION_KEY配置。
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| LLM响应超时或无响应 | 网络延迟或模型负载过高 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接,执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令请求;确认Agent平台LLM服务正常 |
| 输入内容格式不正确 | 用户输入不符合skill预期格式 | 检查输入是否符合skill使用说明中的格式要求,参考示例章节 |
| 执行结果与预期不符 | 指令描述不够明确或上下文不足 | 提供更详细的指令描述,补充必要的上下文信息 |
| 命令执行失败 | 运行环境不满足要求或权限不足 | 确认运行环境符合依赖说明中的要求;检查命令权限设置 |