更新记录

| `processWebmTranscode()` 异步返回值无效 | 移除 `@Async` 注解 |
| `deleteSfxByIds()` 未加载标签 | 新增 `findByIdInWithTags()` 方法 |
| `removeTagFromSfx()` 缺少关联清理 | 添加 setSfx(null) 和 setTag(null) |
| `batchUpdate()` 循环内多次 save | 新增私有方法,统一 save |
---
## 2026-03-16 SfxService音效和标签增删改查逻辑修复
### 问题描述
检查SfxService的音效和标签增删查改逻辑,发现以下脏数据风险:
| 优先级 | 问题 | 位置 |
|--------|------|------|
| P0 | decrementUsageCount无边界检查,会产生负数 | TagService.java:172-184 |
| P0 | deleteSfxAllTags未清理中间表SfxTag | SfxService.java:726-741 |
| P1 | batchUpdate循环内标签计数重复递增 | SfxService.java:845-875 |
| P1 | deleteSfxTag索引更新顺序不当 | SfxService.java:700-724 |
| P2 | clearNotApproved未加载标签关联 | SfxService.java:950-972 |
### 修复内容
#### 1. TagService.decrementUsageCount 添加负数检查
```java
if (tagStats.getUsageCount() > 0) {
tagStats.setUsageCount(tagStats.getUsageCount() - 1);
tagStatsRepository.save(tagStats);
}
```
#### 2. SfxService.deleteSfxAllTags 添加中间表清理
```java
sfx.getSfxTags().clear();
sfxTagRepository.deleteBySfxId(sfxId); // 新增
```
#### 3. SfxService.batchUpdate 使用Set收集标签统一递增
```java
Set<String> addedTags = new HashSet<>();
// 循环中添加到Set
addedTags.add(tagName);
// 循环后统一递增
for(String tagName : addedTags) {
tagService.incrementUsageCount(tag, SfxCategory.SFX);
}
```
#### 4. SfxService.deleteSfxTag 优化索引更新
```java
if (sfx != null) {
audioEffectService.indexAudioEffect(sfx);
}
invalidateCache();
```
#### 5. SfxRepository 新增 findByStatusNotWithTags
```java
@EntityGraph(attributePaths = {"sfxTags", "sfxTags.tag"})
Page<Sfx> findByStatusNotWithTags(int approvedStatus, Pageable pageable);
```

更新记录

**经验总结**:
- `@Async` 方法不能直接使用 `HttpServletRequest` 对象
- 需要在调用异步方法前提取所有需要的数据
- DTO 模式是解决此类问题的标准方案
---
## SfxService 音效文件和标签增删查改逻辑修复
### 2026-03-16 修复 SfxService 内部逻辑问题
#### 问题描述
验证 SfxService 内部音效文件和音效标签的增删查改逻辑,发现以下问题:
#### 问题1: `processWebmTranscode()` 异步返回值无效 (严重)
**问题原因**:
`@Async` 异步方法返回 `boolean` 类型,调用者 `moveToNewPath()` 立即得到默认值 `false`
导致转码还没开始就被判定失败,然后删除已移动的文件。
**解决方案**:
移除 `@Async` 注解,改为同步执行,确保返回值正确传递。
#### 问题2: `deleteSfxByIds()` 未加载标签
**问题原因**:
`findByIdIn()` 没有 `@EntityGraph`,标签集合未加载,导致标签计数递减逻辑无法正确执行。
**解决方案**:
新增 `findByIdInWithTags()` 方法,使用 `@EntityGraph` 加载标签关联。
#### 问题3: `removeTagFromSfx()` 缺少关联清理
**问题原因**:
移除标签时未显式清理 `SfxTag` 的双向关联引用,与 `updateSfxTags()` 方法不一致。
**解决方案**:
添加 `tagToRemove.setSfx(null)``tagToRemove.setTag(null)` 确保关联清理一致性。
#### 问题4: `batchUpdate()` 循环内多次 save 效率低下
**问题原因**:
每次添加标签都触发 `save()``invalidateCache()`,效率低下。
**解决方案**:
新增 `addTagToSfxWithoutSave()` 私有方法,循环结束后统一执行 `save()`
#### 修改文件
- `src/main/java/com/imdaxiong/bigbearcloud/service/SfxService.java`
- `src/main/java/com/imdaxiong/bigbearcloud/repository/SfxRepository.java`
#### 修复汇总
| 问题 | 修复方案 |
|------|----------|
| `processWebmTranscode()` 异步返回值无效 | 移除 `@Async` 注解 |
| `deleteSfxByIds()` 未加载标签 | 新增 `findByIdInWithTags()` 方法 |
| `removeTagFromSfx()` 缺少关联清理 | 添加 setSfx(null) 和 setTag(null) |
| `batchUpdate()` 循环内多次 save | 新增私有方法,统一 save |

修复标签与标题脱离原始文件名的问题

核心问题是:文件名中的中文部分是后期不准确的直译,而英文部分是准确的原始描述。需要优先使用英文部分进行翻译和标签生成。

  • 英文部分是准确的原始描述,中文部分可能是后期不准确的直译,应优先使用英文部分
  • 过滤无意义内容:天途影像、X 2 数量标识、错误直译词
  • 单个中文数字(一、二、三等)应保留,不应被过滤
  • 保持代码修改已提交到 git

Discoveries

  1. 问题根源_extract_english_part 方法从完整路径提取英文而非只提取文件名
  2. 多层过滤问题:多个地方都有 len(word) >= 2 的过滤条件,导致单个中文数字被过滤
  3. 需要修改的位置
    • _extract_semantic_words 中的语义提取
    • _filter_meaningless_tags 中的标签过滤
    • _generate_natural_language_filename 中的文件名生成

Accomplished

  1. 新增 _extract_english_part() 方法提取英文部分(已修复路径问题)
  2. 新增 _optimize_filename_with_llm() 方法使用 Qwen 模型优化
  3. 扩展翻译词库(鸟类、猫、狗、身体部位、数字等约150词)
  4. 扩展 label_to_tags 映射表(约120词)
  5. 修复 NameError: quoted_content 未定义 错误
  6. 添加缺失的翻译词:finger→手指, five→五, six→六 等
  7. 修改多处过滤逻辑允许单个中文数字通过

正在修复:单个中文数字在最终文件名生成时仍被过滤的问题

Relevant files / directories

  • python/classifier_v2.py - 主分类器,包含文件名处理逻辑

    • _extract_english_part() - 提取英文部分
    • _extract_semantic_words() - 提取语义词
    • _generate_natural_language_filename() - 生成新文件名
    • _translate_filename_to_chinese() - 翻译英文到中文
    • _optimize_filename_with_llm() - LLM优化文件名
  • python/utils/tag_generator.py - 标签生成工具

    • extract_filename_keywords() - 提取关键词
    • _filter_meaningless_tags() - 过滤无意义标签
    • MEANINGLESS_TAGS - 无意义标签列表
    • translation_map - 翻译词库
  • python/utils/local_llm_tags.py - 本地LLM标签生成器

File: Five finger whistles..07034113.wav
Semantic: ['五', '手指', '口哨']  ✅ 正确
Keywords: ['五', '手指', '口哨']  ✅ 正确
CN Tags: ['五', '手指', '口哨', ...]  ✅ 正确
New Name: 手指_口哨_2df943.wav  ❌ 缺少 '五'

激活码送给有缘人

5X3W-33Q7-A5RA-6E93
RRLA-S397-B7QA-4R2E
DVYU-S5WC-8GEZ-8NTN
M786-3DSD-HJ5P-PGFD
Y8L3-XKU2-U5F4-K6BN
ECUH-XPSJ-MFU5-T5A2
84E4-4565-Q46P-7U9H
9S6S-8QJH-P2DL-RRU7
JZL3-YR8D-FL3L-TRR6
L7X7-B349-V5ZS-R93U

正在改进音效分类工具

目前有大批的音效超过万首以上待审核
过去的音效分类工具虽然用了大模型
但是对于音效这种短音频文件
很难识别的特别准确

所有我整合了三个模型来做智能音效分类
希望能够尽快的完成音效库的搭建
毕竟工具体验再好
资源不完整也是白搭

达芬奇音效字幕插件v1.2.4升级!

## 📝 字幕模块 ### 新增:智能定位 打开字幕面板时,自动跳转到当前播放头所在的字幕位置,不用再手动翻找了。 ### 优化:点击跳转 现在只有**真正点击输入框**时才会跳转播放头,解决了之前"不小心碰到就乱跳"的问题。 ### 优化:后台自动释放 当你切换到其他软件时,字幕输入框会自动失去焦点,避免意外修改字幕内容。 --- ## 🎵 音效模块 ### 修复:播放头位置 添加音效后,播放头现在会停在音效的**开头位置**,方便你直接预听效果。(之前会跳到结尾,很烦人) ### 新增:智能避让 添加音效时如果和已有内容重叠,会**自动创建新轨道**,不会再覆盖掉其他素材。 ### 优化:轨道命名 音效轨道命名改为更简洁的 **BGX** 格式,时间线更清爽。 --- **一句话总结**:字幕定位更智能,音效添加更顺手。

我不太会写博客

就记录一下比格熊的更新日志吧!