Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Brauche Hilfe für ein einfaches Programm
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 19.01.2019, 14:41    Titel: Brauche Hilfe für ein einfaches Programm Antworten mit Zitat

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 lächeln

Lg Klen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 20.01.2019, 15:02    Titel: Antworten mit Zitat

Hallo klendathu und willkommen im Forum! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 20.01.2019, 17:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 21.01.2019, 10:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 21.01.2019, 14:11    Titel: Antworten mit Zitat

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 lächeln

Lg Klen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 22.01.2019, 00:09    Titel: Antworten mit Zitat

Das macht die Sache jetzt *ein bisschen* komplizierter. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 22.01.2019, 14:11    Titel: Antworten mit Zitat

Das ist perfekt, wie du es hinbekommen hast lächeln

Du bist mein Held lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 22.01.2019, 23:44    Titel: Antworten mit Zitat

klendathu hat Folgendes geschrieben:
Das ist perfekt, wie du es hinbekommen hast lächeln

Du bist mein Held lächeln
Nu übertreib mal nicht. grinsen 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...
Hmmm.... 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 23.01.2019, 13:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 23.01.2019, 14:45    Titel: Antworten mit Zitat

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. grinsen 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...
Hmmm.... 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 lächeln

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!!!! lächeln

Lg Klen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 23.01.2019, 16:52    Titel: Antworten mit Zitat

oder willst du das vom programm selbst anhand der timecodedaten und der textdatei jeweils berechnen lassen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 24.01.2019, 12:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4267
Wohnort: ~/

BeitragVerfasst am: 24.01.2019, 14:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 24.01.2019, 16:26    Titel: Antworten mit Zitat

hallo,

erst mal richtig vielen dank lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 25.01.2019, 11:57    Titel: Antworten mit Zitat

@nemored: Danke für den Hinweis mit den Vokalen, es funktioniert deutlich besser als das Abzählen von Wörtern oder Buchstaben. happy

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 31.01.2019, 14:09    Titel: Antworten mit Zitat

Hi,

sorry für die späte antwort. ich hatte einen kleinen pc crash und kam nebenbei zu wenig... ich hoffe du verzeihst mir traurig

Das Programm funktioniert toll! Ich habe es ausprobiert und bin sehr begeistert. Du hast da einen tollen Job gemacht lächeln

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 01.02.2019, 12:20    Titel: Antworten mit Zitat

Danke, es freut mich, daß dir das Programm gefällt. happy

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 01.02.2019, 23:52    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Danke, es freut mich, daß dir das Programm gefällt. happy

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! lächeln 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 lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 947
Wohnort: Ruhrpott

BeitragVerfasst am: 03.02.2019, 16:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
klendathu



Anmeldungsdatum: 18.01.2019
Beiträge: 21
Wohnort: Dortmund

BeitragVerfasst am: 03.02.2019, 17:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz