Fixing the timings
An alignment, or a first guess, times a whole recording at once, and some of what it does will drift: a subparagraph that starts a word late, one that swallows the breath before the next. Two tools put that right, and both save through the same door, so a time moved in one and a time moved in the other are written, merged and rebuilt by the same code, and both count as fixed by hand — which a later align keeps unless told to start over.
1. Edit times: one subparagraph at a time#
edit times in the header (or edit times by hand in the narration panel) turns the reader into a timing editor. The narration’s own player appears as a third row of the header — play it, seek in it — and every subparagraph shows, under its label:
- ▶, which plays it, and its length in seconds;
- a start row and an end row, each: −1 −.5 −.1, the time itself in a box, +.1 +.5 +1, and ◉, which sets it to where the player’s playhead is now;
- undo, which puts that subparagraph’s times back as they were.
How it behaves, and why:
- You hear every move.
- Moving a start plays the first second and a half of the subparagraph; moving an end plays its last second and a half. That is how you hear whether you have put it right.
- An end moves the next start with it.
- Setting a subparagraph’s end moves the next one’s start to meet it, so the narration has no gap. They stay two numbers, so either can be pulled apart again afterwards. Never across two recordings: the next start is then a time in another file.
- A subparagraph with no time yet
- is timed by typing its start and its end into the boxes; the steps and ◉ move a time that is already there, and do nothing on one that has never had one.
- ◉ stamps the file that is playing.
- In a book of several recordings, a subparagraph in another recording says that subparagraph is in another recording — play it first.
The changes are kept in this browser, and survive a reload, until you save them. save times (N) — N counts every subparagraph changed, the next one’s start moved by an end included — writes them into timings.json and into the chapter files, and says saved N to timings.json and the .tex. discard edits throws them away: it asks discard N? and a second click within four seconds does it. If the save fails the edits stay in the browser, and the message says why.
On opening, a reader whose timings.json holds newer times than the page was built with takes them (N timings loaded from timings.json).
2. By ear: boundary by boundary#
by ear, on a recording’s row in the narration panel, opens the boundaries of that recording over a picture of its sound — a waveform, with every boundary on it as a line you can drag. It answers a different question from align: not where is each subparagraph, for the whole recording at once, but where does this one stop and the next begin, for the one boundary that came out wrong.
From the header, where you are listening#
edit times by ear, in the header right after edit times, opens the same sheet without the panel: on the recording the text is following — the one the mark on the text belongs to, which in a book of several recordings is the one playing — and at the subparagraph the mark is on, with the picture fitted around it and its neighbours either side. It is for the moment you hear that the alignment was lost: press it while the narration is still saying the wrong words, and the boundary to move is already in front of you, instead of the first subparagraph of a recording of three hundred.
- With nothing marked yet, or a mark no recording covers, it opens on the recording loaded, at its first timed subparagraph. On a subparagraph with no time it opens at the nearest one that has.
- What was playing stops, as it does for by ear in the panel.
- It is greyed, with the reason in its tooltip, wherever the panel’s by ear is: the recording’s file is not on the shelf, or nothing it covers has a time yet (align it or estimate times first).
- Like edit times, it is absent from a book with no recording and from the mobile mode, which never edits.
- A reader built before this button has neither it nor the sheet’s opening on a subparagraph: rebuild the reader in the header (an update does it by itself).

The sheet, from the top:
- before, here, after — the text of the subparagraph being timed and its two neighbours, so you can see what you are placing;
- the times of the one in hand, and its starts and ends rows — the same six steps as edit times, the time in a box (type one and press Enter), and ◉, put it where the sound stands now;
- ▶ hear it plays it, from its start to where the next begins; ▶ across the join plays the second before the boundary and the second after it;
- into the quiet (S) moves the line into the middle of the nearest stretch where the sound drops away — the gap between two words, which is where a boundary belongs. How far it looks depends on how far you are zoomed in, and a gap shorter than a breath is passed over;
- estimate the rest (E) lays a fresh guess over everything after the line in hand — by the text or by the sound, whichever of the two beside it is pressed (below). Nothing to the left of the line is touched — that is the point of it: a hand works left to right, and by the time the tenth boundary is right, the fortieth still carries the first guess’s error. A number of seconds in the small box beside it makes it estimate the next 90 seconds instead — only that stretch (below);
- split from the next / join to the next (below);
- the zoom: − and + show more or less of the recording, fit goes back to the piece in hand and its neighbours, all shows the whole file; the wheel scrolls, and the wheel with Shift or Ctrl zooms;
- the waveform, the piece in hand in colour, the others grey.
A boundary is one act. The end of one subparagraph and the start of the next are two numbers in the file, but they are one moment in the recording, so dragging the line moves both together. Two numbers that should agree are two chances to be wrong.
Unless you want them apart. Some recordings really do pause — a heading read, a breath, then the text. split from the next pulls the two lines apart and shades the silence between them as said by neither; join to the next puts them together again. An alignment snaps to the silences, so after one the boundaries often arrive split.
Estimate the rest: by the text or by the sound#
Beside estimate the rest sit two buttons that work as a switch, by the text and by the sound. The one pressed is how the button, and E, make the guess; pressing the other says so — “estimate the rest” now goes by the sound.
by the text is the guess estimate the rest has always made: what is left is shared out in proportion to how much text each subparagraph has, the way estimate times shares out a whole recording, and every boundary after the line comes back joined. It needs no picture of the sound, and it hears nothing: every pause the reader took, and every sentence read faster than the last, pushes it further off.
by the sound lays the same subparagraphs through the picture of the sound instead. A boundary goes into a pause the picture shows, where the length of the text allows one there; between the pauses the text is shared out at the pace of the speech, and the pace is followed as it changes. What it hears is where the voice stops and starts — how loud the recording is, moment by moment, and nothing else. It never hears which word is which: nothing recognises speech, and nothing listens to the words. So it is a better first guess, not an alignment: play the boundaries and correct what is off, as you would after by the text.
When it is done it says how many boundaries it could put in a pause: 12 pieces after this estimated from the sound — 9 of the 11 boundaries sit in a pause it heard; nothing to the left of it moved. A line that sits in a gap of the waveform is the likeliest to be right. One drawn across the sound itself fell in continuous speech, where nothing in the picture tells one word from the next and the length of the text decided: listen to those first.
What it changes, and what it does not:
- Nothing to the left of the line.
- The subparagraph at the line keeps its start, and the silence before its first word stays with it. With a subparagraph’s end in hand, the one after it starts at that line, as by the text would start it.
- Joined or split, as the sound has it.
- A boundary across a pause of half a second or more comes back split, a tenth of a second either side of the voice, the silence left to neither; across a shorter gap it comes back joined, one line at the gap’s quietest point.
- Nothing saved yet.
- The guess is written by save the timings, like any other move. cancel leaves without it — and without everything else moved since the sheet was opened.
How long it takes. It reads the rest of the recording, from the line to the end, so the time depends on how much is left: a few seconds for an hour, up to about a minute for four hours, more on a computer busy with something else. (With seconds in the box, below, it reads only that stretch.) Meanwhile the sheet says estimating from the sound… — or, over a stretch that stops short of the end, estimating the next 28.6 s from the sound… — and holds its lines still, and the work is on the Working… list — Estimating the timings of “Momotarō” by the sound — where the hub and any other page see it.
- Waiting is not a trap.
- While it waits, estimate the rest reads stop estimating: it, or Esc, gives the wait up — stopped: nothing was estimated, and nothing moved — and the sheet is yours again, with everything you moved by hand still there to save. cancel and ✕ leave the sheet as ever. An answer that arrives after either is dropped.
- One at a time.
- Only one estimate by the sound runs on the computer at once; a second — from another sheet, another page — is refused at once: another estimate by the sound is running: try again when it has finished.
- A server that never answers.
- It is given up after a few minutes — two, and a second more for every minute of the stretch: the server gave no answer in 3 minutes, so the estimate was given up — nothing was estimated.
- Too long for the memory.
- On a computer short of memory, a stretch of many hours may be refused: this stretch is too long to estimate by the sound at once: estimate from a line nearer the end, or by the text. A number of seconds in the box beside the button (below) is the third way out: the stretch is only that long.
A text with no punctuation — a transcript nobody punctuated — is its weakest case: with no sentence ends to hold on to, a long stretch can drift by a second or two. Put the full stops in first if you can.
When by the sound is greyed. It needs a picture of the sound, and when there is none its tooltip says why:
- A reader built before it.
- this reader was built before estimating by the sound existed: press “rebuild the reader” in the bar at the top of the page, then reload the page. The rebuild takes a few seconds, without LaTeX.
- No ffmpeg on the computer.
- there is no picture of the sound here to estimate by — it is drawn by ffmpeg, on the computer Parseh runs on. The waveform is missing too. The installer’s report says whether ffmpeg is there (Installing).
- The picture on its way.
- waiting for the picture of the sound…, for the moment it takes to draw.
While it is greyed, by the text shows pressed and E goes by the text. Your choice is kept all the same, and is back in force as soon as there is a picture.
The choice is remembered in this browser, for books and videos alike: press by the sound once, and every sheet opens with it — a book’s by ear and a video’s the timings. If pressing E then says estimating by the sound needs numpy, which the Python running Parseh does not have…, the environment lacks the one package it needs: run the installer again (Updating Parseh), then start Parseh again.
Only the next few seconds#
estimate the rest lays the guess over everything after the line, and that is often more than the next stretch of work needs: with fifty subparagraphs still to go, you may mean to fix the next ten and hear them before you touch the rest. Beside the button, between it and the switch, a small box reads the next [ ] s. Type a number of seconds in it — 90, or 1:30 — and the button reads estimate the next 90 seconds (estimate the next 1 second, for one): the same act, by the text or by the sound as the switch says, over a shorter stretch. E runs whatever the button reads.
- Which subparagraphs.
- From the line in hand, the stretch runs to the boundary closest to that many seconds after it — a boundary that is already there: the start of one of the subparagraphs after the line, or the end of the last. Closest means on either side, so 90 seconds may end a little before the ninetieth second or a little after it, and a tie goes to the shorter stretch. The stretch always holds at least one subparagraph, so a number shorter than the first still estimates that one; and when the closest boundary is the end — the number reaches it, or is nearer to it than to the last subparagraph’s start — it is exactly estimate the rest, which the status says. The button’s tooltip says how many subparagraphs the number makes of it today, how many seconds and up to when — worth reading when the subparagraphs are long, because the rounding can land well away from the number you typed.
- What does not move.
- Nothing to the left of the line, as ever — and nothing from the boundary the stretch ends at on: the subparagraph after it keeps its start and its end, and so does every one beyond. Inside the stretch it is the guess by the text or by the sound always makes. The last subparagraph of the stretch ends at that boundary by the text; by the sound it ends where the sound says, never past it — joined to the next subparagraph if that is where it ends, or split from it, the silence left to neither, if the sound pauses before it.
- What it says.
- The status names the stretch as it was laid, with the real number of seconds after the rounding: 5 pieces in the next 28.6 s (to 3:41.20) estimated from the sound — 3 of the 4 boundaries sit in a pause it heard; nothing outside that stretch moved.
- A shorter wait.
- Only the sound of the stretch is read, so by the sound takes time in proportion to the stretch, and not to everything that is left.
- Empty is the rest.
- The box starts empty on every sheet and is not remembered — how far to estimate is decided each time, for the stretch in front of you; the switch is the habit that is remembered. Seconds are typed as 90, 1.5 or 1:30. Anything else — letters, a minus sign — turns the box red, and pressing the button or E is refused in words: the box must hold seconds (90 or 1:30) or be empty; nothing was estimated. So is 0, or a number so small that it rounds to nothing, with the seconds in the box must be above zero, or the box empty; nothing was estimated. It never guesses what was meant.
- While you type.
- The keys are the box’s while it has the focus: a full stop or a comma typed in it does not step to the next piece. Enter takes the number and gives the sheet its keys back; it does not estimate — press E or the button for that.
- A reader built before it.
- The box and by the text work in a reader built before by the sound existed, as the rest of the sheet does; only by the sound waits for the rebuild.
The keys#
The same few movements, over and over, so they are all under the hand:
| Key | Does |
|---|---|
| , and . | take up the piece before and the piece after (so do [ ] and PageUp PageDown) |
| F | bring the view back onto the piece in hand |
| S | drop the line into the nearest quiet |
| E | estimate everything after it afresh — by the text or by the sound, whichever is pressed; with seconds in the box beside the button, only the next stretch of that length |
| ← → (or ↓ ↑) | nudge by a tenth of a second; with Shift, half a second |
| Space | play the piece, or stop |
| Enter | save the timings |
| Esc | leave without saving |
The comma and the full stop lead because they are unshifted on every keyboard, where the brackets sit behind AltGr on an Italian or a French one. None of the keys fires while you are typing a time into a box, and Ctrl+F is left to the browser.
save the timings writes what moved (saved N timings); cancel, ✕ or Esc leave without saving. The reader takes the new times at once — N boundaries moved and saved.
The picture of the sound is drawn by the server from the recording (with ffmpeg). Where there is none, into the quiet says there is no picture of the sound here to find the quiet in and does nothing else, and by the sound is greyed (above); the rest of the sheet still works.