-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
150 lines (127 loc) · 5.17 KB
/
main.py
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""
MemoTrans
Vasco Berl, Veronika Sahlbach
Audiodateien aus Telegrammgruppen automatisch transkribieren und zuordnen
"""
import sys
import os
import io
from pydub import AudioSegment
import math
import threading
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
from PyQt5 import QtCore as qtc
from pathlib import Path
import speech_recognition as sr
from convert import SplitConvert
from ui.main_ui import Ui_MainWindow
class MainWindow(qtw.QMainWindow,Ui_MainWindow):
checked_convert = False
checked_meta = False
progress = qtc.pyqtSignal(int)
def __init__(self):
"""Initialisiere Oberfläche"""
super().__init__()
Ui_MainWindow()
self.setupUi(self)
self.folder_btn.clicked.connect(self.selectFolder)
self.init_btn.clicked.connect(self.onInit)
self.start_btn.clicked.connect(self.onStart)
self.progress.connect(self.setProgress)
def selectFolder(self):
"""Dialog Ordner Auswählen"""
self.folder = qtw.QFileDialog.getExistingDirectory(self, 'Ordner auswählen')
self.folder_edit.setText(self.folder)
self.setStatus("Ordner ausgewählt: " + self.folder)
self.init_btn.setEnabled(True)
def onInit(self):
"""Dateien Einlesen"""
filenames = self.getFilenames(self.folder)
#print(filenames)
self.checked_convert = self.convert_check.isChecked()
self.checked_meta = self.meta_check.isChecked()
if self.checked_convert:
filenames = [k for k in filenames if '.ogg' in k]
self.setStatus(str(len(filenames)) + " .ogg Dateien gefunden")
else:
filenames = [k for k in filenames if '.wav' in k]
self.setStatus(str(len(filenames)) + " .wav Dateien gefunden")
if not filenames:
self.setStatus("Keine Dateien gefunden!")
else:
self.start_btn.setEnabled(True)
self.filenames = filenames
def startTranscribe(self):
"""Hauptprozess des Transkribierens"""
self.setStatus("Transkription gestartet")
self.start_btn.setEnabled(False)
i= 0 # Zählvariable für den Prozessfortschritt
for file in self.filenames:
i = i + 1
parts = []
if self.checked_convert:
# Dateien konvertieren und splitten
self.setStatus("Konvertiere (" + str(i)+"/"+str(len(self.filenames))+") "+ file)
split_file = SplitConvert(self.folder,file)
parts = split_file.multiple_split(min_per_split=5)
else:
parts.append(file)
with io.open(self.folder + "/text.txt","a",encoding='utf8') as txt_file:
for part in parts:
# Part traskribieren und Text speichern
try:
self.setStatus("Transkribiere (" + str(i)+"/"+str(len(self.filenames))+") " + part)
text = self.toText(self.folder + '/' + part)
if self.checked_meta:
txt_file.write("<s name=\"" + part.replace(".wav","\">") + text + "</s> \n")
else:
txt_file.write(part.replace(".wav","") + " # " + text + '\n')
except Exception as e:
print(e)
# Konvertierte Dateien wieder löschen
if self.checked_convert:
try:
os.remove(self.folder + '/' + part)
except Exception as e:
print(e)
self.setStatus("Feritg transkribiert "+file)
# Statusupdate
progress = 100* i / len(self.filenames)
self.progress.emit(int(progress))
self.setStatus("Alle Dateien wurden erfolgreich Transkribiert!")
self.folder_btn.setEnabled(True)
self.init_btn.setEnabled(True)
def onStart(self):
"""Startet die Transkription als eignen Prozess damit die Ui nicht einfriert"""
self.folder_btn.setEnabled(False)
self.init_btn.setEnabled(False)
thread = threading.Thread(target=self.startTranscribe)
thread.start()
def toText(self,file):
"""Transkribiert eine Datei mit der Google-API"""
speech_engine = sr.Recognizer()
with sr.AudioFile(file) as f:
data = speech_engine.record(f)
text = speech_engine.recognize_google(data, language="de-DE")
#print(text)
return text
def setStatus(self,status):
"""Ausgabe der Statusnachrichten"""
self.status_label.setText(status)
print(status)
def setProgress(self,value):
"""Update des Fortschrittbalkens"""
#print(value)
self.progressBar.setValue(value)
def getFilenames(self,folder):
"""Einlesen der Dateinamen"""
self.setStatus("Suche Dateien in " + folder)
filenames = []
filenames = os.listdir(folder)
return filenames
if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec())