- 机器学习
- AI 应用
【免费下载链接】AugLy
A data augmentations library for audio, image, text, and video.
本文以 AugLy 开源数据增强库中的augly.utils工具包为核心,系统梳理其资源路径体系、核心常量、输入校验、时间分段计算与文件 IO 基础设施,并结合源码与测试用例说明这些基础设施如何被音频、图像、文本、视频四大模块复用。读完本文,你将掌握 AugLy 内部资源定位机制、Segment时间分段模型、pathmgr远程文件访问方案,以及 ffmpeg/libsndfile 环境依赖的正确配置方式。
一、augly.utils 是什么:四大模态增强的公共底座
AugLy 是一个覆盖音频(audio)、图像(image)、文本(text)、视频(video)四种模态的数据增强库。虽然各模态的功能实现彼此独立,但它们共享一套底层基础设施,这就是augly.utils包。
从 augly/utils/init.py 的导出清单可以看到,这个包对外提供的能力可分为五类:
- 资源路径常量(来自
base_paths):定位仓库内预置的字体、emoji、遮罩、截图模板、测试资产等文件; - 默认值与辅助常量(来自
constants):默认采样率、默认颜色、点击诱饵文案、文本增强词典等; - 输入校验函数(来自
asserts):校验文件类型、路径有效性、RGB 颜色合法性; - 数据结构与算法(来自
classes和functions):Segment命名元组与时间裁剪分段计算; - IO 与环境适配(来自
io、ffmpeg、libsndfile):统一文件访问、ffmpeg 定位与 libsndfile 安装钩子。
在 Sphinx 文档体系(docs/source/augly.utils.rst)中,augly.utils的 API 文档按两个子模块组织:augly.utils.base_paths与augly.utils.constants,并在Module contents一节通过automodule自动汇总整个包的公开成员。以下各节将逐一展开这些模块的源码实现。
二、augly.utils.base_paths:仓库资源路径的唯一定义处
路径体系是整个工具包的地基。所有模块只要需要预置资源,都会从这里导入路径常量,而不是各自硬编码路径。
2.1 路径推导逻辑
augly/utils/base_paths.py 的核心思路是基于模块文件位置动态推导,而非写死绝对路径:
MODULE_BASE_DIR:通过os.path.dirname(os.path.dirname(__file__))从augly/utils/base_paths.py向上两级得到augly包目录;ASSETS_BASE_DIR:即augly/assets,是所有预置资源的根目录;- 各类资源目录再基于
ASSETS_BASE_DIR拼接而成。
这样设计的好处是:无论 AugLy 被安装到 site-packages 还是以源码方式引用,资源路径都能随包位置自动解析,无需用户手动配置。
2.2 资源目录速查表
| 常量 | 指向目录/文件 | 用途 |
|---|---|---|
AUDIO_ASSETS_DIR | assets/audio | 预置音频资源(如静音片段silent.flac) |
TEXT_DIR | assets/text | 文本增强所需的 JSON 词典 |
EMOJI_DIR | assets/twemojis | Twemoji 表情图片库 |
FONTS_DIR | assets/fonts | 字体文件库(TTF/OTF 及序列化 pkl) |
IMG_MASK_DIR | assets/masks | 图像遮罩(如dfdc_mask.png) |
SCREENSHOT_TEMPLATES_DIR | assets/screenshot_templates | 截图增强模板 |
TEMPLATE_PATH | screenshot_templates/web.png | 默认网页截图模板 |
TEST_URI | tests/assets | 单元测试资产根目录 |
其中TEST_URI指向tests/assets(源码中通过os.path.join(MODULE_BASE_DIR, "tests", "assets")得到),测试代码大量依赖它。例如 augly/tests/base_configs.py 中ImageAugConfig、VideoAugConfig、AudioAugConfig的输入/输出目录均以TEST_URI为基础拼接,保证测试在任意环境可复现。
2.3 测试元数据路径
base_paths还定义了四模态的**期望元数据(expected metadata)**路径:
METADATA_BASE_PATH:tests/assets/expected_metadataAUDIO_METADATA_PATH/IMAGE_METADATA_PATH/TEXT_METADATA_PATH/VIDEO_METADATA_PATH:分别指向各模态测试的expected_metadata.json
这些路径被 augly/tests/audio_tests/transforms_unit_test.py、augly/tests/image_tests/transforms_unit_test.py、augly/tests/text_tests/transforms_unit_test.py、augly/tests/video_tests/transforms/ffmpeg_test.py 等测试文件引用,用于断言增强前后媒体文件的时长、帧率、采样率等属性是否符合预期。
三、augly.utils.constants:默认值与内置资源常量
augly/utils/constants.py 集中定义了各模态增强函数的默认参数值,以及大量指向具体资源文件的路径。理解这些常量,等于理解了 AugLy 各增强函数"不传参时用的是什么"。
3.1 颜色与速率
- 颜色三元组:
DEFAULT_COLOR = (0, 0, 0)(黑)、WHITE_RGB_COLOR = (255, 255, 255)(白)、RED_RGB_COLOR = (255, 0, 0)(红); DEFAULT_FRAME_RATE = 10:视频默认帧率;DEFAULT_SAMPLE_RATE = 44100:音频默认采样率(CD 音质标准)。该常量被 augly/audio/functional.py 直接导入,作为音频增强的默认采样率。
3.2 文本相关常量
DEFAULT_TEXT_INDICES:默认随机选取的 5 个文本下标(random.randrange(1, 1000)),用于从内置词典中抽样;CONTRACTIONS_MAPPING:指向text/contractions.json,为contraction增强提供"缩写↔全称"映射;FUN_FONTS_PATH/FUN_FONTS_GREEK_PATH:指向fun_fonts.json与fun_fonts_greek.json,用于花式字体替换;UNICODE_MAPPING_PATH:指向letter_unicode_mapping.json,用于字母与 Unicode 字符的互相替换;MISSPELLING_DICTIONARY_PATH:指向misspelling.json,用于模拟拼写错误;GENDERED_WORDS_MAPPING:指向gendered_words_mapping.json,用于swap_gendered_words公平性增强。源码注释说明该映射由女性/男性词汇表构建而来,词汇表与 Dinan et al., 2020 一致。
3.3 字体相关常量
FONT_PATH:默认字体NotoNaskhArabic-Regular.ttf,是文本背景覆盖(augly/image/functional.py 中overlay_text的默认字体);DEFAULT_TEXT_OVERLAY_FONT_PATH:默认文字叠加字体Allura-Regular.ttf(装饰性手写体);MEME_DEFAULT_FONT:默认 meme 字体Raleway-ExtraBold.ttf;SOCIAL_MEDIA_OVERLAY_FONTS:社交媒体风格叠加字体列表(Montserrat-ExtraBoldItalic、CourierPrime-Bold、Barlow-SemiBold、Dekko-Regular、Arapey-Italic、OldStandardTT-Regular、CosmopolitanScriptRegular 等),供随机字体叠加类增强随机抽样。
3.4 图像与截图相关常量
IMG_MASK_PATH:指向masks/dfdc_mask.png,用于 DFDC(DeepFake Detection Challenge)风格的遮罩增强;BBOXES_PATH:指向screenshot_templates/bboxes.json,是截图增强中预标注的边界框数据;EMOJI_PATH:指向twemojis/smileys/smiling_face_with_heart_eyes.png,作为overlay_emoji系列增强的默认 emoji。注释明确这些 emoji 资产来自 Twemoji(Twitter 开源项目,代码 MIT、图形 CC-BY 4.0);SUPPORTED_LINE_TYPES = ["dotted", "dashed", "solid"]:overlay_stripes增强支持的三种线条类型。
3.5 点击诱饵短语与音频资源
CLICKBAIT_PHRASES:25 条内置点击诱饵文案(如 "BREAKING: THIS CHANGES EVERYTHING"、"YOU WON'T BELIEVE WHAT HAPPENED NEXT"),是overlay_random_text_with_background增强的默认文案池;SILENT_AUDIO_PATH:指向audio/silent.flac,用于在音频或视频中插入静音片段。
四、augly.utils.asserts:增强输入的第一道防线
所有模态的增强函数在真正处理数据之前,都会先经过输入校验。augly/utils/asserts.py 提供了以下校验能力:
- 文件类型检测:基于
python-magic的 MIME 识别。is_audio_file检查 MIME 是否包含audio;is_image_file检查是否包含image;is_video_file除检查videoMIME 外,还会对application/octet-stream做二次嗅探(通过文件描述中的 "iso media"(MP4)、"matroska"(MKV)、"webm"、"avi"、"quicktime"(MOV)、"mpeg" 等关键词识别视频容器); - 路径校验:
validate_path要求路径是字符串且存在(通过pathmgr.exists检查);validate_output_path要求输出路径的父目录存在; - 模态专用校验:
validate_audio_path之所以同时允许音频和视频路径,是因为源码注释说明librosa可以从音频与视频两种文件中提取音频;validate_image_path、validate_video_path分别只接受对应类型; - 颜色校验:
validate_rgb_color要求颜色是长度为 3、每个分量在 0~255 之间的元组,否则抛出断言错误。
这些校验函数已通过 augly/utils/init.py 导出为包级 API,供 augly/audio/functional.py、augly/image/functional.py 等模块在函数入口处统一调用。
五、augly.utils.classes.Segment:时间分段的统一数据结构
Segment是 AugLy 视频/音频时间轴对齐机制的核心数据结构,定义在 augly/utils/classes.py:
class Segment(NamedTuple): start: float end: float src_id: str | None = Nonestart/end:时间段起止(秒);src_id:可选,标识该时间段在源媒体中的来源;delta(start_delta, end_delta):按给定偏移量平移生成新Segment,若new_start > new_end则抛出ValueError,防止产生非法倒置时间段。
该结构在视频元数据追踪中扮演关键角色:视频增强(如裁剪、变速、拼接)会改变时间轴,Segment对记录了"源视频某段时间 ↔ 目标视频某段时间"的匹配关系,从而支持在增强后反向定位任意时刻对应的源内容。
六、augly.utils.functions.compute_time_crop_segments:时间裁剪的段映射算法
augly/utils/functions.py 中的compute_time_crop_segments是视频时间裁剪类增强的核心算法。它根据一个时间裁剪区间[crop_start, crop_end],计算给定的源-目标匹配段对如何变化,并将新段追加到new_src_segments/new_dst_segments列表中。
算法要点(源码注释可见其设计意图):
- 完全裁剪:若裁剪区间与匹配段不相交(
crop_start >= dst_segment.end或crop_end <= dst_segment.start),则该匹配对在目标视频中已不存在,直接返回; - 裁剪开头:
new_start = dst_segment.start - crop_start,若为负说明匹配段的开头被裁掉,需要同步调整src_start; - 裁剪结尾:若
crop_end < dst_segment.end,需要同步调整src_end; - 速度因子修正:
speed_factor参数用于补偿先前变速操作的影响——注释举例:若之前做过 0.5x 慢放,目标视频中 10 秒的匹配段可能只对应源视频 5 秒,因此所有偏移量都要乘/除速度因子。
该算法在视频模块中被复用。视频侧的增强版定义于 augly/video/helpers/metadata.py,其中Segment = utils.Segment(augly/video/helpers/metadata.py),并且增加了end_dst_offset参数以支持在目标视频中追加偏移。视频的插入背景(compute_insert_in_background_multiple_segments)、变速、裁剪、拼接等变换都会调用该函数来维护段映射,最终由get_segments系列函数基于累积元数据重建完整的源-目标分段表(augly/video/helpers/metadata.py)。测试侧,augly/tests/video_tests/metadata_unit_test.py 直接导入Segment与ASSETS_BASE_DIR来验证元数据追踪逻辑。
七、augly.utils.io.pathmgr:统一的本地/远程文件访问
augly/utils/io.py 只有十余行,却提供了 AugLy 全局的文件访问抽象:
from iopath.common.file_io import HTTPURLHandler, PathManager pathmgr = PathManager() pathmgr.register_handler(HTTPURLHandler()) pathmgr.set_strict_kwargs_checking(False)- 底层基于 Facebook Research 的
iopath库的PathManager; - 注册了
HTTPURLHandler,意味着pathmgr不仅能访问本地路径,还能直接读取https://等远程 URL; set_strict_kwargs_checking(False)关闭严格关键字检查,便于不同 handler 之间参数互通。
pathmgr的实际用法体现在文本增强器中:例如 augly/text/augmenters/contraction.py 中,ContractionMapping在传入字符串形式的映射路径时,通过pathmgr.get_local_path(mapping)将本地或远程资源解析为本地可打开路径后再加载 JSON。同理,base_paths中的validate_path也用pathmgr.exists做存在性检查。这意味着 AugLy 的增强函数普遍具备"路径可以是本地文件也可以是 URL"的能力。
八、augly.utils.ffmpeg 与 libsndfile:外部依赖的定位与安装钩子
8.1 ffmpeg 路径定位
视频增强强依赖 ffmpeg/ffprobe。augly/utils/ffmpeg.py 的定位逻辑为:
- 优先读取环境变量
AUGLY_FFMPEG_PATH与AUGLY_FFPROBE_PATH(允许用户指定自定义二进制位置); - 未设置时,回退到
spawn.find_executable("ffmpeg")/("ffprobe")从系统 PATH 中查找; - 若两者任一为
None,模块导入即触发断言,错误信息提示:"Please install 'ffmpeg' or set the AUGLY_FFMPEG_PATH & AUGLY_FFPROBE_PATH environment variables before running AugLy Video"。
因此,使用 AugLy 视频增强前需确保 ffmpeg 与 ffprobe 已安装,或在环境中显式设置上述两个环境变量指向二进制文件。get_conditional_for_skipping_video_tests返回(True, "..."),用于测试框架的条件跳过机制。
8.2 libsndfile 安装钩子
augly/utils/libsndfile.py 定义了install_libsndfile()(当前实现为空操作占位)。该钩子在 augly/audio/utils.py 中被调用——位于导入librosa、soundfile、torchaudio之前,用于确保音频底层依赖(libsndfile)就绪。若使用音频增强时遇到 libsndfile 相关错误,需确保系统已安装 libsndfile 动态库。
九、从源码到测试:基础设施如何被四大模态复用
augly.utils的价值最终体现在被各模态模块广泛引用。以下调用关系可从源码中直接确认:
- 音频:augly/audio/functional.py 导入
DEFAULT_SAMPLE_RATE,并在导入阶段调用install_libsndfile; - 图像:augly/image/functional.py 中
overlay_emoji默认emoji_path=utils.EMOJI_PATH(L1077)、截图增强默认template_filepath=utils.TEMPLATE_PATH(L1329)、文本叠加默认font_file=utils.FONT_PATH(L2070)、meme 增强默认font_file=utils.MEME_DEFAULT_FONT(L2669)等; - 文本:augly/text/augmenters/baseline.py 等增强器导入
pathmgr与各类词典路径常量; - 视频:augly/video/helpers/metadata.py 复用
Segment与时间分段算法,测试端则由 augly/tests/video_tests/metadata_unit_test.py 直接验证。
十、小结与实践建议
- 路径定位:不要自行拼接资源路径,统一从
augly.utils.base_paths导入,资源随包位置自动解析; - 默认值:需要修改增强默认行为时,优先关注
augly.utils.constants中的对应常量; - 输入校验:自定义增强函数时,可复用
augly.utils.asserts的校验函数保证输入合法性; - 时间轴追踪:处理视频裁剪/变速/拼接类增强时,使用
Segment与compute_time_crop_segments维护源-目标段映射; - 文件访问:需要读取远程资源时,使用
pathmgr而非裸open(); - 环境依赖:视频增强前确保 ffmpeg/ffprobe 可用(必要时设置
AUGLY_FFMPEG_PATH与AUGLY_FFPROBE_PATH),音频增强前确保 libsndfile 已安装。
通过本文对 docs/source/augly.utils.rst 及其对应源码模块(augly/utils/base_paths.py、augly/utils/constants.py、augly/utils/asserts.py、augly/utils/classes.py、augly/utils/functions.py、augly/utils/io.py、augly/utils/ffmpeg.py)的剖析,你可以更自信地阅读 AugLy 各模态源码,或基于这套基础设施编写自己的增强扩展。
- 机器学习
- AI 应用
【免费下载链接】AugLy
A data augmentations library for audio, image, text, and video.
相关推荐
langchain-core 深度解析:支撑 LangChain 生态的基础抽象层
langchain core 深度解析:支撑 LangChain 生态的基础抽象层 本文基于仓库中 libs/core/README.md https://li
人工智能大模型AI AgentAgent 框架RAGPaddleNLP `transformers.utils` 工具模块全解析:模型加载、配置追踪与 FLOPs 估算的底层支撑
PaddleNLP transformers.utils 工具模块全解析:模型加载、配置追踪与 FLOPs 估算的底层支撑 本篇技术指南围绕 PaddleNLP
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPMediaPipe Face Mesh:单摄像头实时还原 468 个 3D 面部关键点
MediaPipe Face Mesh:单摄像头实时还原 468 个 3D 面部关键点 MediaPipe Face Mesh 是 MediaPipe 的人脸表
人工智能机器学习计算机视觉多模态本地部署
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考