tianyaogavin's picture
init main framework
1bf36cc

语义聚合控制器 (Semantic Aggregator)

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

主要功能

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

核心组件

SentenceCompletionDetector

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

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

SemanticAggregator

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

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. 如果有差异,更新显示并发送到翻译模块

使用示例

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 脚本测试聚合器功能:

# 设置OpenAI API密钥
export OPENAI_API_KEY=your_api_key

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

注意事项

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