Como registrar a hora de uma conversa transcrita?

1

Estou tentando marcar cada parágrafo do texto transcrito com os carimbos de data e hora de quando / onde ocorre no áudio.

mplayer e emacs estão me aproximando. mplayer , no terminal, gera um fluxo de informações de tempo adequadas; por exemplo. (comando e log de amostra)

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

Algumas chaves não associadas (por exemplo, F12 ) podem ser usadas para sinalizar um evento no log - especificamente para o início de um parágrafo.

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

O acima funciona bem. A próxima coisa que precisa é de números de linha a serem injetados em event.log . Provavelmente usarei emacs para acionar esses dois eventos de dentro de emacs , vinculando uma chave para ler a% atualpoint position e anexando-a ao log.

Sim, você adivinhou, eu tenho um problema. Parece que mplayer está mantendo um ponteiro de fluxo (ou algo assim?) Porque quando ele escreve sua próxima linha ele sobrescreve o texto que eu adicionei. Eu não sei o que está acontecendo, mas nenhuma das minhas linhas adicionadas aparece no log final ... Eu usei echo $number >>events.log .

Eu assisti o log via tail -f events.log e ele mostra uma das minhas falas ocasionalmente, então elas devem estar chegando lá ...

Existe alguma maneira de contornar isso?
Ou por algum fu para o log, ou um método totalmente diferente, por exemplo. alguma ferramenta que faz exatamente isso, em tempo real .. Eu olhei para ferramentas de legendagem e editores de áudio e vídeo, mas eles parecem ser muito desajeitados .. Estou aberto a qualquer idéia.

    
por Peter.O 17.11.2011 / 12:34

2 respostas

1

Na verdade, mplayer mantém seu próprio ponteiro no arquivo, portanto, ele não percebe quando echo grava nele. Quando você tiver vários programas gravando em um arquivo, faça com que todos eles abram o arquivo em modo de anexação . No modo de anexação, toda gravação acontece no final do arquivo. Do shell, isso é >> . Crie um arquivo vazio com : >events.log se você quiser começar de novo e, em seguida, execute mplayer … >>events.log .

Note que, embora isso garanta que cada byte de qualquer dos programas acabará no arquivo, não há, em princípio, garantias de que não serão intercaladas: em teoria, echo hello >>events.log poderia resultar em h , então alguns mplayer, então e , etc. aparecem no arquivo. Na prática, na maioria dos sistemas, se não em todos, um comando de eco imprimindo no máximo 512 bytes, terminará em uma única parte.

    
por 18.11.2011 / 02:33
0

Nota. Esta é uma pergunta para minha própria pergunta

O método a seguir funciona muito bem. Ele envia uma série de teclas pressionadas para o mplayer (o mplayer registra esses pressionamentos de tecla inválidos). Cada tecla pressionada é escolhida para representar um dígito decimal, por exemplo. O envio de F2 F5 F7 representa o número decimal 257 . O envio de um número de 6 dígitos demora cerca de 0,2 seg. O registro de data e hora é retirado da linha de registro imediatamente antes da primeira pressão (cabeçalho). Isso evita todos os problemas atendidos com atrasos de caching, como mencionado na resposta Gilles '.

Ele pode ser executado facilmente a partir de emacs movendo apenas point (cursor) para outra linha ou pressionando uma tecla específica (esse código não está aqui, mas eu esperaria que fosse simples o suficiente) sou novo para elisp) .Aqui está a solução codificada e testada em alfa ...

# 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.*//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

Aqui está um processo de acompanhamento de 3 etapas para extrair o registro de data e hora e o número (número da linha ou byte / char offset no texto de origem) ...

# (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/
            s/^0*([0-9]{6}\..*)/T:/p
        }
        s/^$nbfk 'F12'\..*/0/p           # Digit      
        s/^$nbfk 'F([1-9])'\..*//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:(.*)/ /; h}
        /^[0-9]$/H
        /^--$/{g; s/\n//g; p}
    }" <<'EOF'
T:000018.7
1
2
3
4
5
6
--
EOF

Aqui está a saída final: time in seconds e o teste line number

 000018.7 123456
    
por 18.11.2011 / 05:26