File size: 4,095 Bytes
09eaf7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
from PySide6.QtWidgets import (QWidget, QVBoxLayout, QLabel, QLineEdit,
                               QScrollArea, QComboBox, QCheckBox, QPushButton, QMessageBox)

from ui_components import CustomSlider, RadioButtonGroup

# 尝试导入实际的功能模块
try:
    from tools.step020_asr import transcribe_all_audio_under_folder
except ImportError:
    pass


class ASRTab(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QVBoxLayout(self)

        # 创建一个滚动区域
        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_widget = QWidget()
        self.scroll_layout = QVBoxLayout(self.scroll_widget)

        # 视频文件夹
        self.video_folder = QLineEdit("videos")
        self.scroll_layout.addWidget(QLabel("视频文件夹"))
        self.scroll_layout.addWidget(self.video_folder)

        # ASR模型选择
        self.asr_model = QComboBox()
        self.asr_model.addItems(['WhisperX', 'FunASR'])
        self.scroll_layout.addWidget(QLabel("ASR模型选择"))
        self.scroll_layout.addWidget(self.asr_model)

        # WhisperX模型大小
        self.whisperx_size = RadioButtonGroup(['large', 'medium', 'small', 'base', 'tiny'], "WhisperX模型大小", 'large')
        self.scroll_layout.addWidget(self.whisperx_size)

        # 计算设备
        self.device = RadioButtonGroup(['auto', 'cuda', 'cpu'], "计算设备", 'auto')
        self.scroll_layout.addWidget(self.device)

        # 批处理大小
        self.batch_size = CustomSlider(1, 128, 1, "批处理大小 Batch Size", 32)
        self.scroll_layout.addWidget(self.batch_size)

        # 分离多个说话人
        self.separate_speakers = QCheckBox("分离多个说话人")
        self.separate_speakers.setChecked(True)
        self.scroll_layout.addWidget(self.separate_speakers)

        # 最小说话人数
        self.min_speakers = RadioButtonGroup([None, 1, 2, 3, 4, 5, 6, 7, 8, 9], "最小说话人数", None)
        self.scroll_layout.addWidget(self.min_speakers)

        # 最大说话人数
        self.max_speakers = RadioButtonGroup([None, 1, 2, 3, 4, 5, 6, 7, 8, 9], "最大说话人数", None)
        self.scroll_layout.addWidget(self.max_speakers)

        # 执行按钮
        self.run_button = QPushButton("开始识别")
        self.run_button.clicked.connect(self.run_asr)
        self.scroll_layout.addWidget(self.run_button)

        # 状态显示
        self.status_label = QLabel("准备就绪")
        self.scroll_layout.addWidget(QLabel("语音识别状态:"))
        self.scroll_layout.addWidget(self.status_label)

        # 识别结果详情
        self.result_detail = QLabel("识别结果将显示在这里")
        self.scroll_layout.addWidget(QLabel("识别结果详情:"))
        self.scroll_layout.addWidget(self.result_detail)

        # 设置滚动区域
        self.scroll_area.setWidget(self.scroll_widget)
        self.layout.addWidget(self.scroll_area)
        self.setLayout(self.layout)

    def run_asr(self):
        # 这里应该调用原始的transcribe_all_audio_under_folder函数
        # 临时实现,实际应用中需要替换为真实的调用
        self.status_label.setText("识别中...")
        QMessageBox.information(self, "功能提示", "AI智能语音识别功能正在实现中...")

        # 实际应用中解除以下注释

        try:
            status, result_json = transcribe_all_audio_under_folder(
                self.video_folder.text(),
                self.asr_model.currentText(),
                self.whisperx_size.value(),
                self.device.value(),
                self.batch_size.value(),
                self.separate_speakers.isChecked(),
                self.min_speakers.value(),
                self.max_speakers.value()
            )
            self.status_label.setText(status)
            self.result_detail.setText(str(result_json))
        except Exception as e:
            self.status_label.setText(f"识别失败: {str(e)}")