|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 19.01.2019, 15:41 Titel: Brauche Hilfe für ein einfaches Programm |
|
|
Hallo Leute,
ich habe seit vielen Jahren nichts mehr mit Basic gemacht und habe bisher im Netz auch kein Programm gefunden, dass die Aufgabe, zu der ich es brauche, erfüllt.
Es geht um Folgendes:
ich habe mit Spracherkennungssoftware die gesprochene Sprache eines Films in eine Textdatei konvertiert. Ich möchte daraus einen Untertiteldatei machen, die ich unter den Film lege.
Es fehlt natürlich der Timecode/Timestamp, damit die Textzeilen auch am richtigen Ort erscheinen. den Timecode konnte ich aber mit einem anderen Tool schon automatisch und im richtigen Format herauslesen.
Ich habe nun zwei Dateien im txt Format. Einmal den Timecode und einmal den Text aus dem Film.
Ich bräuchte nun ein Programm, das die beiden Textdateien zusammenführt.
Die Textdatei, die es generiert soll zuerst die Timecodes darstellen und danach den Text aus dem Film.
Ein weiteres Tool, das ich habe, kann dann diesen vielleicht unvollkommenen Textfile mit der Videodatei wieder synchronisieren...
Es geht also, einfach gesagt, darum, die Timecodes der einen Textdatei in die Textdatei zu integrieren. Zb, indem man bei Programmstart des benötigten Programms die beiden Dateien angibt und dann ggf noch einen Zeilenabstand angibt. ZB. Jede dritte Textzeile wird einer der Timecodes vor den Text eingefügt.
Kann mir hier jemand Hilfe. Mangels Praxis und Übung kann ich mir ein solches Programm sehr gut und einfach vorstellen, aber es nicht selbst schreiben zzt.
Bin hier um jede Hilfe dankbar! Fragen nach weiteren Informationen etc. natürlich sehr willkommen
Lg Klen |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 20.01.2019, 16:02 Titel: |
|
|
Hallo klendathu und willkommen im Forum!
Ich habe mal mein QB ausgemottet und "Quick & Dirty" ein kleines Programm zusammengestoppelt, das einen ersten Eindruck für einen Lösungsweg geben könnte. Testen konnte ich es in Ermangelung geeigneter Eingabedaten nicht, aber ich hoffe mal, daß ich keinen gravierenden Denkfehler gemacht habe:
Code: | 'eingaben
INPUT "Textdatei:"; text$
INPUT "Timecodedatei:"; timecode$
INPUT "Zeilenabstand:"; zeilen%
INPUT "Ausgabedatei:"; ausgabe$
'eingabedateien öffnen
OPEN text$ FOR INPUT AS #1
OPEN timecode$ FOR INPUT AS #2
'ausgabedatei öffnen
OPEN ausgabe$ FOR OUTPUT AS #3
DO
LINE INPUT #2, zeit$ 'timecode einlesen
PRINT #3, zeit$ 'timecode in ausgabedatei schreiben
FOR x% = 1 TO zeilen% 'text einlesen
IF EOF(1) THEN
EXIT DO 'keine weiteren textzeilen --> programm beenden
ELSE
LINE INPUT #1, t$ 'textzeile einlesen
PRINT #3, t$ 'textzeile in ausgabedatei schreiben
END IF
NEXT
LOOP
CLOSE 'alle dateien schliessen |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 20.01.2019, 18:45 Titel: |
|
|
Hey,
Schon mal richtig vielen Dank!!! Das Programm scheint zu laufen...
Kannst du die txtfiles hier mal für mich ausprobieren und es testen?
https://ufile.io/nowu6
eine datei hat die timecodes, die andere einen sampletext
Wäre echt nett, wenn du mir das prg zu ner exe kompilieren kannst!
Wenn du dir die Mühe machen würdest, wäre das echt super...
Lg Klen |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 21.01.2019, 11:51 Titel: |
|
|
klendathu hat Folgendes geschrieben: | Kannst du die txtfiles hier mal für mich ausprobieren und es testen? | Was ist das für ein Dateiformat? Ich kann damit leider nichts anfangen.
klendathu hat Folgendes geschrieben: | Wäre echt nett, wenn du mir das prg zu ner exe kompilieren kannst! | Kein Problem, aber das mache ich dann mit freeBasic.
Hier der FB - Quellcode (mit ein paar kleinen Verbesserungen): Code: | Dim As String text, timecode, ausgabe, zeit, t
Dim As Integer zeilen
'eingaben
Input " Textdatei:"; text
Input "Timecodedatei:"; timecode
Input "Zeilenabstand:"; zeilen
Input " Ausgabedatei:"; ausgabe
Print
'eingabedateien öffnen
If Open (text For Input As #1) Then
Print "Textdatei nicht gefunden"
Sleep
End
EndIf
If Open (timecode For Input As #2) Then
Print "Timecodedatei nicht gefunden"
Sleep
End
EndIf
'ausgabedatei öffnen
If Open (ausgabe For Output As #3) Then
Print "Konnte Ausgabedatei nicht öffnen"
Sleep
End
EndIf
Do
Line Input #2, zeit 'timecode einlesen
Print #3, zeit 'timecode in ausgabedatei schreiben
For x As Integer = 1 To zeilen 'text einlesen
If Eof(1) Then
Exit Do 'keine weiteren textzeilen --> programm beenden
Else
Line Input #1, t 'textzeile einlesen
Print #3, t 'textzeile in ausgabedatei schreiben
End If
Next
Loop
Close 'alle dateien schliessen
Print "OK"
Sleep
|
Die .exe habe ich hier hochgeladen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 21.01.2019, 15:11 Titel: |
|
|
hi,
Vielen Dank!!!!
Zu deiner Frage: Sorry, ich habe die Dateien mit winace verpackt. das benutzt kaum jemand mehr inzwischen und .ace ist nur von diesem programm unterstützt.
Das Programm funktioniert ziemlich gut... Es gibt da aber noch ein Problemchen.
Es sieht so aus, als würde der Text nicht genau an die Anzahl der Timecodes angepasst.
Ist vielleicht ein wenig schwer hier zu erklären.
Deswegen habe ich dir hier die Dateien nochmal separat und unverpackt hochgeladen zum ausprobieren, wenn du magst.
Es fällt dir vielleicht sofort auf...
Hier die Links.
https://ufile.io/fuko5
https://ufile.io/phkl3
https://ufile.io/uxn7d
Es ist auch ein Beispiel dabei, wie es in etwa aussehen sollte. Die Srt Datei (einfach im notepad öffnen).
Wäre echt super, wenn du es dir nochmal kurz anschauen könntest.
Ansonsten schon mal toller Job! Vielen Dank
Lg Klen |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 22.01.2019, 01:09 Titel: |
|
|
Das macht die Sache jetzt *ein bisschen* komplizierter.
Irgendwie passen Text und Timecodes von der Anzahl her nicht zusammen. Ich habe mal den passendsten Kompromiss gesucht und die Texte nach jedem Punkt und jedem Komma getrennt.
Code: | Declare Function zerlegen(text As String = "", trennzeichen As String = "") As String
Dim As String text, timecode, ausgabe, zeit, t, g
Dim As Integer zeilen, punkte, anfang, ende
'eingaben
Input " Textdatei:"; text
Input "Timecodedatei:"; timecode
'Input "Zeilenabstand:"; zeilen
Input " Ausgabedatei:"; ausgabe
Print
'text = exepath + "\text.txt"
'timecode = exepath + "\timecodesample.txt"
'ausgabe = exepath + "\ausgabe.srt"
'eingabedateien öffnen
If Open (text For Input As #1) Then
Print "Textdatei nicht gefunden"
Sleep
End
EndIf
If Open (timecode For Input As #2) Then
Print "Timecodedatei nicht gefunden"
Sleep
End
EndIf
'ausgabedatei öffnen
If Open (ausgabe For Output As #3) Then
Print "Konnte Ausgabedatei nicht öffnen"
Sleep
End
EndIf
Do Until Eof(1)
Line Input #1, t 'nächste textzeile holen
If t = "" Then 'leerzeile
Continue Do
EndIf
zeilen += 1
g = zerlegen(t, ",.")
Do While Len(g)
punkte += 1
Do
Line Input #2, zeit 'laufende nummer
If Eof(2) Then 'keine weiteren timecodes
Exit Do, Do
EndIf
Loop Until Len(zeit) 'leerzeilen überlesen
Print zeit
Print #3, zeit
Line Input #2, zeit 'timecode
Print zeit
Print #3, zeit
Print Trim(g)
Print #3, Trim(g) 'untertitel
Print
Print #3, ""
g = zerlegen() 'nächster teilstring
Loop
Loop
Print zeilen, punkte
Close 'alle dateien schliessen
Print "OK"
Sleep
Function zerlegen(text As String = "", trenner As String = "") As String
Static As Integer anfang, ende
Static As String txt, tr
If Len(trenner) Then
tr = trenner
EndIf
If Len(text) Then
txt = text
anfang = 1
ende = 1
EndIf
If (tr = "") Or (txt = "") Then
Return "" 'fehler
EndIf
ende = InStr(anfang, txt, Any tr)
Function = Mid(txt, anfang, ende - anfang + 1)
anfang = ende + 1
End Function |
http://users.freebasic-portal.de/grindstone/bin/Untertitel2u.exe
Sinnvoller wäre es, wenn der Text an den passenden Stellen eindeutige Trennzeichen enthielte (entweder von Hand oder -irgendwie- automatisch gesetzt). Das Trennzeichen müsste ein Zeichen sein, das im Text sonst garantiert nicht vorkommt, beispielsweise das "#". Der Text könnte dann etwa so aussehen: Lorem ipsum dolor sit amet, consectetur adipiscing elit.#Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut.#Vestibulum ullamcorper accumsan velit vel vehicula.#Proin tempor lacus arcu. Nunc at elit condimentum,#semper nisi et, condimentum mi.#In venenatis blandit nibh at sollicitudin... usw.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 22.01.2019, 15:11 Titel: |
|
|
Das ist perfekt, wie du es hinbekommen hast
Du bist mein Held
Wäre es aufwendig, in dem programm noch eine routine einzubauen, die in regelmäßigen abständen ein solchen wiederkehrendes symbol einfügt? Zb Punkt, Komma, etc.... So dass Text und Code nachher passend sind?
Noch eine Frage? Wäre es möglich, diese "Silence" einfügungen noch durch die Software entfernen zu lassen, so dass sie im fertigen txtfile gar nicht mehr auftauchen?
Dann wäre es perfekt!!!
Ansonsten schon mal ganz toller Job, du hast mir SEHR geholfen!!! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 23.01.2019, 00:44 Titel: |
|
|
klendathu hat Folgendes geschrieben: | Das ist perfekt, wie du es hinbekommen hast lächeln
Du bist mein Held lächeln | Nu übertreib mal nicht. Und von Perfektion ist das Programm noch ein ganzes Stück entfernt.
Zitat: | Wäre es aufwendig, in dem programm noch eine routine einzubauen, die in regelmäßigen abständen ein solchen wiederkehrendes symbol einfügt? | Auf jeden Fall wäre es eine interessante Aufgabe, einen passenden Algorithmus zu entwickeln. Die Sprech- und Pausenzeiten dürften sich aus den Timecodes ableiten lassen: Anfangszeitpunkt bis Endzeitpunkt --> Sprechzeit, Endzeitpunkt bis Anfangszeitpunkt des nächsten Timecodes --> Sprechpause. Dann braucht man nur noch eine ungefähre Vorstellung davon, wieviel Text in welcher Zeit gesprochen wird...
Mal nachdenken...
Zitat: | Wäre es möglich, diese "Silence" einfügungen noch durch die Software entfernen zu lassen, so dass sie im fertigen txtfile gar nicht mehr auftauchen? | Wenn du mir verrätst, woran ich die Einfügungen erkenne... Meinst du die Zeilenumbrüche bzw. Leerzeilen?
Brauchst du das Programm öfter? Dann würde ich noch ein paar Routinen einfügen, die die Eingabe etwas komfortabler machen. Für einen einmaligen Job würde sich der Aufwand allerdings nicht lohnen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 23.01.2019, 14:47 Titel: |
|
|
Hier ein erster Versuch, die Textlänge an den Timecode anzupassen. Das Programm ermittelt aus dem Timecode die Länge des Textes (in Millisekunden) und berechnet dann mithilfe des Wertes "Buchstaben/ms" die ungefähre Anzahl der in dieser Zeit gesprochenen Buchstaben (besser wäre "Silben/ms", aber das würde den Rahmen dieses Programms sprengen). Von dort aus wird -in beide Richtungen- das nächstliegende Satzzeichen gesucht und das entsprechende Textstück herausgetrennt.
Ein guter Anfangswert für "Buchstaben/ms" ist .01. Außerdem kannst du festlegen, ob der Text auch nach Leerzeichen getrennt werden soll oder nur nach Satzzeichen (".,;:"). Code: | Declare Function msec(zeit As String) As Integer
Dim As String text, timecode, ausgabe, zeit, t, g, txt, timevon, timebis, leerzeichen, trenner, nummer
Dim As Integer zeilen, punkte, anfang, ende, x, timediff, buchstaben, naechster, voriger
Dim As Double laenge
''eingaben
Input " Textdatei:"; text
Input "Timecodedatei:"; timecode
Input "Zeilenabstand:"; zeilen
Input "Buchstaben/ms:"; laenge
Input " Ausgabedatei:"; ausgabe
Input "Bei Leerzeichen trennen? J/N"; leerzeichen
Print
'text = ExePath + "\text.txt"
'timecode = ExePath + "\timecodesample.txt"
'ausgabe = ExePath + "\ausgabe.srt"
'laenge = .01 'buchstaben pro millisekunde
'leerzeichen = "j"
'eingabedateien öffnen
If Open (text For Input As #1) Then
Print "Textdatei nicht gefunden"
Sleep
End
EndIf
If Open (timecode For Input As #2) Then
Print "Timecodedatei nicht gefunden"
Sleep
End
EndIf
'ausgabedatei öffnen
If Open (ausgabe For Output As #3) Then
Print "Konnte Ausgabedatei nicht öffnen"
Sleep
End
EndIf
anfang = 1
ende = 1
trenner = IIf(leerzeichen = "j", ".,;: ", ".,;:")
txt = Input(Lof(1), 1) 'gesamtes textfile in string laden
Do 'timecodedatei abarbeiten
Line Input #2, g
If InStr(g, "-->") Then 'timecode
timevon = Left(g, InStr(g, "-->") - 2)
timebis = Mid(g, InStr(g, "-->") + 4)
timediff = msec(timebis) - msec(timevon)
buchstaben = Int(timediff * laenge + .5)
naechster = InStr(anfang + buchstaben, txt, Any trenner)
voriger = InStrRev(txt, Any trenner, anfang + buchstaben)
If naechster = 0 Then
ende = voriger
ElseIf voriger = 0 Then
ende = naechster
ElseIf voriger < anfang Then
ende = naechster
ElseIf Abs(naechster - (anfang + buchstaben)) <= Abs(voriger - (anfang + buchstaben)) Then
ende = naechster
Else
ende = voriger
EndIf
If ende > anfang Then
Print #3, nummer
Print #3, g
Print #3, Mid(txt, anfang, ende - anfang + 1)
Print #3, ""
anfang = ende + 1
Else
Exit Do
EndIf
Do While txt[anfang - 1] = Asc(" ")
anfang += 1
Loop
ElseIf g = "" Then 'leerzeile
'nichts tun
Else 'nummer
nummer = g
EndIf
Loop Until Eof(2)
? "OK"
Close
Sleep
End
Function msec(zeit As String) As Integer
Dim As String std, min, sec
Dim As Integer ret
std = Left(zeit, 2)
min = Mid(zeit, 4, 2)
sec = Mid(zeit, 7, 2)
ret = 3600000 * Val(std) + 60000 * Val(min) + 1000 * Val(sec) + Val(Mid(zeit, 10))
Return ret
End Function |
http://users.freebasic-portal.de/grindstone/bin/Untertitel3u.exe
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 23.01.2019, 15:45 Titel: |
|
|
grindstone hat Folgendes geschrieben: | klendathu hat Folgendes geschrieben: | Das ist perfekt, wie du es hinbekommen hast lächeln
Du bist mein Held lächeln | Nu übertreib mal nicht. Und von Perfektion ist das Programm noch ein ganzes Stück entfernt.
Zitat: | Wäre es aufwendig, in dem programm noch eine routine einzubauen, die in regelmäßigen abständen ein solchen wiederkehrendes symbol einfügt? | Auf jeden Fall wäre es eine interessante Aufgabe, einen passenden Algorithmus zu entwickeln. Die Sprech- und Pausenzeiten dürften sich aus den Timecodes ableiten lassen: Anfangszeitpunkt bis Endzeitpunkt --> Sprechzeit, Endzeitpunkt bis Anfangszeitpunkt des nächsten Timecodes --> Sprechpause. Dann braucht man nur noch eine ungefähre Vorstellung davon, wieviel Text in welcher Zeit gesprochen wird...
Mal nachdenken...
Zitat: | Wäre es möglich, diese "Silence" einfügungen noch durch die Software entfernen zu lassen, so dass sie im fertigen txtfile gar nicht mehr auftauchen? | Wenn du mir verrätst, woran ich die Einfügungen erkenne... Meinst du die Zeilenumbrüche bzw. Leerzeilen?
Brauchst du das Programm öfter? Dann würde ich noch ein paar Routinen einfügen, die die Eingabe etwas komfortabler machen. Für einen einmaligen Job würde sich der Aufwand allerdings nicht lohnen.
Gruß
grindstone |
Ich übertreibe nicht
Ich habe dir aus Versehen eine Timelinedatei geschickt, die ich schon per hand aufgeräumt habe. da fehlen zeilen, die in der datei, die ich ursprünglich ausgegeben bekomme, wenn ich den timecode per tool auslese.
ich schick dir hier nochmal die datei, die ich herausbekomme:
https://ufile.io/j5r70
hier sind noch zeilen drin, wie "linie 1... silence (xxx) etc.)
Wenn du die durch dein Programm noch entfernen lassen könntest, wäre das wirklich noch eine arbeitsersparnis.
Ja, das ist bestimmt nicht einfach, aus den timecodes abzuleiten, wann ein solches zeichen eigefügt werden kann...
ich hätte evtl folgende idee, wie ich auch etwas behilflich sein könnte? was häst du davon:
ich extrahiere aus ein paar serienfolgen fließtext und beziehe es auf die sprechzeit gesamt der jeweiligen folge anhand der timescodes...
das mache ich insgesamt für ca 4-10 folgen und versuche dann pi mal daumen zu sagen, wieviel wörter durchschnittlich auf einen bestimmten zeitraum kommen, bis ein "trennsymbol" eingefügt werden könnte. Dann teile ich dir das ergebnis mit.
wäre das zb etwas, das dir vorschwebt?
Ja, ich brauche das Programm öfter. Schon mal richtig vielen Dank, dass du mir da so behilflich bist!!!!
Lg Klen |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 23.01.2019, 17:52 Titel: |
|
|
oder willst du das vom programm selbst anhand der timecodedaten und der textdatei jeweils berechnen lassen? |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 24.01.2019, 13:14 Titel: |
|
|
klendathu hat Folgendes geschrieben: | ...hier sind noch zeilen drin, wie "linie 1... silence (xxx) etc.)
Wenn du die durch dein Programm noch entfernen lassen könntest, wäre das wirklich noch eine arbeitsersparnis. | Entfernen ist nicht nötig, man kann das Programm anweisen, diese Zeilen einfach zu ignorieren (genau wie die Leerzeilen).
Zitat: | ich hätte evtl folgende idee, wie ich auch etwas behilflich sein könnte? was häst du davon:
ich extrahiere aus ein paar serienfolgen fließtext und beziehe es auf die sprechzeit gesamt der jeweiligen folge anhand der timescodes...
das mache ich insgesamt für ca 4-10 folgen und versuche dann pi mal daumen zu sagen, wieviel wörter durchschnittlich auf einen bestimmten zeitraum kommen, bis ein "trennsymbol" eingefügt werden könnte. | Das ist genau das, was der Wert "Buchstaben/ms" macht. Da kannst du ein wenig mit herumexperimentieren, bis es passt.
Einen genaueren Zusammenhang zwischen Textlänge und Sprechdauer gäbe -wie schon erwähnt- "Silben/ms", aber dafür bräuchte man ein Wörterbuch für die entsprechende Sprache mit Silbenkennzeichnung.
Hm, nemored, du bist doch unser Sprachexperte hier. Gibt es sowas als Wiki (die Beispieldatei ist in Latein)?
Zitat: | oder willst du das vom programm selbst anhand der timecodedaten und der textdatei jeweils berechnen lassen? | Ja, man könnte aus der Anzahl der Buchstaben ( = Länge des Textfiles) und der Gesamtdauer (letzter Timecode minus erster Timecode) einen Vorschlag für "Buchstaben/ms" berechnen.
Zitat: | Ja, ich brauche das Programm öfter. | Dann lasse ich das Programm ein .ini - File anlegen, in dem die Eingaben abgespeichert werden, damit du nicht jedesmal alles komplett neu eintippen musst.
Guß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4637 Wohnort: ~/
|
Verfasst am: 24.01.2019, 15:53 Titel: |
|
|
Was meinst du? Ob es Silbentrennungen als öffentlich zugängliche Daten gibt? Da würde ich am ehesten im Open-Source-Bereich suchen, also z. B. in den Wörterbuchdateien, die unter Linux verwendet werden. Die Wörterbuchdateien von LibreOffice müssten ja auch frei sein. Ich kenne allerdings deren Format nicht.
Am einfachsten (aber etwas ungenau) wäre es sicher, Vokale zu zählen. Eine Silne enthält im Deutschen immer genau einen Vokal oder einen Diphthong. Wenn du also auf einen einzelnen Vokal stößt, weißt du, dass er zu einer Silbe gehört; beim Aufeinandertreffen zweier oder mehrerer Vokale muss man dann allerdings schauen, ob es sich um einen Diphthong (eine Silbe) oder zwei getrennte Vokale (zwei Silben) handelt. Nur mal so als grober Gedankenansatz. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 24.01.2019, 17:26 Titel: |
|
|
hallo,
erst mal richtig vielen dank ich halte den ansatz, die buchstaben zu nehmen um den text auf die zeilen aufzuteilen für gut.
ich probiere es heute aus.
wäre die routine zur entfernung der silence zeile schon drin? oder könntest du mir die exe noch hochladen und posten?
lg Klen |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 25.01.2019, 12:57 Titel: |
|
|
@nemored: Danke für den Hinweis mit den Vokalen, es funktioniert deutlich besser als das Abzählen von Wörtern oder Buchstaben.
Das Programm berechnet aus der Summe aller Vokale geteilt durch die Summe alle Einblendzeiten einen Wert für "Silben/ms" und damit dann für jeden Timecode den entsprechenden Textabschnitt. Die Zeitabweichung über die gesamte (Beispiel-) Datei liegt bei etwa 2 1/2 Minuten, da ist noch etwas Feintuning erforderlich.
@klendathu: Das Programm legt jetzt automatisch eine .ini-Datei an, in der alle Eingaben abgespeichert werden, so daß du nicht jedesmal alles neu eintippen mußt. Für die Timecodedatei habe ich eine positive Zeilenerkennung programmiert, d.h., es wird nur die laufende Nummer und der Timecode ausgewertet, alles andere wird ignoriert.
EDIT:
Ich habe noch einen Korrekturfaktor hinzugefügt. Für die Beispieldatei lässt sich die Abweichung mit einem Wert von .967 (mehr Nachkommastellen bringen keine Verbesserung mehr) auf ca. 6 Sekunden reduzieren.
EDIT 2:
Nächste Ausbaustufe. Das Programm passt den Text automatisch so gut wie möglich in die Timecodes ein.
Code: | #Include Once "file.bi"
Function ini OverLoad (datei As String, schluessel As String) As String
Dim As Integer ff
Dim As String g
ff = FreeFile
If Open(datei For Input As #ff) Then
Return ""
EndIf
Do
Line Input #ff, g
If Left(g, Len(schluessel) + 1) = schluessel + "=" Then
Close ff
Return Mid(g, InStr(g, "=") + 1)
EndIf
Loop Until Eof(ff)
Close ff
Return ""
End Function
Function ini (datei As String, schluessel As String, wert As string) As Integer
Dim As Integer ff, ft
Dim As String g, td
Dim As boolean gefunden = FALSE
ff = FreeFile
If Open(datei For Input As #ff) Then
Return 1 'fehler
EndIf
td = Left(Command(0), Len(Command(0)) - 3) + "tmp"
ft = FreeFile
If Open(td For Output As #ft) Then
Close ff
Close ft
Return 1 'fehler
EndIf
Do
Line Input #ff, g
If Left(g, Len(schluessel) + 1) = schluessel + "=" Then
Print #ft, schluessel + "=" + wert
gefunden = TRUE
Else
Print #ft, g
EndIf
Loop Until Eof(ff)
If gefunden = FALSE Then
Print #ft, schluessel + "=" + wert
EndIf
Close ff
Close ft
Kill datei
Name td, datei
End Function
Function stringmod(text As String = "", modus As Integer = 0) As String
'die angabe von 'modus' ist optional, defaultwert ist 0
'modus0 --> normale funktion
'modus1 --> kehrt nach 'pfeil nach oben', 'pfeil nach unten', 'bild nach oben' und
' 'bild nach unten'zum hauptprogramm zurück
'modus4 --> setzt nur die variable 'vorigertext' und kehrt dann zurück
'modus8 --> setzt bei druck auf esc - taste code 27 (esc) vor den rückgabestring
Dim As Integer ze, sp, co, gi, ms, mz, rad, tasten, laenge
Dim As String g, merken, txt, g2
Static As String vorigertext
If (modus And 4) Then
vorigertext = text + " "
Return text
EndIf
If vorigertext = "" Then
vorigertext = " "
EndIf
txt = text + " "
merken = txt
co = Pos 'cursor offset
ze = CsrLin
sp = Len(txt) 'zeiger auf zeichen unter cursor
Locate ze, co, 1
Print txt;
Locate ze, sp+co-1, 1
Do
'eingabe
g = InKey
If Len(g) = 1 Then 'normales zeichen
If g[0] > 31 Then 'normaler buchstabe
txt = Left(txt, sp - 1) + g + Mid(txt, sp)
sp += 1
Locate ze, co, 0
Print txt;
Locate ze, sp+co-1, 1
Else 'steuerzeichen
Select Case g[0]
Case 8 ' Rücktaste
If sp > 1 Then
txt = Left(txt, sp - 2) + Mid(txt, sp)
sp -= 1
Locate ze, co, 0
Print txt;
Locate ze, sp+co-1, 1
End If
Case 13
'return
Case 27 'esc
If (modus And 8) Then
txt = Chr(27) + txt
Else
txt = merken 'alter string
EndIf
g = Chr(13) 'beenden
Case Else
'Print "*"; g; "*"; ASC(g) 'code von unbekannter taste anzeigen
End Select
End If
ElseIf Len(g) = 2 Then 'steuerzeichen
gi = g[1]
Select Case gi 'steuerzeichen
Case 75 'pfeil nach links -> cursor nach links
If sp > 1 Then
sp -= 1
Locate ze, sp+co-1, 1
End If
Case 77 'pfeil nach rechts -> cursor nach rechts
If sp < Len(txt) Then
sp += 1
Locate ze, sp+co-1, 1
ElseIf txt = " " Then 'vorherigen string setzen
txt = vorigertext
sp = Len(txt)
Print txt;
Locate ze, sp+co-1, 1
End If
Case 14 'rücktaste -> zeichen vor cursor löschen
If sp > 1 Then
txt = Left(txt, sp - 1) + Mid(txt, sp)
sp -= 1
Locate ze, co, 0
Print txt;
Locate ze, sp+co-1, 1
End If
Case 83 'entf -> zeichen hinter cursor löschen
If sp < Len(txt) Then
txt = Left(txt, sp - 1) + Mid(txt, sp + 1)
Locate ze, co, 0
Print txt;
Locate ze, sp+co-1, 1
End If
Case 71 'pos1 -> cursor an stringanfang setzen
sp = 1
Locate ze, sp+co-1, 1
Case 79 'ende -> cursor an stringende setzen
sp = Len(txt)
Locate ze, sp+co-1, 1
Case Else
If (modus And 1) Then
txt = g + Chr(ze) + Chr(co) + txt 'steuerzeichen und cursorposition zurückgeben
g = Chr(13)
EndIf
'Print "*"; g; "*";Asc(Right(g,1)) 'code von unbekannter taste anzeigen
End Select
Else 'keine taste
Sleep 1 'zur ressourcenschonung
End If
Loop Until g = Chr(13) 'return
vorigertext = txt
Return Left(txt, Len(txt) - 1)
Locate ze, sp+co-1, 0 'cursor aus
End Function
Function msec(zeit As String) As Integer
Dim As String stunden, minuten, sekunden
Dim As Integer ret
stunden = Left(zeit, 2)
minuten = Mid(zeit, 4, 2)
sekunden = Mid(zeit, 7, 2)
ret = 3600000 * Val(stunden) + 60000 * Val(minuten) + 1000 * Val(sekunden) + Val(Mid(zeit, 10))
Return ret
End Function
Dim As String text, timecode, ausgabe, g, txt, timevon, timebis, trenner, nummer, inidatei, _
timebismax, letzter
Dim As Integer anfang, ende, x, timediff, buchstaben, naechster, voriger, silben, umschlag
Dim As Double laenge, korrektur
Dim As boolean fertig = FALSE
inidatei = Left(Command(0), Len(Command(0)) - 3) + "ini"
If Not FileExists(inidatei) Then 'inidatei anlegen
Open inidatei For Output As #1
Close 1
EndIf
'eingaben
text = ini(inidatei, "text") 'name aus inidatei holen
Print " Textdatei: ";
text = stringmod(text) 'namen eingeben / bearbeiten
ini(inidatei, "text", text) 'neuen namen in inidatei schreiben
Print
If Open (text For Input As #1) Then
Print "Textdatei nicht gefunden"
Sleep
End
EndIf
txt = Input(Lof(1), 1) 'gesamtes textfile in string laden
Close 1
timecode = ini(inidatei, "timecode")
Print "Timecodedatei: ";
timecode = stringmod(timecode)
ini(inidatei, "timecode", timecode)
Print
If Open (timecode For Input As #2) Then
Print "Timecodedatei nicht gefunden"
Sleep
End
EndIf
ausgabe = ini(inidatei, "ausgabe")
Print " Ausgabedatei: ";
ausgabe = stringmod(ausgabe)
ini(inidatei, "ausgabe", ausgabe)
Print
'ausgabedatei öffnen
If Open (ausgabe For Output As #3) Then
Print "Konnte Ausgabedatei nicht öffnen"
Sleep
End
EndIf
'gesamtzahl der vokale ermitteln
For x = 0 To Len(txt) - 1
If InStr("aeiouäöüy", Chr(txt[x])) Then 'vokal
silben += 1
EndIf
Next
'zeiten aufaddieren
Do
Line Input #2, g
If InStr(g, "-->") Then 'timecode
timevon = Left(g, InStr(g, "-->") - 2)
timebis = Mid(g, InStr(g, "-->") + 4)
timediff += msec(timebis) - msec(timevon)
EndIf
Loop Until Eof(2)
timebismax = timebis
'variablen initialisieren
laenge = silben / timediff 'wert für silben/ms berechnen
korrektur = 1
trenner = ".,;: "
Print
Print "Berechne Korrekturfaktor..."
Do
anfang = 1
ende = 1
Seek 2, 1 'dateizeiger zurücksetzen
Do 'timecodedatei abarbeiten
Line Input #2, g
If InStr(g, "-->") Then 'timecode
timevon = Left(g, InStr(g, "-->") - 2)
timebis = Mid(g, InStr(g, "-->") + 4)
timediff = msec(timebis) - msec(timevon) 'einblendzeit in ms
silben = Int(timediff * laenge * korrektur + .5) 'anzahl der silben berechnen
buchstaben = 0
Do 'silben abzählen und anzahl der buchstaben ermitteln
buchstaben += 1
If InStr("aeiouäöüy", Chr(txt[anfang + buchstaben])) Then 'vokal
silben -= 1
EndIf
Loop While silben
naechster = InStr(anfang + buchstaben, txt, Any trenner) 'nächsten trenner suchen
voriger = InStrRev(txt, Any trenner, anfang + buchstaben) 'vorhergehenden trenner suchen
'zeiger auf ende des textabschnitts setzen
If naechster = 0 Then
ende = voriger
ElseIf voriger = 0 Then
ende = naechster
ElseIf voriger < anfang Then
ende = naechster
ElseIf Abs(naechster - (anfang + buchstaben)) <= Abs(voriger - (anfang + buchstaben)) Then
ende = naechster
Else
ende = voriger
EndIf
If (umschlag > 2) And (letzter = "time") Then 'werte in ausgabedatei schreiben
Print #3, nummer
Print nummer
Print #3, g
Print g
g = Mid(txt, anfang, ende - anfang + 1)
Do While InStr(g, "#")
Mid(g, InStr(g, "#"), 1) = " "
Loop
Print #3, g
Print g
Print #3, ""
Print ""
fertig = TRUE
EndIf
If ende > anfang Then
anfang = ende + 1 'zeiger auf beginn des nächsten textabschnitts
Else 'text zuende
If letzter = "time" Then
umschlag += 1
EndIf
letzter = "text"
korrektur -= .001 'korrekturfaktor vermindern
Exit Do
EndIf
Do While txt[anfang - 1] = Asc(" ")
anfang += 1
Loop
ElseIf Str(Val(g)) = g Then 'nummer
nummer = g
Else
'ignorieren --> nächste zeile
EndIf
Loop Until Eof(2)
If Eof(2) Then 'timecodes zuende
If letzter = "text" Then
umschlag += 1
EndIf
letzter = "time"
korrektur += .001 'korrekturfaktor erhöhen
EndIf
Loop Until fertig
Close
Print "Fertig"
Sleep
|
http://users.freebasic-portal.de/grindstone/bin/Untertitel6u.exe
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 31.01.2019, 15:09 Titel: |
|
|
Hi,
sorry für die späte antwort. ich hatte einen kleinen pc crash und kam nebenbei zu wenig... ich hoffe du verzeihst mir
Das Programm funktioniert toll! Ich habe es ausprobiert und bin sehr begeistert. Du hast da einen tollen Job gemacht
Ich würde deine Email oder deinen Namen noch ins Programm einfügen. Vielleicht will ich ein kleines Tutorial schreiben und das Programm (wenn ich darf) daei mit veröffentlichen. Dann wäre es sicher gut, wenn die Leute dich auch kontaktieren können
Wäre es möglich das Programm auch batch-kompatibel zu machen?
zb. wenn sich im verzeichnis jeweils textdatei und timecodedatei befinden würden mit leicht unterschiedlichen dateinamen?
zb
bravehearttext.txt
bravehearttimecode.txt
Das wäre natürlich noch praktisch und schick^^
Lg
Klen |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 01.02.2019, 13:20 Titel: |
|
|
Danke, es freut mich, daß dir das Programm gefällt.
Zitat: | Vielleicht will ich ein kleines Tutorial schreiben und das Programm (wenn ich darf) daei mit veröffentlichen. | Natürlich darfst du. Ist alles Open Source hier (Lizensierung FBPSL).
Zitat: | Wäre es möglich das Programm auch batch-kompatibel zu machen? | Was genau meinst du damit? Daß das Programm in einem Rutsch mehrere Untertiteldateien erstellt, die in einer (Batch-) Datei aufgelistet sind? Sicher ginge das. Man könnte den Namen der Datei, die diese Liste enthält, z.B. beim Programmstart als Kommandozeilenparameter übergeben.
Ein kleiner Hinweis: Statt die Namen der Quelldateien einzutippen, kannst du sie auch einfach mit der Maus auf das Konsolenfenster ziehen. Das geht schneller und vermeidet Tippfehler.
Gruß
grinddstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 02.02.2019, 00:52 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Danke, es freut mich, daß dir das Programm gefällt.
Zitat: | Vielleicht will ich ein kleines Tutorial schreiben und das Programm (wenn ich darf) daei mit veröffentlichen. | Natürlich darfst du. Ist alles Open Source hier (Lizensierung FBPSL).
Zitat: | Wäre es möglich das Programm auch batch-kompatibel zu machen? | Was genau meinst du damit? Daß das Programm in einem Rutsch mehrere Untertiteldateien erstellt, die in einer (Batch-) Datei aufgelistet sind? Sicher ginge das. Man könnte den Namen der Datei, die diese Liste enthält, z.B. beim Programmstart als Kommandozeilenparameter übergeben.
Ein kleiner Hinweis: Statt die Namen der Quelldateien einzutippen, kannst du sie auch einfach mit der Maus auf das Konsolenfenster ziehen. Das geht schneller und vermeidet Tippfehler.
Gruß
grinddstone |
Es funktioniert sehr gut! Ganz toll!
Ich würde vielleicht noch deinen namen,emailadresse, homepage ins programm hinzufügen, damit man dich auch kontaktieren kann, evtl. auch für prommierjobs Abgesehen davon ist es ja auch ein Programm, das den Namen des Programmierers verdient.
Ja, ein batch-modus wäre praktisch...
Ginge das vielleicht nach dateinamen?
ich bekomme zb folgende dateinamen nach umwandlung heraus:
bravehearttext.txt
bravehearttimecode.txt
liese sich so etwas zb automatisiert zusammenführen?
lg
Klen |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 03.02.2019, 17:08 Titel: |
|
|
Ich bin immer noch nicht sicher, ob ich dich richtig verstanden habe. Meinst du das so, daß du im Programm -um bei deinem Beispiel zu bleiben- "braveheart" eingibst (evtl. mit Pfadangabe), und das Programm die Dateien "bravehearttext.txt" und "bravehearttimecode.txt" als Eingabedateien öffnet und "braveheart.srt" als Ausgabedatei anlegt? Natürlich ginge das.
Oder soll das Programm nach dem Starten in einem bestimmten Verzeichnis (entweder seinem eigenen oder einem angegebenen) nach Dateien suchen, die mit "...text.txt" und "...timecode.txt" enden und daraus die passenden 3 Dateinamen generieren? Auch das wäre möglich.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 03.02.2019, 18:57 Titel: |
|
|
Hi grindstone,
ich meinte die zweite variante. wenn das programm ein verzeichnis automatisch bearbeiten könnte, wäre das echt klasse.
dein beispiel ist sehr gut! Es wäre toll, wenn das programm den jeweiligen Film, zb "Braveheart", "Hannibal", "Star Wars" automatisch als Titel erkennt und man dann entweder die jeweilige Endung, die dann auf alle Dateien passt, die sich im Verzeichnis befinden, eingibt, oder das Programm dies automatisch erkennen kann.
Eine Idee wäre, Vielleicht könnte es praktisch sein für den Batch-Modus Optionen aufzubauen
in der Regel sind timcodedateien Dateien mit der Dateieindung .srt
Text des Films endet in der Regel mit der Endung .txt
Das könnte Option 1 sein
Dann könnte Option 2 sein, eine Endung des Dateinamens selbst einzugeben, in etwa wie in deinem Vorschlag
Das Programm könnte zb ähnliche Dateinamen erkennen (wenn das möglich ist) und man dann die Endung eingeben. Wie im Braveheartbsp.
Oder als Option 3:
Kleinere Dateien sind immer Timecodedateien
größere Dateien sind immer Textdateien
bzw. das ganze umgekehrt...
Wäre so etwas denn überhaupt möglich?
Lg Klen |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|