视频音频标签
更新时间:2026-09-14
简介
视频音轨打标算子:抽出视频的第一条音轨,重采样到 16k,过 Hugging Face 的 Audio Spectrogram Transformer(AST,AudioSet 微调)分类,取 logit 最大的标签作为视频的音频标签。
功能描述
- 用 PyAV 打开容器、只取
streams.audio[0]解码;多声道按通道取均值压成单声道 - 最多解码
max_seconds秒的音频(默认 30s);源码注明 AST 是固定 1024 帧输入,长音频截断不影响结果 - 采样率不等于 16000 时重采样:优先
torchaudio.transforms.Resample,没装 torchaudio 时退化为numpy线性插值 - 单标签输出:
argmax(logits)后取model.config.id2label - 无音轨、采样率取不到、解码不出数据,以及输入为 null 的行,统一返回
EMPTY,便于下游用同一个判断处理 - 单行推理异常只记日志并返回 None,不影响同批其它行
- 权重只从本地
<model_path>/<model_name>加载,目录缺失时__init__直接抛FileNotFoundError,不联网 - 解码走 PyAV 而不是 torchcodec:torchcodec 依赖 CUDA NPP 动态库(
libnppicc.so),镜像缺库时整个模块 import 就会失败
算子参数
输入
| 输入 | 含义 |
|---|---|
| video | 视频输入数组,内容类型由 video_src_type 决定(本地/BOS 路径 / Base64 字符串 / bytes) |
输出
| 输出 | 含义 |
|---|---|
| audio_tag | large_string,AST 预测的音频标签;无音轨返回 EMPTY;该行处理失败返回 None |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| video_src_type | str | "video_url" | 输入形式:video_url / video_base64 / video_binary |
| model_path | str | "/opt/aihc/model" | 权重根目录 |
| model_name | str | "MIT/ast-finetuned-audioset-10-10-0.4593" | 相对 model_path 的 AST 权重子目录 |
| max_seconds | float | 30.0 | 最多送入模型的音频秒数,<= 0 表示不截断 |
| rank | int | 0 | 多卡场景 worker 序号,设备取 cuda:<rank % 可见卡数> |
注意事项
- 只看第一条音轨(固定
stream_indexes=[0])。多音轨视频(多语言配音等)不会遍历。 - 没装 torchaudio 时用线性插值兜底重采样,重采样质量与 torchaudio 不同,个别边界样本的标签可能因此不同。
- 输出是单个标签,不是标签列表;需要多标签时要另接阈值化的分类算子。
- 是否用 GPU 由
aihc_udf的num_gpus推导(基类按num_gpus > 0置use_gpu)。
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.video.video_tagging_from_audio import VideoTaggingFromAudio
10
11os.environ.setdefault("BOS_ENDPOINT", "http://bj.bcebos.com")
12os.environ.setdefault("BOS_REGION", "bj")
13
14if __name__ == "__main__":
15 if os.getenv("DAFT_RUNNER", "native") == "ray":
16 import ray
17 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
18 daft.set_runner_ray()
19 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
20
21ds = daft.from_pydict({"video": ["bos://your-bucket/sample.mp4"]})
22 ds = ds.with_column(
23 "audio_tag",
24 aihc_udf(
25 VideoTaggingFromAudio,
26 construct_args={
27 "video_src_type": "video_url",
28 "model_path": "/path/to/models",
29 "model_name": "MIT/ast-finetuned-audioset-10-10-0.4593",
30 },
31 num_cpus=1,
32 num_gpus=1,
33 concurrency=1,
34 batch_size=1,
35 )(col("video")),
36 )
37 ds.show()
评价此篇文章
