## 2026-03-19: 修复音频加载除零错误 + 输入目录缓存功能
### 问题 1: 音频加载除零错误
后台日志出现 `加载失败: division by zero`,某些音频文件加载时采样率为 0 或 None。
### 解决方案 1
在音频加载时添加采样率有效性检查:
**修改的文件:**
- `python/api_server.py:1299` - `load_audio_file()` 添加 `sr` 检查
- `python/utils/sync_json_db.py:482` - 添加 `sr` 检查并优雅降级
- `python/main.py:431` - `preprocess_audio()` 添加 `sample_rate` 检查
**代码示例:**
```python
if sr == 0 or sr is None:
return None, 0, 0, "无效的采样率(0)"
```
### 问题 2: 输入目录无法缓存
用户希望输入目录在退出程序后自动保存,下次打开时自动恢复。
### 解决方案 2
实现输入目录本地缓存功能:
**修改的文件:**
- `tauri/src/stores/app.js:72` - 更新 `saveConfig()` 支持同时保存输入/输出目录
- `tauri/src/views/Batch.vue`:
- `addInputDir()` - 添加目录后自动保存
- `removeInputDir()` - 删除目录后自动保存
- `clearInputDirs()` - 清空目录后自动保存
- `appendInputDir()` - 运行时追加目录后自动保存
- `selectOutputDir()` - 选择输出目录时同时保存输入目录
- `onMounted()` - 启动时自动加载缓存的输入目录
**Bug 修复:**
1. `appendInputDir()` 运行时追加目录未保存缓存
2. 空输出目录会覆盖已有配置
---
## 2026-03-18: 移除Ollama依赖,优化文件名和标签生成
### 问题
1. 本地无Ollama服务,但代码依赖Ollama API调用
2. `filename` 字段被LLM输出污染(如"根据提供的信息..."、"翻译结果如下..."等)
3. 文件名和标签中出现禁用词(未分类、素材、音效等无意义词汇)
### 解决方案
1. **统一使用本地GGUF模型** (qwen2.5-7b-instruct)
- 移除所有Ollama API调用
- 使用 `llama-cpp-python` 直接加载本地模型
2. **禁用词过滤(双重机制)**
- LLM Prompt中明确禁止输出禁用词
- 代码强制过滤作为保底
3. **文件名生成优化**
- 最大长度50字符
- 结尾清理中文标点
- 优先级:LLM生成 → tags_cn组合 → model_keywords → 分类名
4. **禁用词列表**
```python
FORBIDDEN_WORDS = {
"未分类", "其他", "人工审核", "素材", "音效", "声音", "音频",
"专业", "通用", "未知", "待处理", "待审核", "综合",
"unknown", "other", "uncategorized", "misc", "audio", "sound", "effect", "sfx"
}
```
### 修改的文件
- `python/main.py`: 移除Ollama参数,改用本地LLM,新增 `_filter_forbidden_tags`
- `python/classifier_v2.py`: 新增禁用词常量,重构 `_optimize_filename_with_llm`,新增验证函数
- `python/utils/tag_generator.py`: `generate_tags_with_ollama` 改为 `generate_tags_with_local_llm`
- `python/config.py`: 注释掉Ollama配置
### 关键代码位置
- `classifier_v2.py:35-50`: 禁用词和污染词常量
- `classifier_v2.py:560-680`: LLM文件名生成和验证
- `classifier_v2.py:682-760`: 文件名生成主逻辑
- `main.py:1235-1347`: 标签生成(使用本地LLM)
## 2026-03-16: 修复大量文件扫描进度卡住问题
### 问题
点击"开始分类"时,如果目录文件数量很大(如10万+),扫描阶段会卡住不动,界面长时间显示"正在扫描文件..."但没有进度更新。
### 原因
原代码在扫描每个音频文件时都调用 `is_valid_audio_file()` 打开文件读取文件头来验证有效性,这个IO操作很慢,导致:
1. 扫描速度极慢(每秒只能处理几十个文件)
2. 进度更新间隔太大(每500个才更新一次)
3. 用户无法看到实时进度
### 解决方案
将扫描分为两阶段:
1. **快速收集阶段**(status: scanning)
- 只检查文件扩展名,不打开文件
- 每1000个文件更新一次进度
- 速度:每秒可处理数千个文件
2. **验证阶段**(status: scanning)
- 检查文件有效性(大小、文件头魔数)
- 每200个文件更新一次进度
- 显示有效文件数量
### 修改的文件
- `python/api_server.py`: 优化文件扫描逻辑,分两阶段处理
- `tauri/src/views/Batch.vue`: 前端支持扫描阶段显示进度
### 关键代码位置
- `api_server.py:1344-1397`: 文件扫描和验证逻辑
- `Batch.vue:36-76`: 扫描阶段的UI显示
- `Batch.vue:215-225`: 进度百分比计算