Αρχικά για να λύσεις το πρόβλημα πρέπει να το σπάσεις σε μικρότερα κομμάτια.
- Πρώτον, πρέπει να μελετήσεις ένα αρχείο
*.srt
υποτίτλων για να καταλάβεις την δομή του.
Εάν ανοίξεις ένα τέτοιο αρχείο με κάποιον text editor θα δεις πχ κάτι σαν αυτό:
23
00:02:44,065 --> 00:02:45,196
-Τι γίνεται;
-Για να δω.
Περιλαμβάνει λοιπόν έναν ακέραιο αριθμό, μια διάρκεια χρονική και το κείμενο των υπότιτλων.
- Δεύτερον, πρέπει να αναζητήσεις το καλύτερο εργαλείο για την δουλειά. Αναφέρεσαι σε script προφανώς bash σε Linux, αλλά έχεις σκεφτεί μήπως μια γλώσσα προγραμματισμού με έτοιμες βιβλιοθήκες θα ταίριαζε καλύτερα?
Η Python έχει την pysrt
βιβλιοθήκη για να διαβάζεις και να τροποποιείς αρχεία *.srt
:
- Τρίτον, για μετάφραση χρειάζεσαι έναν μεταφραστή, όπως το GoogleTranslate, το DeepL (πολύ καλύτερο) κτλπ. Αυτές οι υπηρεσίες δίνουν συνήθως API τα οποία μπορείς να χρησιμοποιήσεις στον κώδικά σου, με πληρωμή ή χωρίς.
Η Python έχει το python-translate module που είναι δωρεάν:
Ενώ το API με εγγραφή δωρεάν (μέχρι 500.000 χαρακτήρες τον μήνα) της DeepL προσφέρεται εδώ :
Αντίστοιχα υπάρχει για Python και της Google Translate το API.
Στο πρόβλημα σου τώρα, εγκαθιστώντας το pysrt και python-translate για την διανομή σου, ένας μικρός κώδικας σε Python, σαν τον παρακάτω:
import pysrt
from translate import Translator
def translate_subs():
translator= Translator(to_lang="el")
subs = pysrt.open("english.srt")
for sub in subs:
grsub = translator.translate(sub.text)
sub.text = grsub
subs.save('greek1.srt')
if __name__ == '__main__':
translate_subs()
κάνει αυτό που θέλεις για ένα αρχείο υποτίτλων με το όνομα english.srt
και δημιουργεί ένα καινούριο αρχείο με το όνομα greek.srt
.
-
Τέταρτον, ο χρόνος εκτέλεσης, εάν δοκιμάσεις τον παρακάτω κώδικα θα δεις ότι μεταφράζει μία πρόταση σε ένα δευτερόλεπτο, καταλαβαίνεις λοιπόν αντίστοιχα τους χρόνος μετατροπής των διαλόγων μια ολόκληρης ταινίας. Εδώ έρχεται η βελτιστοποίηση και πώς μπορείς να κάνεις τα πράγματα αποδοτικότερα.
-
Συμβουλή: Το ChatGPT είναι εργαλείο, για τέτοια προβλήματα κάνε δωρεάν έναν λογαριασμό με ένα gmail και ρώτα πράγματα κατά την υλοποίηση.
Τώρα για να φτιάξεις ένα Translation memory αρχείο όπως αναφέρει ο @kalligator θα μπορούσες, εάν! είναι ίδιος ο αριθμός των υπότιτλων στο αγγλικό (english.srt
)και στο ελληνικό αρχείο (greek.srt
) (εδώ έρχεται το data preprocessing) με τον παρακάτω κώδικα (πρόχειρα) να κάνεις κάτι τέτοιο:
import pysrt
def generate_subs():
subs = pysrt.open("english.srt")
total_sub=[]
for number in range(len(subs)):
total_sub.append(subs[number].text + "\n")
subs_gr = pysrt.open("greek.srt")
for number_gr in range(len(subs_gr)):
total_sub.insert(2*number_gr+1, subs_gr[number_gr].text + "\n")
f = open("all_subs.txt", "w")
for _ in total_sub:
f.write(_)
f.close()
if __name__ == '__main__':
generate_subs()
Όπου θα υπάρχουν εναλλάξ, στο νέο αρχείο all_subs.txt
, γραμμές με τα αγγλικά και τα ελληνικά.
Τέλος για την περίπτωση που έχεις ένα νέο αρχείο υπότιτλων στα αγγλικά (english_test.srt
), με τον παρακάτω όχι και τόσο αποδοτικό τρόπο μπορείς να σκανάρεις την database all_subs.txt
και να δημιουργήσεις ένα νέο αρχείο υπότιτλων με το όνομα greek_test.srt
.
import pysrt
def find_subs():
subs = pysrt.open("english_test.srt")
f = open("all_subs.txt", "r")
with open("all_subs.txt") as all_subs_file:
lines = f.readlines()
for i in range(len(lines)):
for sub in subs:
if sub.text + "\n" == lines[i]:
print(sub.text)
sub.text = lines[i+1]
subs.save('greek_test.srt')
f.close()
if __name__ == '__main__':
find_subs()
Από την διαδικασία ελπίζω να καταλάβεις αυτά που σου είπαν και οι προηγούμενοι. Σκέψουν την περίπτωση ότι ένα όνομα μόνο να αλλάζει σε μια κοινή πρόταση σε μια ταινία θα δημιουργήσει προβλήματα ή ακόμα και οι χρόνοι υλοποίησης σε μια μεγάλη βάση δεδομένων αποδεικνύουν ότι είναι ένα αρκετά πολύπλοκο πρόβλημα.