Text extraction part

After downloading the video

yt-dlp -f bestvideo -o "v12.%(ext)s" "https://www.youtube.com/watch?v=WQvrbZEK0LE"
There is no need in every frame, but rather every page. The audio text reader being software is nicely reading at the same pace (roughly) between 90 to 110 seconds per page.

Taking lower estimate 90s (duplicates are better than missed text) it would be about 0.011 which is our ffmpeg -r parameter

echo $((1.0/90))
0.011111111111111112
(expect this command to run for some time; also consider result frames file size (123 MB on my machine))
mkdir -p frames
ffmpeg -i v12.webm -r 0.011 frames/ffmpeg_%0d.jpg
(.jpg takes less space that .png and there was not much difference in text output)

For some reason frames 1 and 2 are just solid black color
(I get why first one is
(it probably gets taken during the screen transition),
but I am still confused by the second one)
I am going to replace frame 2 (ffmpeg_2.jpg) by hand, taking screenshot at 5-th second
and delete frame 1 (ffmpeg_1.jpg)

yes | ffmpeg -i v12.webm -ss 00:00:05 -vframes 1 frames/ffmpeg_2.jpg
rm frames/ffmpeg_1.jpg
yes | => because will ask for confirmation to replace already existing file;

lets take random frame and try to get good text result from it

mkdir -p test
find frames -type f | sort -R | tail -1 | xargs -I {} cp {} test/
It got me ffmpeg_357.jpg

There is some wallpaper/banners on the sides;
I checked its size by opening image in GIMP it was about 320px
Chop these banners off and grayscale the image with imagemagick:

magick convert test/ffmpeg_357.jpg -chop 320x0 -gravity East -chop 320x0 -colorspace Gray test/gray_357.jpg
gray and choped image

tesseract -l deu test/gray_357.jpg test/gray_357
Tesseract Open Source OCR Engine v4.1.1 with Leptonic
Warning: Invalid resolution 0 dpi. Using 70 instead
Estimating resolution as 12

Text output (content of the file: test/gray_357.txt)
( Er Tachte wie ein unterwürfiger Diener. Die Könıgliche Maltung, die er gezeig
hatte, als er ihnen auf dem Platz begegnet war, war nirgends zu sehen
Es tut mir leid, wenn ich das Falsche gesagt habe. Nein, ich entschuldig
mich. Ja wirklich. Es war mein Fehler. Ja wirklich
Hm.
Dann, wie wäre es dann damit? Ich, ich, dieser fühlt, dieser kann für Si
nützlich sein. Hehe. Ah, wie dumm ich war, den großen untoten König zum Fein
zu machen. Wenn du mir also die Chance gibst, diesen Fehler auszugleichen
würde ich ... hehe, du wirst es nicht bereue
Bauser ging auf beide Knie und verschränkte die Hände, als er um Gnad
bettelte
Was für eine erbärmliche Pose das war. Doch Näjaa dachte überhaupt nicht so
Nein, sie hatte bereits akzeptiert, dass dies die richtige Aktion war, die ei
Feind angesichts der wahren Form des Zaubererkönigs ergreifen sollte
Gleichzeitig erinnerte sie sich lebhaft an die Worte des Naga, den sie i
Zauberreich getroffen hatten: Ein weiser Mann würde sich sofort zu seine
Füßen werfen und um Gnade bitten
In diesem Fall war das Schicksal derer, die nicht sofort knieten
Ich verstehe ... nun, ich mag diejenigen, die verstehen, dass sie falsch lage
und hart daran arbeiten, ihre Fehler zu korrigieren
Das heißt das
Bausers Gesicht strahlte vor Freude. Diese Freude wurde jedoch sofor
weggerissen
Pestonya und Nigredo wären jedoch nicht glücklich, wenn ich Sie zu eine
meiner Untergebenen machen würde. Seien Sie auch entspannt. Ich werde nicht
Verschwenderisches tun, als nur den Schädel zu benutzen. Ich werde jeden Tei
von dir voll ausnutzen
Jetzt stirb, sagte der Zaubererkönig, als er einen schlanken Fingerknoche
aufrichtete.
Aiiiieee! Nein, nein, nein! Ich will nicht sterben !! Warten!! Ich flehe dic
(_aoıı! Birra ich £labadich anl Ich _ ich haha ismar nach ainan Wacr LiLL

first and last lines are not completely visible therefore some gibberish is expected;
also first and last lines more than likely are presented in neighboring pages (it will be important once we begin cleaning from duplicate and gibberish lines)

Now run a for loop to repeat tested actions on all of the frames

mkdir -p text
for f in frames/*;  \
    do gray_name=$(echo $f | sed "s/ffmpeg/gray/") && \
    magick convert $f -chop 320x0 -gravity East -chop 320x0 \
    -colorspace Gray $gray_name && \
    text_name="text/$(basename $gray_name | sed "s/.jpg//)" && \
    tesseract -l deu $gray_name $text_name

Concatenate all the content in one file keeping correct order
(there was a better way to run ffmpeg command
to get file format like ffmpeg_001 in order to avoid a headache with sorting,
but that what I did when I started to write this, so it is too late for regrets

mkdir -p result
find text -type f | sort -n -k 1.11,1.13 | xargs cat > "result/v12.txt"
And thats our yet unclean text file
wc -l result/v12.txt && du -h result/v12.txt
20632 result/v12.txt 760K result/v12.txt

Summary of what happened

The frames were taken from video then converted to cleaner gray images, after that text files were made by tesseract and end up in one concatenated file

yt-dlp -f bestvideo -o "v12.%(ext)s" \
    "https://www.youtube.com/watch?v=WQvrbZEK0LE"
mkdir -p frames
ffmpeg -i v12.webm -r 0.011 frames/ffmpeg_%0d.jpg
yes | ffmpeg -i v12.webm -ss 00:00:05 -vframes 1 frames/ffmpeg_2.jpg
rm frames/ffmpeg_1.jpg
mkdir -p text
for f in frames/*;
    do gray_name=$(echo $f | sed "s/ffmpeg/gray/") && \
    magick convert $f -chop 320x0 -gravity East -chop 320x0 \
    -colorspace Gray $gray_name && \
text_name="text/$(basename $gray_name | sed "s/.jpg//)" && \
tesseract -l deu $gray_name $text_name
mkdir -p result
find text -type f | sort -n -k 1.11,1.13 | \
    xargs cat > "result/v12.txt"

Next step is to make readable version of the v12.txt file, cleaning it from duplicates and gibberish