Comment horodater une conversation transcrite?

1

J'essaie de marquer chaque paragraphe de texte transcrit avec des horodatages indiquant quand / où il apparaît dans l'audio.

mplayeret emacsme rapproche. mplayer, dans le terminal, émet un flux d’informations temporelles appropriées; par exemple. (journal de commandes et exemples)

mplayer au-file 1>event.log 2>&1

A:   0.8 (00.7) of 3207.0 (53:27.0)  0.1% [J
A:   0.9 (00.9) of 3207.0 (53:27.0)  0.1% [J
A:   1.0 (01.0) of 3207.0 (53:27.0)  0.1% [J

Certaines clés non liées (par exemple, F12) peuvent être utilisées pour marquer un événement dans le journal, en particulier pour le début d'un paragraphe.

xdotool key --window $termID F12

A:   3.1 (03.0) of 3207.0 (53:27.0)  0.1% [J
No bind found for key 'F12'.                         
A:   3.2 (03.2) of 3207.0 (53:27.0)  0.1% [J
A:   3.3 (03.3) of 3207.0 (53:27.0)  0.1% [J

Ce qui précède fonctionne bien. Il faut ensuite que les numéros de ligne soient injectés event.log. Je vais probablement utiliser emacspour déclencher ces deux événements de l'intérieur emacs, en liant une clé pour lire la pointposition actuelle et en l'ajoutant au journal.

Oui, vous l'avez deviné, j'ai un problème. Il semble que mplayergarder un pointeur de flux (ou quelque chose?), Car quand il écrit sa prochaine ligne, il écrase le texte que j'ai ajouté. Je ne sais pas ce qui se passe, mais aucune de mes lignes ajoutées n'apparaît dans le journal final ... je l'ai déjà utilisée echo $number >>events.log.

J'ai regardé le journal via tail -f events.loget il montre une de mes lignes de temps en temps, donc ils doivent y arriver ...

Y-a-t-il moyen de faire autrement?
Soit par certains fuau journal, ou une méthode entièrement différente, par exemple. un outil qui fait exactement cela, en temps réel .. J'ai examiné les outils de sous-titrage et les éditeurs audio-vidéo, mais ils semblent trop maladroits .. Je suis ouvert à toutes les idées.

Peter.O
la source

Réponses:

1

En effet, mplayerconserve son propre pointeur dans le fichier, de sorte qu'il ne remarque pas quand il echoécrit. Lorsque vous avez plusieurs programmes en train d'écrire dans un fichier, demandez à tous d'ouvrir le fichier en mode ajout . En mode Ajout, chaque écriture se produit à la fin du fichier. De la coquille, c'est >>. Créez un fichier vide avec : >events.logsi vous voulez recommencer, puis lancez mplayer … >>events.log.

Notez que bien que cela garantisse que chaque octet de l'un des programmes se retrouvera dans le fichier, il n'y a en principe aucune garantie qu'ils ne seront pas intercalés: en théorie, cela echo hello >>events.logpourrait entraîner h, alors, une sortie de mplayer, puis e, etc. le fichier. En pratique, sur la plupart des systèmes, sinon tous, une commande d’écho imprimant au maximum 512 octets se terminera par un seul morceau.

Gilles
la source
Merci Gilles. Cela a éclairci le brouillard. Je me demandais si la mise en cache provoquait des anomalies ... Eh bien, j'ai beaucoup réfléchi à cela , et je me suis dit que ce qui semblait fonctionner contre moi devait peut-être être adopté, et je le fais avec. .. Bingo! Toutes les lumières sont allumées! La réponse est en quelque sorte évidente. Il me regardait en face et ne pouvait pas le voir à cause de la solution que je visais ... J'ai lu le commentaire de quelqu'un à propos de ce syndrome l'autre jour .. Je ne me souviens plus comment il l'appelait, mais ça me convient. Vous ne pouvez pas voir la solution, à cause de l'accent mis sur une solution .. Je vais la poster ...
Peter.O
0

Remarque. Ceci est une réponse à ma propre question

La méthode suivante fonctionne assez bien. Il envoie une série d’appuis non liés à mplayer (mplayer enregistre ces pressions de touche non valides). Chaque touche enfoncée est choisie pour représenter un chiffre décimal, par exemple. l'envoi F2 F5 F7représente le nombre décimal 257. L'envoi d'un numéro à 6 chiffres prend environ 0,2 seconde. L'horodatage est extrait de la ligne du journal juste avant la première pression de touche (en-tête). Cela évite tous les problèmes liés aux délais de mise en cache, comme mentionné dans la réponse de Gilles .

Il peut être exécuté très facilement emacsen déplaçant simplement point(le curseur) sur une autre ligne ou en appuyant sur une touche spécifique (ce code n’est pas là, mais j’attendrais à ce qu’il soit assez simple (je suis nouveau dans elisp). la solution codée et alpha-testée ...

# Insert a number (input to this script) into mplayer's log; 
# Each digit of the input number is translated into
#   a key-press for which mplayer does not have a binding.
# mplayer makes a log entry for each invalid key-press.
# The log entry identifies the key, so the entry can be 
#   translated back into its original decimal value
#
# A leading and a trailing marker are also sent to mplayer
#
# A simple parsing of the log can rebuild the original  
#   number and the time within the media stream when it occurred.
# 
num=${1:-123456} # Default if for testing only 
shopt -s extglob # For splitting the input number

# Window ID ($2)   Defaults to win whose title == $USER@$HOSTNAME.*
win=${2:-$(($(wmctrl -l | sed -nr "s/^([^ ]+).* $USER@$HOSTNAME.*/\1/p")))}

#    ==========  =====  ===  # Key-press translation array
#    0123456789  begin  end  # decimal digits and delimiters
key=(F12 F{1..9}   c     \') # key names
#    ==========  =====  ===  # 

xdotool key --window $win ${key[10]}    # HEAD Marker   
for i in ${num//?(.)/ } ;do
    xdotool key --window $win ${key[i]} # Encoded decimal digit
done
xdotool type --window $win ${key[11]}   # TAIL Marker

Voici un processus de suivi en 3 étapes pour extraire l’horodatage et le numéro (numéro de ligne ou décalage octet / caractère dans le texte source) ...

# (1) Each line of mplayer's normal output (vs errors) ends  
#     witn `\x1B\[J\x0D`.  First, convertd this to `\n` 
sed -nr 's/\x1B\[J\x0D/\n/gp' mplayer.log  >/dev/null

# (2) The above pre-processing step(1) can be piped to the next sed step, 
#     but I've redirected it to /dev/nul for this example
#     The following step works with a few lines of the pre-processed log
nbfk="No bind found for key"
sed -nr " 
    /^$nbfk 'c'\./,/^$nbfk '''\./{
        /^$nbfk 'c'\./{g                 # HEAD Marker found 
            s/^A: *([0-9.]+).*/000000\1/
            s/^0*([0-9]{6}\..*)/T:\1/p
        }
        s/^$nbfk 'F12'\..*/0/p           # Digit      
        s/^$nbfk 'F([1-9])'\..*/\1/p     # Digit
        s/^$nbfk '''\..*/--/p            # TAIL Marker found       
    }
    h" <<'EOF'
A:  18.6 (18.6) of 3207.0 (53:27.0)  0.1% 
A:  18.7 (18.6) of 3207.0 (53:27.0)  0.1% 
No bind found for key 'c'.                         
A:  18.7 (18.6) of 3207.0 (53:27.0)  0.1% 
No bind found for key 'F1'.                         
A:  18.7 (18.7) of 3207.0 (53:27.0)  1.0% 
No bind found for key 'F2'.                         
A:  18.7 (18.7) of 3207.0 (53:27.0)  0.1% 
A:  18.8 (18.7) of 3207.0 (53:27.0)  0.1% 
No bind found for key 'F3'.                         
A:  18.8 (18.8) of 3207.0 (53:27.0)  0.1% 
No bind found for key 'F4'.                         
A:  18.8 (18.8) of 3207.0 (53:27.0)  0.1% 
No bind found for key 'F5'.                         
A:  18.9 (18.8) of 3207.0 (53:27.0)  0.1% 
No bind found for key 'F6'.                         
A:  18.9 (18.8) of 3207.0 (53:27.0)  0.1% 
No bind found for key '''.                         
A:  18.9 (18.9) of 3207.0 (53:27.0)  0.1% 
A:  19.0 (18.9) of 3207.0 (53:27.0)  0.1% 
EOF

# (3) The above step(2) can be piped to the next sed step, 
#     but I've let it go to stdout for this example
#     The following example step works with output of step (2)
sed -nr "
    /^T:[0-9.]+$/,/^--$/{
        /^T:[0-9.]+$/{ s/^T:(.*)/\1 /; h}
        /^[0-9]$/H
        /^--$/{g; s/\n//g; p}
    }" <<'EOF'
T:000018.7
1
2
3
4
5
6
--
EOF

Voici le résultat final: time in secondset le testline number

 000018.7 123456
Peter.O
la source