An-Labeler:AudioLabellerV3 AI 辅助标注工具详解(自研Qt + FFT/模型自动标注)
An-Labeler V3:AudioLabeller AI 辅助标注工具详解(自研Qt + FFT/模型自动标注)Author:Code-keys (qq_37445230)Version:V3 (2026-03)系列文章:An-Labeler:AudioLabeller 高效音视频标注工具[AAn-Labeler:AudioLabellerV3 AI 辅助标注工具详解]一、V3 版本更新概览在 V1(基础标注)和 V2(手工标注优化)的基础上,V3 引入了AI 辅助自动标注能力,核心升级如下:特性V1/V2V3音频播放pyaudio+ Threadsounddevice(PyPlayer.AudioPlayer)标注模式纯手动FFT 自动检测 + 模型推理(可切换)频谱图参数FFT=1024, hop=512, mels=128FFT=512, hop=256, mels=256(更高分辨率)线程池max 2max 10类别快捷键Ctrl+1~91~9(直接按键)新增菜单—自动化标注(FFT / 模型切换)模块化单文件引入AudioAlgos、PyPlayer外部模块DEBUG 开关无全局DEBUG标志,条件日志二、架构概览V3 采用模块化拆分,将播放器和算法逻辑从主脚本中解耦:PyAudioLabelerV3FFT.py ← 主程序(UI + 标注逻辑) ├── PyPlayer.py ← 独立音频播放模块(sounddevice) ├── AudioAlgos ← 自动检测算法库(FFT/余弦相似度/零填充/跳变检测) └── classes.txt ← 类别配置文件文件依赖关系PyAudioLabelerV3FFT.py │ ├── AudioAlgos.* # 自动标注算法(detect_repeated_by_cos_similarity 等) │ ├── PyPlayer.AudioPlayer # 音频播放(替代 V1 的 AudioPlayCanStop) │ └── sounddevice # 底层音频 I/O │ └── librosa # 音频加载与重采样 │ ├── PyQt5 / pyqtgraph # GUI 框架 ├── soundfile / librosa # 音频读取与频谱计算 └── classes.txt # 标注类别定义三、核心类与模块详解3.1PyPlayer.AudioPlayer— 独立播放器模块V3 用全新的AudioPlayer替换了 V1 的AudioPlayCanStop,底层从pyaudio切换到sounddevice。PyPlayer.py核心实现:classAudioPlayer:"""基于 sounddevice 的音频播放器,支持加载 WAV、截取片段播放,子线程播放"""def__init__(self,files=None,datas=None,sr=16000,blocksize=160):self.sr=sr self.blocksize=sr//50# 每块 20msself.datas=self.load_raw(datas,sr)ifdatasisnotNoneelseself.load(files,sr)self._stop_event=threading.Event()defload(self,path,sr=None):datas,_=librosa.load(path,mono=True,sr=sr)self.datas=datas.astype(np.float32)returnself.datasdefplay(self,start_sec=0.0,end_sec=None,async_=True):"""播放音频片段,支持非阻塞子线程播放"""start=int(start_sec*self.sr)end=int(end_sec*self.sr)ifend_secisnotNoneelselen(self.datas)clip=self.datas[start:end]ifasync_:self._thread=threading.Thread(target=self._play_clip,args=(clip,),daemon=False)self._thread.start()def_play_clip(self,clip):self._stream=sd.OutputStream(samplerate=self.sr,channels=1,blocksize=self.blocksize,dtype='float32',latency='low')self._stream.start()foriin