Install
openclaw skills install @thcjp/audio-stream-uploadopenclaw skills install @thcjp/audio-stream-upload核心功能: 本技能提供时使用等能力。
降低并发数至2-3个,并在请求间添加适当延迟。专业版支持自动限流检测与退避重试.
专业版支持断点续传。通过记录已上传的分片索引,重新上传时跳过已完成的分片即可.
移动端和直播场景优先HLS,Web端自适应码率播放优先DASH。如需同时覆盖两端,可配置两种格式.
bitrate单位为bits/sec,例如320kbps应写为320000,128kbps应写为128000.
是的,专业版与免费版使用相同的API密钥体系,stream-public-key和stream-secret-key完全通用.
| 操作步骤 | 手动耗时 | 自动化耗时 | 时间节约 | 准确率提升 |
|---|---|---|---|---|
| 单个音频文件上传 | 5分钟 | 1分钟 | 4分钟 | 100% |
| 批量音频文件上传(10个) | 30分钟 | 5分钟 | 25分钟 | 100% |
| 自定义编码配置调整 | 10分钟/文件 | 1分钟/文件 | 9分钟/文件 | 100% |
| 多质量预设输出 | 10分钟/文件 | 1分钟/文件 | 9分钟/文件 | 100% |
| 分片上传大文件 | 30分钟 | 5分钟 | 25分钟 | 100% |
| 对比维度 | 本技能 | 手动操作 | Python脚本 | 专业软件 |
|---|---|---|---|---|
| 批量上传能力 | 高效支持批量上传,支持队列管理 | 逐个上传,效率低 | 需编写脚本,操作复杂 | 需要购买专业软件,成本高 |
| 自定义编码配置 | 支持完全自定义编码配置 | 无法自定义,只能选择预设 | 需要编写脚本,操作复杂 | 需要购买专业软件,成本高 |
| 多质量预设输出 | 提供多质量预设,满足不同需求 | 无法实现 | 需要编写脚本,操作复杂 | 需要购买专业软件,成本高 |
| 分片上传支持 | 支持大文件分片上传,提高上传效率 | 无法实现 | 需要编写脚本,操作复杂 | 需要购买专业软件,成本高 |
| 元数据管理 | 丰富的元数据管理功能 | 无法实现 | 需要编写脚本,操作复杂 | 需要购买专业软件,成本高 |
| 痛点 | 描述 | 影响范围 | 解决方案 | 量化效果 |
|---|---|---|---|---|
| 音频上传效率低 | 手动上传单个文件耗时较长,批量上传效率低 | 影响工作效率 | 支持批量上传和队列管理,提高效率 | 提高效率50% |
| 编码配置复杂 | 需要手动调整编码配置,操作复杂 | 影响上传质量 | 支持完全自定义编码配置,简化操作 | 提高操作便捷性80% |
| 大文件上传困难 | 大文件上传速度慢,容易中断 | 影响工作效率 | 支持分片上传,提高上传速度和稳定性 | 提高上传速度30% |
| 错误现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---|---|---|---|
| 上传失败 | 网络连接不稳定 | 检查网络连接,尝试重新上传 | 确保网络连接稳定,重新上传 |
| 上传进度停滞 | 文件损坏或服务器问题 | 检查文件完整性,联系技术支持 | 检查文件完整性,如无问题联系技术支持 |
| 编码配置错误 | 编码参数设置不正确 | 检查编码参数设置 | 重新设置编码参数,确保正确 |
| 分片上传失败 | 分片文件损坏或服务器问题 | 检查分片文件完整性,联系技术支持 | 检查分片文件完整性,如无问题联系技术支持 |
| 元数据管理错误 | 元数据格式不正确 | 检查元数据格式,重新输入 | 重新输入正确的元数据格式 |
| 风险项 | 等级 | 防护措施 | 验证方法 |
|---|---|---|---|
| API密钥泄露 | 高 | 通过环境变量配置,禁止硬编码 | 定期检查代码和配置文件 |
| 命令执行风险 | 高 | 仅执行白名单命令,避免拼接用户输入 | 使用沙箱环境测试 |
| 网络通信安全 | 中 | 使用HTTPS协议,验证SSL证书 | 定期检查证书有效期 |
| 敏感数据暴露 | 高 | 输出结果中不包含密钥、令牌等敏感信息 | 日志脱敏审查 |
| 未授权访问 | 中 | 限制访问权限,实施认证机制 | 定期审计访问日志 |
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 基础功能 | 支持 | 支持 |
| 音频流上传专业版分片上传与元数据管理 | 不支持 | 支持 |
| 高清分辨率与无损输出 | 不支持 | 支持 |
| 批量生成与风格预设 | 不支持 | 支持 |
| 自定义模型微调 | 不支持 | 支持 |
| 商用版权授权 | 不支持 | 支持 |
import requests
import hashlib
import os
import json
from concurrent.futures import ThreadPoolExecutor, as_completed
class AudioBatchUploader:
def __init__(self, public_key, secret_key, max_workers=3):
self.public_key = public_key
self.secret_key = secret_key
self.base_url = 'https://api-w3stream.attoaioz.cyou/api'
self.max_workers = max_workers
self.results = []
self.failed = []
@property
def headers(self):
return {
'stream-public-key': self.public_key,
'stream-secret-key': self.secret_key
}
def upload_single(self, file_path, title, config=None):
"""上传单个音频文件,支持自定义编码配置"""
try:
create_data = {'title': title, 'type': 'audio'}
if config:
create_data.update(config)
resp = requests.post(
f'{self.base_url}/videos/create',
headers={**self.headers, 'Content-Type': 'application/json'},
json=create_data
)
audio_id = resp.json()['data']['id']
file_size = os.path.getsize(file_path)
with open(file_path, 'rb') as f:
file_hash = hashlib.md5(f.read()).hexdigest()
with open(file_path, 'rb') as f:
requests.post(
base_url}/videos/{audio_id}/part',
headers={
**self.headers,
'Content-Range': f'bytes 0-{file_size-1}/{file_size}'
},
files={'file': f},
data={'index': 0, 'hash': file_hash}
)
base_url}/videos/{audio_id}/complete',
headers={'accept': 'application/json', **self.headers}
)
self.results.append({'file': file_path, 'audio_id': audio_id, 'status': 'success'})
return audio_id
except Exception as e:
self.failed.append({'file': file_path, 'error': str(e)})
return None
def batch_upload(self, file_list, config=None):
"""批量上传音频文件"""
with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
futures = {
executor.submit(self.upload_single, item['path'], item['title'], config): item
for item in file_list
}
for future in as_completed(futures):
future.result()
print(f"成功: {len(self.results)}, 失败: {len(self.failed)}")
return {'success': self.results, 'failed': self.failed}
def retry_failed(self, config=None):
"""重试失败的 uploads"""
retry_list = [{'path': f['file'], 'title': os.path.basename(f['file'])} for f in self.failed]
self.failed = []
return self.batch_upload(retry_list, config)
HIGHEST_QUALITY_CONFIG = {
"description": "高品质音乐上传",
"is_public": True,
"tags": ["music", "high-quality"],
"metadata": [
{"key": "artist", "value": "艺术家名"},
{"key": "album", "value": "专辑名"},
{"key": "track_number", "value": "01"}
],
"qualities": [
{
"resolution": "highest",
"type": "hls",
"container_type": "mpegts",
"audio_config": {
"codec": "aac",
"bitrate": 320000,
"channels": "2",
"sample_rate": 48000,
"language": "zh",
"index": 0
}
}
]
}
ADAPTIVE_QUALITY_CONFIG = {
"qualities": [
{
"resolution": "highest",
"type": "hls",
"container_type": "mpegts",
"audio_config": {
"codec": "aac", "bitrate": 320000,
"channels": "2", "sample_rate": 48000, "index": 0
}
},
{
"resolution": "standard",
"type": "hls",
"container_type": "mpegts",
"audio_config": {
"codec": "aac", "bitrate": 128000,
"channels": "2", "sample_rate": 44100, "index": 0
}
}
]
}
DASH_CONFIG = {
"qualities": [
{
"resolution": "highest",
"type": "dash",
"container_type": "fmp4",
"audio_config": {
"codec": "aac", "bitrate": 256000,
"channels": "2", "sample_rate": 48000, "index": 0
}
}
]
}
自定义编码配置 选项def upload_large_file(self, file_path, title, chunk_size=10*1024*1024):
"""分片上传大文件,支持断点续传"""
file_size = os.path.getsize(file_path)
resp = requests.post(f'{self.base_url}/videos/create',
headers, 'Content-Type': 'application/json'},
json={'title': title, 'type': 'audio'})
audio_id = resp.json()['data']['id']
chunk_index = 0
uploaded_chunks = self.get_upload_progress(audio_id) # 断点续传检查
with open(file_path, 'rb') as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
if chunk_index in uploaded_chunks:
chunk_index += 1
continue
chunk_hash = hashlib.md5(chunk).hexdigest()
start = chunk_index * chunk_size
end = min(start + len(chunk) - 1, file_size - 1)
post(f'{self.base_url}/videos/{audio_id}/part',
headers, 'Content-Range': f'bytes {start}-{end}/{file_size}'},
files={'file': chunk},
data={'index': chunk_index, 'hash': chunk_hash})
chunk_index += 1
requests.get(f'{self.base_url}/videos/{audio_id}/complete',
return audio_id
```- 验证执行结果,确认输出符合预期格式
- 异常时参考错误处理章节进行恢复
- 关键参数: `分片上传大文件` 选项
## 安装向导
1. 确认运行环境满足依赖说明中的要求
2. 在AI Agent对话中调用本技能,提供必要的输入参数
3. 检查输出结果,根据需要进行后续处理
## 适用范围
### 场景一:音频内容平台批量入库
平台运营团队需要将大量音频内容批量上传至流媒体平台,支持自定义编码与元数据.
```bash
python3 -c "
from uploader import AudioBatchUploader
uploader = AudioBatchUploader(
public_key='YOUR_PUBLIC_KEY',
secret_key='YOUR_SECRET_KEY',
max_workers=3
)
file_list = [
{'path': '/audio/episode01.mp3', 'title': '节目优秀期'},
{'path': '/audio/episode02.mp3', 'title': '节目第二期'},
{'path': '/audio/episode03.mp3', 'title': '节目第三期'},
]
result = uploader.batch_upload(file_list, config=ADAPTIVE_QUALITY_CONFIG)
print(f'上传结果: {result}')
if result['failed']:
uploader.retry_failed(config=ADAPTIVE_QUALITY_CONFIG)
"
音乐制作团队上传同一作品的不同质量版本,适配不同播放场景.
curl -s -X POST 'https://api-w3stream.attoaioz.cyou/api/videos/create' \
-H 'stream-public-key: YOUR_PUBLIC_KEY' \
-H 'stream-secret-key: YOUR_SECRET_KEY' \
-H 'Content-Type: application/json' \
-d '{
"title": "原创音乐 - 无损版",
"type": "audio",
"description": "高品质无损音乐",
"tags": ["music", "lossless", "original"],
"metadata": [
{"key": "artist", "value": "音乐人"},
{"key": "bpm", "value": "120"},
{"key": "genre", "value": "电子"}
],
"qualities": [
{
"resolution": "lossless",
"type": "hls",
"container_type": "mpegts",
"audio_config": {
"codec": "aac",
"bitrate": 320000,
"channels": "2",
"sample_rate": 96000,
"language": "zh",
"index": 0
}
}
]
}'
企业内部培训系统批量上传培训音频,支持元数据分类管理与DASH格式播放.
training_audio_list = [
{'path': '/training/onboarding_01.mp3', 'title': '新人培训-公司文化'},
{'path': '/training/onboarding_02.mp3', 'title': '新人培训-制度规范'},
{'path': '/training/safety_01.mp3', 'title': '安全培训-基础篇'},
]
ENTERPRISE_CONFIG = {
"is_public": False,
"tags": ["企业培训", "内部资料"],
"metadata": [
{"key": "department", "value": "人力资源部"},
{"key": "category", "value": "新人培训"},
{"key": "version", "value": "2026.1"}
],
"qualities": [
{
"resolution": "standard",
"type": "dash",
"container_type": "fmp4",
"audio_config": {
"codec": "aac", "bitrate": 128000,
"channels": "2", "sample_rate": 44100, "index": 0
}
}
]
}
uploader = AudioBatchUploader('YOUR_PUBLIC_KEY', 'YOUR_SECRET_KEY', max_workers=5)
result = uploader.batch_upload(training_audio_list, config=ENTERPRISE_CONFIG)
pip install requests
export STREAM_PUBLIC_KEY="your_public_key"
export STREAM_SECRET_KEY="${API_KEY:?请设置环境变量}"
attoaioz.cyou/api/videos/create' \
-H "stream-public-key: $STREAM_PUBLIC_KEY" \
-H "stream-secret-key: $STREAM_SECRET_KEY" \
-H 'Content-Type: application/json' \
-d '{"title":"专业音频","type":"audio","qualities":[{"resolution":"highest","type":"hls","audio_config":{"codec":"aac","bitrate":320000,"channels":"2","sample_rate":48000,"index":0}}]}'
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| content | string | 否 | 处理的内容输入 |
| mode | string | 否 | 处理模式, 可选值: json/text/markdown |
| style | string | 否 | 输出风格, 参考 references/style.md |
{
"success": true,
"data": {
"result": "处理结果",
"status": "success",
"metadata": {
"metadata": {
"template_used": "reviewer",
"word_count": 0,
"style": "专业"
}
},
"error": null
}
输出模板参考: assets/output.json
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 |
| 依赖项 | 类型 | 是否必需 | 获取方式 |
A1: 企业级音频上传工具,支持批量上传、自定义编码、多质量预设、分片上传与元数据管理。音频流上传专业版 —— 面向企业团队与专业创作者的高级音频上传工具。核心能力:。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。
针对音频流上传专业版使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---|---|---|
| API认证失败(401) | API密钥错误或过期 | 检查密钥配置,重新生成token |
| 接口限流(429) | 请求频率超出限制 | 降低调用频率,启用重试退避策略 |
| 响应超时(504) | 网络延迟或服务端负载过高 | 增加超时阈值,检查网络连接 |
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |
针对音频流上传专业版使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---|---|---|
| API认证失败(401) | API密钥错误或过期 | 检查密钥配置,重新生成token |
| 接口限流(429) | 请求频率超出限制 | 降低调用频率,启用重试退避策略 |
| 响应超时(504) | 网络延迟或服务端负载过高 | 增加超时阈值,检查网络连接 |
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |
A1: 企业级音频上传工具,支持批量上传、自定义编码、多质量预设、分片上传与元数据管理。音频流上传专业版 —— 面向企业团队与专业创作者的高级音频上传工具。核心能力:。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。