File size: 3,900 Bytes
1bf36cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 语义聚合控制器 (Semantic Aggregator)

语义聚合控制器是伪流式音频转写系统的核心模块,负责将多个音频片段的转录结果聚合成完整的语义单元(句子),并推送到下游模块(显示和翻译)。

## 主要功能

1. **维护转录片段缓冲池**:收集来自转录模块的片段,直到形成完整语义单元
2. **判断语义完整性**:使用ChatGPT进行few-shot学习,判断多个片段是否组成完整句子
3. **重新转录**:将多个片段的音频合并,进行整体重新转录,提高准确性
4. **推送到下游**:将聚合结果发送到显示模块和翻译模块

## 核心组件

### SentenceCompletionDetector

使用ChatGPT进行few-shot学习,判断文本是否是一个完整的句子。

```python
detector = SentenceCompletionDetector()
is_complete = detector.is_sentence_complete("你会学习到如何使用音频数据集")  # False
is_complete = detector.is_sentence_complete("你会学习到如何使用音频数据集。")  # True
```

### SemanticAggregator

主要聚合控制器,负责缓冲、判断、重新转录和推送。

```python
aggregator = SemanticAggregator(
    on_display=display_callback,  # 显示回调
    on_translate=translate_callback,  # 翻译回调
    transcriber=transcriber,  # 转录器实例
    segments_dir="dataset/audio/segments",  # 音频片段目录
    max_window=5.0,  # 最大聚合时长(秒)
    max_segments=5,  # 最大聚合片段数
    min_gap=0.8,  # 触发聚合的最小间隔(秒)
    force_flush_timeout=3.0  # 强制flush超时时间(秒)
)
```

## 聚合判断逻辑

聚合器使用以下逻辑判断是否应该聚合并输出:

1. **语义完整性**:使用ChatGPT判断当前缓冲区中的文本是否形成完整句子
2. **时间间隔**:如果相邻片段之间的间隔超过阈值,认为是不同的语义单元
3. **最大窗口**:如果聚合的总时长超过阈值,强制聚合
4. **最大片段数**:如果聚合的片段数超过阈值,强制聚合
5. **超时机制**:如果长时间没有新片段,强制输出当前缓冲区内容

## 重新转录流程

1. 获取所有片段的音频数据
2. 合并音频数据
3. 使用转录器重新转录合并后的音频
4. 比较重新转录结果与原始聚合结果
5. 如果有差异,更新显示并发送到翻译模块

## 使用示例

```python
from display.display import OutputRenderer
from translator.translator import NLLBTranslator
from transcribe.transcribe import AudioTranscriber, TranscriptionResult
from aggregator.semantic_aggregator import SemanticAggregator

# 初始化各个模块
renderer = OutputRenderer()
translator = NLLBTranslator()
transcriber = AudioTranscriber(model="small", device="cuda")

# 回调函数
def display_callback(sentence_id, text, state):
    renderer.display(sentence_id, text, state)
    
def translate_callback(sentence_id, text):
    translation = translator.translate(text)
    print(f"[翻译] 句子 {sentence_id}: {translation}")

# 初始化聚合器
aggregator = SemanticAggregator(
    on_display=display_callback,
    on_translate=translate_callback,
    transcriber=transcriber
)

# 添加转录结果
for result in transcription_results:
    aggregator.add_segment(result)

# 最后强制刷新缓冲区
aggregator.flush(force=True)
```

## 测试

可以使用 `test_aggregator.py` 脚本测试聚合器功能:

```bash
# 设置OpenAI API密钥
export OPENAI_API_KEY=your_api_key

# 运行测试脚本
python -m aggregator.test_aggregator
```

## 注意事项

1. 需要设置 `OPENAI_API_KEY` 环境变量才能使用ChatGPT进行句子完整性判断
2. 音频片段目录需要包含所有需要重新转录的音频文件
3. 转录器需要正确初始化,包括模型、设备和计算类型
4. 回调函数需要正确处理聚合结果,包括显示和翻译