Úvodná » kódovanie » Ako zobraziť časový prepis vedľa prehrávaného zvuku

    Ako zobraziť časový prepis vedľa prehrávaného zvuku

    Prepis zvuku je textová verzia reči, užitočná pri poskytovaní užitočných materiálov, ako sú nahrané prednášky, semináre atď. Používajú sa aj na uchovávanie textových záznamov o udalostiach, ako sú rozhovory, súdne vypočutia a stretnutia.

    Reprodukcia zvuku na webových stránkach (napríklad v podcastoch) je zvyčajne sprevádzaná prepismi, v prospech tých, ktorí majú sluchovo postihnutých alebo nie sú schopní počuť vôbec. Môžu zobrazte text "prehrávanie" vedľa zvuku. Najlepší spôsob, ako vytvoriť prepis zvuku, je manuálna interpretácia a nahrávanie.

    V tomto príspevku budeme vidieť ako zobraziť bežný prepis zvuku vedľa zvuku. Na začiatok musíme mať pripravený prepis. Pre tento príspevok som si stiahol ukážkový zvuk a jeho prepis voxtab.

    Používam HTML ul zobraziť dialógové okná na webovej stránke, ako je uvedené nižšie:

    • Justin: Snažím sa povedať, že odvolanie a vyrovnanie sú oddelené.
    • Alistair: Myslíte, že komunikácia a vnútorné a vonkajšie oznámenia by sa dostali do odvolacieho procesu.
    • Justin: Správne, pretože sa pripájajú k odvolaniu.
    • ...

    Ďalej chcem, aby bol všetok dostupný text rozmazaný a odblokujte iba dialóg, ktorý zodpovedá aktuálnej reči, ktorú prehrá zvukové nahrávanie. Takže, aby sa rozbili dialógy používam filter CSS "rozostrenie".

    #transcript> li -webkit-filter: rozostrenie (3px) filter: rozostrenie (3px); prechod: všetko .8s ľahké; ...

    Pre IE 10+ môžete pridať text-shadow aby sa vytvoril rozmazaný efekt. Pomocou tohto kódu môžete zistiť, či sa používa rozmazanie CSS alebo nie, a načítať špecifický štýl šablóny IE. Akonáhle je text rozmazaný, išiel som dopredu a pridal nejaký štýl do prepisu.

     if (getComputedStyle (dialogy [0]) webkitFilter === undefined && getComputedStyle (dialógy [0]) filter === "none") var headEle = document.querySelector ('head'), linkEle = document.createElement ( 'spojenie'); linkEle.type = 'text / css'; linkEle.rel = 'stylesheet'; linkEle.href = 'ie.css'; headEle.appendChild (linkEle); 

    Teraz pridajte do stránky zvuk.

     

    ontimeupdate udalosť audio prvok je vypálený vždy, keď je jeho aktuálny čas je aktualizovaná, takže túto udalosť použijeme na kontrolu aktuálneho času prehrávania zvuku a zvýraznenie príslušného dialógu v prepisu. Najprv vytvoríme niektoré globálne premenné, ktoré budeme potrebovať.

    dialogueTimings = [0,4,9,11,18,24,29,31,44,45,47]; dialógy = document.querySelectorAll ('# transcript> li'); prepisWrapper = document.querySelector ('# transcriptWrapper'); audio = document.querySelector ('# audio'); previousDialogueTime = -1; 

    dialogueTimings je pole čísel reprezentujúcich sekundy, kedy začína každý dialóg v prepisoch. Prvý dialóg začína na 0s, druhý na 4s a tak ďalej. previousDialogueTime sa budú používať na sledovanie zmien v dialógu.

    Poďme sa napokon presunúť na funkciu, na ktorú sme sa pripojili ontimeupdate, ktorý sa nazýva "playTranscript". od tej doby playTranscript je vypálená takmer každú sekundu, v ktorej sa prehráva zvuk, najprv musíme zistiť, ktorý dialóg sa v súčasnosti prehráva. Predpokladajme, že zvuk je v 0:14, potom prehrá dialóg, ktorý začal v 0:11 (pozrite dialogueTimings array), ak je aktuálny čas 0:30 v audio, potom je to dialóg, ktorý začal v 0:29.

    Preto, aby sme zistili, kedy sa začal súčasný dialóg, najskôr sme filtrovali po celý čas dialogueTimings ktoré sú pod aktuálnym časom zvuku. Ak je aktuálny čas 0:14, vyfiltrujeme celý nos. v poli, ktoré sú nižšie ako 14 (ktoré sú 0, 4, 9 a 11) a zistiť maximálnu č. z toho, čo je 11 (teda dialóg začal v 0:11).

    funkcia playTranscript () var currentDialogueTime = Math.max.apply (Math, dialogueTimings.filter (funkcia (v) return v <= audio.currentTime));  

    Raz currentDialogueTime je vypočítané, skontrolujeme, či je to isté ako previousDialogueTime(to je, ak sa dialóg v zvuku zmenil alebo nie), ak to nie je zhoda (to je v prípade zmeny dialógu), potom currentDialogueTime je priradený previousDialogueTime.

    funkcia playTranscript () var currentDialogueTime = Math.max.apply (Math, dialogueTimings.filter (funkcia (v) return v <= audio.currentTime)); if(previousDialogueTime !== currentDialogueTime)  previousDialogueTime = currentDialogueTime;   

    Teraz použite index currentDialogueTime v dialogueTimings pole, aby ste zistili, ktorý dialóg v dialógovom okne záznamu je potrebné zdôrazniť. Napríklad, ak currentDialogueTime je 11, potom index 11 v dialogueTimings pole je 3, čo znamená, že musíme zdôrazniť dialóg v indexe 3 v dialógy rad.

    funkcia playTranscript () var currentDialogueTime = Math.max.apply (Math, dialogueTimings.filter (funkcia (v) return v <= audio.currentTime)); if(previousDialogueTime !== currentDialogueTime)  previousDialogueTime = currentDialogueTime; var currentDialogue = dialogues[dialogueTimings.indexOf(currentDialogueTime)];   

    Akonáhle sme našli dialóg zvýrazniť (to je currentDialogue), posúvame sa transcriptWrapper (ak je možné posúvať) currentDialogue je 50 pixelov pod horným okrajom obalu, potom zistíme predchádzajúci zvýraznený dialóg a triedu odstránime rozprávanie z toho a pridajte ho currentDialogue.

    funkcia playTranscript () var currentDialogueTime = Math.max.apply (Math, dialogueTimings.filter (funkcia (v) return v <= audio.currentTime)); if(previousDialogueTime !== currentDialogueTime)  previousDialogueTime = currentDialogueTime; var currentDialogue = dialogues[dialogueTimings.indexOf(currentDialogueTime)]; transcriptWrapper.scrollTop = currentDialogue.offsetTop - 50; var previousDialogue = document.getElementsByClassName('speaking')[0]; if(previousDialogue !== undefined) previousDialogue.className = previousDialogue.className.replace('speaking',"); currentDialogue.className +=' speaking';   

    Prvok s triedou rozprávanie zobrazí nerozložený text.

    .hovoriť -webkit-filter: rozostrenie (0px) filter: rozostrenie (0px); 

    A to je všetko, tu je úplný kód HTML a JS kód.

    • Justin: Snažím sa povedať, že odvolanie a vyrovnanie sú oddelené.
    • Alistair: Myslíte, že komunikácia a vnútorné a vonkajšie oznámenia by sa dostali do odvolacieho procesu.
    • Justin: Správne, pretože sa pripájajú k odvolaniu.
    • ...


    demonštrácie

    Pozrite sa na demo nižšie a zistite, ako to funguje, ak sú všetky kódy dohromady.