Tips en Trucs 2025

MKVToolNix - Ultieme tool voor het bewerken en samenvoegen van MKV-videobestanden

Matroska, beter bekend als een MKV-bestand, is een multimediaformaat dat audio-, video- en ondertitelbestanden inkapselt in een compleet filmbestand.

MKVToolNix is een krachtig pakket hulpprogramma's voor het maken, bewerken en beheren van Matroska (MKV) bestanden. Dankzij de gebruiksvriendelijke interface (het grafisch programma wordt op het einde van deze tip bekeken) en uitgebreide functionaliteit kunnen gebruikers met MKVToolNix meerdere video-, audio- en ondertiteltracks samenvoegen in één MKV-bestand, specifieke elementen extraheren en bestandsdetails inspecteren. Deze veelzijdige software is beschikbaar op Windows, macOS en Linux en is onmisbaar voor contentmakers, filmmakers en videoliefhebbers. Of je nu ondertitels moet toevoegen, audiotracks moet aanpassen of je mediabestanden moet beheren, MKVToolNix biedt de tools die nodig zijn om je videobewerkingservaring te verbeteren.

Om te leren werken met MKVToolnix gebruik je best kopies van je video's. Wij gebruiken het voorbeeldbestand (11MB) van de Matroska website. Je kunt dit downloaden en hernoemen met de volgende opdracht:

dany@pindabook:~$ wget -O "Vanilla Sky.mkv" https://mkvtoolnix.download/samples/vsshort-vorbis-subs.mkv
--2025-05-20 15:58:53--  https://mkvtoolnix.download/samples/vsshort-vorbis-subs.mkv
Herleiden van mkvtoolnix.download (mkvtoolnix.download)... 2a01:4f8:262:fc01::7, 142.132.213.39
Verbinding maken met mkvtoolnix.download (mkvtoolnix.download)|2a01:4f8:262:fc01::7|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 11888787 (11M) [video/x-matroska]
Wordt opgeslagen als: ‘Vanilla Sky.mkv’

Vanilla Sky.mkv              100%[==============================================>]  11,34M  10,2MB/s    in 1,1s    

2025-05-20 15:58:55 (10,2 MB/s) - '‘Vanilla Sky.mkv’' opgeslagen [11888787/11888787]

Matroska is een container. Daardoor bevat het voorbeeldbestand:

Omdat het bestand een videobestand is, is de bestandsextensie .mkv. Matroska heeft echter verschillende bestandstypen, afhankelijk van het gebruik.

Een tweede voorbeeldbestand halen we van de GitHub pagina Matroska Test Files.

dany@pindabook:~$ wget -O "Elephant Dreams.mkv" https://github.com/ietf-wg-cellar/matroska-test-files/raw/refs/heads/master/test_files/test5.mkv
--2025-05-20 16:18:46--  https://github.com/ietf-wg-cellar/matroska-test-files/raw/refs/heads/master/test_files/test5.mkv
Herleiden van github.com (github.com)... 140.82.121.4
Verbinding maken met github.com (github.com)|140.82.121.4|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 302 Found
Locatie: https://raw.githubusercontent.com/ietf-wg-cellar/matroska-test-files/refs/heads/master/test_files/test5.mkv [volgen...]
--2025-05-20 16:18:46--  https://raw.githubusercontent.com/ietf-wg-cellar/matroska-test-files/refs/heads/master/test_files/test5.mkv
Herleiden van raw.githubusercontent.com (raw.githubusercontent.com)... 2606:50c0:8001::154, 2606:50c0:8002::154, 2606:50c0:8003::154, ...
Verbinding maken met raw.githubusercontent.com (raw.githubusercontent.com)|2606:50c0:8001::154|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 31762747 (30M) [application/octet-stream]
Wordt opgeslagen als: ‘Elephant Dreams.mkv’

Elephant Dreams.mkv          100%[==============================================>]  30,29M  11,2MB/s    in 2,7s    

2025-05-20 16:18:50 (11,2 MB/s) - '‘Elephant Dreams.mkv’' opgeslagen [31762747/31762747]

Indien VLC bij het afspelen van deze video enkel een groen beeld weegeeft, kan je dit oplossen door in het menu Gereedschap de Voorkeuren te starten. Activeer het onderdeel Invoer / codecs en zet de Hardware-versnelde decodering op Uitschakelen. Herstart VLC om de aanpassing te activeren. In de Dragon Player (standaard speler in KDE Debian Bookworm) wordt deze video wel correct afgespeeld.

MKVToolNix terminal versie

Het MKVToolNix-pakket is beschikbaar in de officiële Debian-softwarebronnen. MKVToolNix is een pakket dat een set opdrachten bevat voor het inspecteren, bewerken en maken van Matroska-bestanden. Als gevolg hiervan bevat het pakket vier opdrachten:

Deze MKVToolNix opdrachten installeer je met:

dany@pindabook:~$ sudo apt install mkvtoolnix
[sudo] wachtwoord voor root: 
Pakketlijsten worden ingelezen... Klaar
Boom van vereisten wordt opgebouwd... Klaar
De statusinformatie wordt gelezen... Klaar 
De volgende extra pakketten zullen geïnstalleerd worden:
  libpugixml1v5
Voorgestelde pakketten:
  mkvtoolnix-gui
De volgende NIEUWE pakketten zullen geïnstalleerd worden:
  libpugixml1v5 mkvtoolnix
0 opgewaardeerd, 2 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
Er moeten 5.235 kB aan archieven opgehaald worden.
Na deze bewerking zal er 26,7 MB extra schijfruimte gebruikt worden.
Wilt u doorgaan? [J/n] 
Ophalen:1 http://deb.debian.org/debian bookworm/main amd64 libpugixml1v5 amd64 1.13-0.2 [84,7 kB]
Ophalen:2 http://deb.debian.org/debian bookworm/main amd64 mkvtoolnix amd64 74.0.0-1 [5.151 kB]
5.235 kB opgehaald in 0s (10,8 MB/s)
Voorheen niet geselecteerd pakket libpugixml1v5:amd64 wordt geselecteerd.
(Database wordt ingelezen ... 173834 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../libpugixml1v5_1.13-0.2_amd64.deb wordt voorbereid...
Bezig met uitpakken van libpugixml1v5:amd64 (1.13-0.2) ...
Voorheen niet geselecteerd pakket mkvtoolnix wordt geselecteerd.
Uitpakken van .../mkvtoolnix_74.0.0-1_amd64.deb wordt voorbereid...
update-alternatives: fout: geen alternatieven voor mkvinfo
Bezig met uitpakken van mkvtoolnix (74.0.0-1) ...
Instellen van libpugixml1v5:amd64 (1.13-0.2) ...
Instellen van mkvtoolnix (74.0.0-1) ...
Bezig met afhandelen van triggers voor libc-bin (2.36-9+deb12u10) ...
Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...
Bezig met afhandelen van triggers voor hicolor-icon-theme (0.17-2) ...

Zodra de installatie is voltooid, moeten we de softwareversie kunnen controleren met één van de opdrachten, zoals mkvinfo.

dany@pindabook:~$ mkvinfo --version
mkvinfo v74.0.0 ('You Oughta Know') 64-bit

Een MKV-bestand kan meerdere bestanden bevatten, elk geïdentificeerd door een tracknummer. Laten we ze bekijken met mkvinfo:

dany@pindabook:~$ mkvinfo Elephant\ Dreams.mkv 
+ EBML kop
|+ EBML versie: 1
|+ EBML lees versie: 1
|+ Mmaximum EBML ID lengte: 4
|+ Maximale EBML-lengte: 8
|+ Document type: matroska
|+ Document versie type: 2
|+ Document lees type versie: 2
+ Segment: grootte 31762695
|+ Zoek kop (sub ingangen worden overgeslagen)
|+ EBML leegte: grootte 4027
|+ Segment informatie
| + Tijd code schaal: 1000000
| + Samenvoeg programma: libebml v1.0.0 + libmatroska v1.0.0
| + Applicatie aan het schrijven: mkvmerge v4.0.0 ('The Stars were mine') built on Jun  6 2010 16:18:42
| + Duur: 00:00:46.665000000
| + Datum: 2010-08-21 18:06:43 UTC
| + Segment UID: 0x9d 0x51 0x6a 0x0f 0x92 0x7a 0x12 0xd2 0x86 0xe1 0x50 0x2d 0x23 0xd0 0xfd 0xb0
|+ Sporen
| + Spoor
|  + Spoor nummer: 1 (spoor ID voor mkvmerge & mkvextract: 0)
|  + Spoor UID: 1258329745
|  + Spoor type: video
...
| + Spoor
|  + Spoor nummer: 2 (spoor ID voor mkvmerge & mkvextract: 1)
|  + Spoor UID: 3452711582
|  + Spoor type: audio
|  + Codec ID: A_AAC
|  + Codec privé data: grootte 2
|  + Standaard duur: 00:00:00.021333333 (46.875  beelden/velden per seconde voor een video spoor)
|  + Taal: und
|  + &Audio sporen:
|   + Voorbeeld frequentie: 48000
|   + Kanalen: 2
| + Spoor
|  + Spoor nummer: 3 (spoor ID voor mkvmerge & mkvextract: 2)
|  + Spoor UID: 368310685
|  + Spoor type: ondertitels
...
| + Spoor
|  + Spoor nummer: 10 (spoor ID voor mkvmerge & mkvextract: 8)
|  + Spoor UID: 215750297
|  + Spoor type: audio
|  + "Default track" flag: 0
|  + Codec ID: A_AAC
|  + Codec privé data: grootte 2
|  + Standaard duur: 00:00:00.046439909 (21.533  beelden/velden per seconde voor een video spoor)
|  + Naam: Commentary
|  + &Audio sporen:
|   + Voorbeeld frequentie: 22050
|   + Uitvoer voorbeeld frequentie: 44100
...
|+ EBML leegte: grootte 1342
|+ Cluster

Je krijgt een volledig overzicht, maar als je enkel de informatie over audio sporen wilt zien kan je filteren. De volgende opdracht gebruikt grep om te filteren waarbij gezocht wordt naar : audio en de 3 voorgaande (-B 3) en 8 daaropvolgende (-A 8) regels worden weergegeven:

dany@pindabook:~$ mkvinfo Elephant\ Dreams.mkv | grep -B 3 -A 8 ": audio"
| + Spoor
|  + Spoor nummer: 2 (spoor ID voor mkvmerge & mkvextract: 1)
|  + Spoor UID: 3452711582
|  + Spoor type: audio
|  + Codec ID: A_AAC
|  + Codec privé data: grootte 2
|  + Standaard duur: 00:00:00.021333333 (46.875  beelden/velden per seconde voor een video spoor)
|  + Taal: und
|  + &Audio sporen:
|   + Voorbeeld frequentie: 48000
|   + Kanalen: 2
| + Spoor
--
| + Spoor
|  + Spoor nummer: 10 (spoor ID voor mkvmerge & mkvextract: 8)
|  + Spoor UID: 215750297
|  + Spoor type: audio
|  + "Default track" flag: 0
|  + Codec ID: A_AAC
|  + Codec privé data: grootte 2
|  + Standaard duur: 00:00:00.046439909 (21.533  beelden/velden per seconde voor een video spoor)
|  + Naam: Commentary
|  + &Audio sporen:
|   + Voorbeeld frequentie: 22050
|   + Uitvoer voorbeeld frequentie: 44100

Er zijn dus twee audio sporen, één in het Engels en één met Engelse commentaar van de regisseur. Mediaspelers spelen indien er geen standaard audiospoor is ingesteld (geen "Default track" flag of alle audiosporen met de eigenschap "Default track" flag: 0) standaard het eerste audiospoor af. In ons voorbeeld Engelse video audio op Spoor nummer:2. Om de Engelse commentaar als standaard audiospoor te markeren, moeten we dus alle andere sporen niet standaard markeren (--edit track:a1 --set flag-default=0) en het commentaar spoor standaard markeren (--edit track:a2 --set flag-default=1). Let op het feit dat de opdracht geen gebruik maakt van de absolute Spoor nummers (2 en 10), maar van het eerste (a1) en tweede (a2) audiospoor.

dany@pindabook:~$ mkvpropedit Elephant\ Dreams.mkv --edit track:a1 --set flag-default=0 --edit track:a2 --set flag-default=1
Het bestand is geanalyseerd.
De veranderingen worden geschreven naar het bestand.
Gedaan.

Standaard wordt bij het afspelen van deze video nu het tweede audiospoor gebruikt. Je herstelt de situatie met de volgende opdracht:

dany@pindabook:~$ mkvpropedit Elephant\ Dreams.mkv --edit track:a1 --set flag-default=1 --edit track:a2 --set flag-default=0
Het bestand is geanalyseerd.
De veranderingen worden geschreven naar het bestand.
Gedaan.

Misschien hebben sommigen het al opgemerkt, maar er is een ondertitel aanwezig vol met rommel. Met mkvinfo kan je alle ondertitels met hun eigenschappen achterhalen. Met mkvmerge kan je sporen verwijderen en toevoegen. Bij het toevoegen of aanpassen van audiosporen en vooral videosporen moet mkvmerge de audio en/of video hercoderen, en dat kan tijdrovend zijn. We beperken ons dan ook tot het verwijderen van de rommel ondertitel. Een beknopt overzicht van de sporen kan je ook met mkvmerge opvragen:

dany@pindabook:~$ mkvmerge -i Elephant\ Dreams.mkv 
Bestand 'Elephant Dreams.mkv': houder: Matroska
Spoor ID 0: video (AVC/H.264/MPEG-4p10)
Spoor ID 1: audio (AAC)
Spoor ID 2: subtitles (SubRip/SRT)
Spoor ID 3: subtitles (SubRip/SRT)
Spoor ID 4: subtitles (SubRip/SRT)
Spoor ID 5: subtitles (SubRip/SRT)
Spoor ID 6: subtitles (SubRip/SRT)
Spoor ID 7: subtitles (SubRip/SRT)
Spoor ID 8: audio (AAC)
Spoor ID 9: subtitles (SubRip/SRT)
Spoor ID 10: subtitles (SubRip/SRT)
Globale markeer: 3 ingangen

Spoor 10 bevat de rommel ondertitel. Met de volgende opdracht kopieer je alle sporen uitgezonderd spoor 10 (\!10) naar het nieuwe MKV-bestand Elephant Dreams.OK.mkv met:

dany@pindabook:~$ mkvmerge -o Elephant\ Dreams.OK.mkv --subtitle-tracks \!10 Elephant\ Dreams.mkv 
mkvmerge v74.0.0 ('You Oughta Know') 64-bit
'Elephant Dreams.mkv': Gebruikmakend van de demultiplexer voor het format 'Matroska'.
'Elephant Dreams.mkv' spoor 0: Gebruikmakend van de uitvoer module voor het format 'AVC/H.264'.
'Elephant Dreams.mkv' spoor 1: Gebruikmakend van de uitvoer module voor het format 'AAC'.
'Elephant Dreams.mkv' spoor 2: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
'Elephant Dreams.mkv' spoor 3: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
'Elephant Dreams.mkv' spoor 4: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
'Elephant Dreams.mkv' spoor 5: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
'Elephant Dreams.mkv' spoor 6: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
'Elephant Dreams.mkv' spoor 7: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
'Elephant Dreams.mkv' spoor 8: Gebruikmakend van de uitvoer module voor het format 'AAC'.
'Elephant Dreams.mkv' spoor 9: Gebruikmakend van de uitvoer module voor het format 'tekst ondertiteling'.
Het bestand 'Elephant Dreams.OK.mkv' is voor schrijven aangemaakt.
Volg document(en) (cue) ingangen (de index) worden geschreven...
Samenvoegen duurde 0 seconden.

Ondertitels vertalen

Om dit te demonstreren, gebruiken we het tweede voorbeeld MKV-bestand. Opnieuw vragen we de video informatie op met mkvinfo.

dany@pindabook:~$ mkvinfo Vanilla\ Sky.mkv 
...
|+ Sporen
| + Spoor
|  + Spoor nummer: 1 (spoor ID voor mkvmerge & mkvextract: 0)
|  + Spoor UID: 3059093025
|  + Spoor type: video
...
| + Spoor
|  + Spoor nummer: 2 (spoor ID voor mkvmerge & mkvextract: 1)
|  + Spoor UID: 3212545613
|  + Spoor type: audio
...
| + Spoor
|  + Spoor nummer: 3 (spoor ID voor mkvmerge & mkvextract: 2)
|  + Spoor UID: 2706199548
|  + Spoor type: ondertitels
...
| + Spoor
|  + Spoor nummer: 4 (spoor ID voor mkvmerge & mkvextract: 3)
|  + Spoor UID: 3529758976
|  + Spoor type: ondertitels
...
|+ Cluster

Als we naar de bovenstaande uitvoer kijken, zien we dat de ondertitels 3 (Engels) en 4 (Duits) zijn. De spoor ID's voor de mkvmerge en mkvextract opdrachten beginnen echter met een index van 0. Daarom moeten we bij het gebruik van deze twee opdrachten naar de ondertiteling spoor ID's verwijzen als respectievelijk 2 en 3.

Laten we de Engelse ondertiteling extraheren met mkvextract en deze vervolgens opslaan in een SRT-bestand met de naam Vanilla Sky.srt:

dany@pindabook:~$ mkvextract tracks Vanilla\ Sky.mkv 2:Vanilla\ Sky.srt
Uittreksel van spoor 2 met de CodecID 'S_TEXT/UTF8' naar bestand 'Vanilla Sky.srt'. Inhoud format: SRT text subtitles
Voortgang: 100%

Vervolgens gebruiken we de head opdracht om een snelle blik te werpen op het eerste deel van het bestand.

dany@pindabook:~$ head Vanilla\ Sky.srt 
1
00:00:04,700 --> 00:00:06,736
where are you going so early?

2
00:00:06,900 --> 00:00:09,494
Don't record any more messages
on my alarm clock.

3

Nu hebben we software (opdrachten) nodig om onze Engelse ondertitels naar het Nederlands te vertalen. Dit kan op de klassieke manier via Google of Bing Translate of via AI. Zowel Google als Bing Translate zijn betalende diensten als je langere teksten zoals onze ondertitels wil vertalen. Door echter de ondertitels regel voor regel aan te bieden, kan het ook gratis. Op GitHub vond ik een eenvoudig script die dit voor elkaar krijgt. Je kunt het downloaden met:

dany@pindabook:~$ wget https://gist.github.com/markshust/21f954828a4bcbc7106d5de2f3128857/raw/13b8f355dad17e4876793a36e876f7c01ad8d234/translate.sh
--2025-05-20 18:31:09--  https://gist.github.com/markshust/21f954828a4bcbc7106d5de2f3128857/raw/13b8f355dad17e4876793a36e876f7c01ad8d234/translate.sh
Herleiden van gist.github.com (gist.github.com)... 140.82.121.3
Verbinding maken met gist.github.com (gist.github.com)|140.82.121.3|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 301 Moved Permanently
Locatie: https://gist.githubusercontent.com/markshust/21f954828a4bcbc7106d5de2f3128857/raw/13b8f355dad17e4876793a36e876f7c01ad8d234/translate.sh [volgen...]
--2025-05-20 18:31:10--  https://gist.githubusercontent.com/markshust/21f954828a4bcbc7106d5de2f3128857/raw/13b8f355dad17e4876793a36e876f7c01ad8d234/translate.sh
Herleiden van gist.githubusercontent.com (gist.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ...
Verbinding maken met gist.githubusercontent.com (gist.githubusercontent.com)|185.199.109.133|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 1439 (1,4K) [text/plain]
Wordt opgeslagen als: ‘translate.sh’

translate.sh                 100%[==============================================>]   1,41K  --.-KB/s    in 0s      

2025-05-20 18:31:10 (13,7 MB/s) - '‘translate.sh’' opgeslagen [1439/1439]

En maken het uitvoerbaar met de opdracht:

dany@pindabook:~$ chmod +x translate.sh

Dit script zorgt echter alleen voor het aanbieden van te vertalen regels en het terug opslaan van de vertaalde regels in een SRT ondertitel bestand. Het vertaalwerk zelf gebeurt door het Translate Shell op GitHub, dat we downloaden met:

dany@pindabook:~$ wget https://git.io/trans
--2025-05-20 18:40:53--  https://git.io/trans
Herleiden van git.io (git.io)... 140.82.114.21
Verbinding maken met git.io (git.io)|140.82.114.21|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 301 Moved Permanently
Locatie: https://github.com/soimort/translate-shell/raw/gh-pages/trans [volgen...]
--2025-05-20 18:40:53--  https://github.com/soimort/translate-shell/raw/gh-pages/trans
Herleiden van github.com (github.com)... 140.82.121.4
Verbinding maken met github.com (github.com)|140.82.121.4|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 302 Found
Locatie: https://raw.githubusercontent.com/soimort/translate-shell/gh-pages/trans [volgen...]
--2025-05-20 18:40:53--  https://raw.githubusercontent.com/soimort/translate-shell/gh-pages/trans
Herleiden van raw.githubusercontent.com (raw.githubusercontent.com)... 2606:50c0:8001::154, 2606:50c0:8000::154, 2606:50c0:8003::154, ...
Verbinding maken met raw.githubusercontent.com (raw.githubusercontent.com)|2606:50c0:8001::154|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 248738 (243K) [text/plain]
Wordt opgeslagen als: ‘trans’

trans                        100%[==============================================>] 242,91K  --.-KB/s    in 0,02s   

2025-05-20 18:40:54 (9,78 MB/s) - '‘trans’' opgeslagen [248738/248738]

En eveneens uitvoerbaar maken:

dany@pindabook:~$ chmod +x trans

Een korte test:

dany@pindabook:~$ ./trans :en -brief "Vertalen naar het engels."
Translate to English.

En vice versa:

dany@pindabook:~$ ./trans :nl -brief "Translate to English."
Vertalen naar het Engels.

Het translate.sh script was echter een vluchtig experiment en is voor verbetering vatbaar. Zo loopt het starten van trans niet altijd foutloos. Dit kunnen we echter zelf oplossen door het script aan te passen met een teksteditor (nano in de volgende opdracht).

dany@pindabook:~$ nano -l -B -P translate.sh

Voeg regel 6 toe. Deze zoekt de map op waarin het script is opgeslagen en slaat dit op in een variabele. Deze variabele wordt daarna in regel 44 gebruikt om trans op te starten. Pas regel 44 aan zoals hieronder. M.a.w. translate.sh en trans moeten in dezelfde map staan om samen de klus te klaren.

 GNU nano 7.2                                        translate.sh                                                   
1 #!/bin/bash
2
3 # Requires translate-shell to be installed.
4 # Get it on GitHub at: https://github.com/soimort/translate-shell
5
6 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

...

41 # Read input file and translate if necessary
42 while read -r line; do
43     if [[ "$line" =~ [a-z] ]] ; then
44         translated=$(echo "$line" | "$SCRIPT_DIR/trans" -brief ":$language")
45
46         if [[ $? -ne 0 ]]; then
47             echo "Error: Translation failed for '$line'. Skipping."
48         else
49             echo "$translated" >> "${file%.*}.$language.srt"
50         fi
51     else   
52         echo "$line" >> "${file%.*}.$language.srt"
53     fi
54 done < "$file"
55

^G Hulp         ^O Opslaan      ^W Zoeken       ^K Knippen      ^T Opdracht     ^C Positie      M-U Terugdraaien
^X Afsluiten    ^R Inlezen      ^\ Vervangen    ^U Plakken      ^J Uitvullen    ^/ Naar regel   M-E Herdoen

Na het toevoegen van regel 6 en het aanpassen van regel 44, sla je het script op met de sneltoets Ctrl+o, gevolgd door Enter. Nano sluit je af met de sneltoets Ctrl+x.

Dan kunnen we nu de ondertitel vertalen naar het Nederlands:

dany@pindabook:~$ ./translate.sh --file Vanilla\ Sky.srt --language nl

Wees geduldig, trans maakt gebruik van Google Translate en dit neemt door het online karakter tijd in beslag. De eerste regels van de vertaalde ondertitels bekijken we met:

dany@pindabook:~$ head Vanilla\ Sky.nl.srt 
1
00:00:04,700 --> 00:00:06,736
Waar ga je zo vroeg heen?

2
00:00:06,900 --> 00:00:09,494
Noteer geen berichten meer
op mijn wekker.

3
Nederlandse ondertitels

De trans opdracht gebruikt standaard Google Translate:

dany@pindabook:~$ ./trans :nl -brief "Help yourself to whatever you want.
Set the alarm before you go. And..."
Help jezelf tot wat je wilt.
Stel het alarm in voordat u gaat. En...

Maar met een extra optie kan je ook Bing Translate gebruiken:

dany@pindabook:~$ ./trans :nl -engine bing -brief "Help yourself to whatever you want.
Set the alarm before you go. And..."
Neem wat je wilt. Zet de alarm aan voordat je gaat. En...

Je merkt dat je niet dezelfde resultaten krijgt. Soms is de vertaling van Google beter dan deze van Bing of omgekeerd. Een voordeel van Open Source is dat je de broncode, in dit geval een eenvoudig script zelf kunt uitbreiden. Zo heb ik het script verder aangepast om te vertalen zowel via Google als via Bing. Daarna krijg je alle vertalingen en kan je een keuze maken of zelf nog verbeteringen aanbrengen.

#!/bin/bash

# Requires translate-shell to be installed.
# Get it on GitHub at: https://github.com/soimort/translate-shell

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

# Parse command-line arguments
while [[ "$#" -gt 0 ]]; do
    case $1 in
        --file|-f ) file="$2"; shift ;;
        --language|-l ) language="$2"; shift ;;
        --interactive|-i ) interactive=true; shift ;;
        * ) echo "Unknown option: $1"; exit 1 ;;
    esac
    shift
done

# Check that required arguments are provided
if [[ -z "$file" ]]; then
    echo "Error: Input file not specified."
    echo "Usage: $0 --file <input_file> --language <language_code>"
    exit 1
fi

if [[ -z "$language" ]]; then
    echo "Error: Language code not specified."
    echo "Usage: $0 --file <input_file> --language <language_code>"
    exit 1
fi

if [[ ! -f "$file" ]]; then
    echo "Error: Input file '$file' does not exist or is not a regular file."
    exit 1
fi

if ! [[ $language =~ ^[a-z]{2}$ ]]; then
    echo "Error: Language code '$language' is not valid. Please use a two-letter language code (ISO 639-1)."
    exit 1
fi

# Remove previous translation
if [[ -f "${file%.*}.$language.srt" ]]; then
    rm "${file%.*}.$language.srt"
fi
# Read input file and translate if necessary
while read -u 3 -r line; do
    if [[ "$line" =~ [a-z] ]] ; then
        if [ "$interactive" == true ] ; then
            auto_translated=$(echo "$line" | "$SCRIPT_DIR/trans" -brief ":$language")
            google_translated=$(echo "$line" | "$SCRIPT_DIR/trans" -engine google -brief ":$language")
            bing_translated=$(echo "$line" | "$SCRIPT_DIR/trans" -engine bing -brief ":$language")
            answer=""
            while [ "$answer" != "1" ] && [ "$answer" != "2" ] && [ "$answer" != "3" ] && [ "$answer" != "4" ]; do
                echo "Please choose an translation"
                echo "1) $line"
                echo "2) $auto_translated"
                echo "3) $google_translated"
                echo "4) $bing_translated"
                default="Correct translation"
                read -p "Your answer [default=$default] " answer
                answer=${answer:-$default}
                case $answer in
                    "1")
                        translated="$line"
                        ;;
                    "2")
                        translated="$auto_translated"
                        ;;
                    "3")
                        translated="$google_translated"
                        ;;
                    "4")
                        translated="$bing_translated"
                        ;;
                    "$default")
                        while [ "$answer" != "1" ] && [ "$answer" != "2" ] && [ "$answer" != "3" ] && [ "$answer" != "4" ]; do
                            echo "  Please choose which translation to correct"
                            echo "  1) $line"
                            echo "  2) $auto_translated"
                            echo "  3) $google_translated"
                            echo "  4) $bing_translated"
                            read -p "  Correct translation " answer
                            case $answer in
                                "1")
                                    correct="$line"
                                    ;;
                                "2")
                                    correct="$auto_translated"
                                    ;;
                                "3")
                                    correct="$google_translated"
                                    ;;
                                "4")
                                    correct="$bing_translated"
                                    ;;
                                *)
                                    echo "  Choose 1, 2, 3 or 4."
                                    ;;
                            esac
                        done
                        read -re -p '    Correct> ' -i "$correct" translated
                        ;;
                    *)
                        echo "  Choose 1, 2, 3 or 4."
                        ;;
                esac
            done
            echo "$translated" >> "${file%.*}.$language.srt"
        else
            translated=$(echo "$line" | "$SCRIPT_DIR/trans" -brief ":$language")
            if [[ $? -ne 0 ]]; then
                echo "Error: Translation failed for '$line'. Skipping."
                echo "$line" >> "${file%.*}.$language.srt"
            else
                echo "$translated" >> "${file%.*}.$language.srt"
            fi
        fi
    else
        echo "$line" >> "${file%.*}.$language.srt"
    fi
done 3< "$file"

Bij het uitvoeren van het uitgebreide script, krijg je bijvoorbeeld:

dany@pindabook:~$ ./translate.sh --file Vanilla\ Sky.srt --language nl --interactive
Please choose an translation
1) where are you going so early?
2) Waar ga je zo vroeg heen?
3) Waar ga je zo vroeg heen?
4) waar ga je zo vroeg naartoe?
Your answer [default=Correct translation] 
  Please choose which translation to correct
  1) where are you going so early?
  2) Waar ga je zo vroeg heen?
  3) Waar ga je zo vroeg heen?
  4) waar ga je zo vroeg naartoe?
  Correct translation 4
    Correct> Waar ga je zo vroeg naartoe?
Please choose an translation
1) Don't record any more messages
2) Noteer geen berichten meer
3) Noteer geen berichten meer
4) Neem geen berichten meer op
Your answer [default=Correct translation] 3
...

De eerste regels van het geoptimaliseerde ondertitel bestand zijn dan:

dany@pindabook:~$ head Vanilla\ Sky.nl.srt 
1
00:00:04,700 --> 00:00:06,736
Waar ga je zo vroeg naartoe?

2
00:00:06,900 --> 00:00:09,494
Noteer geen berichten meer
op mijn wekker.

3

Met de AI Hugging Face Space SRT Translating webpagina kan je volledige SRT ondertitel bestanden naar het Nederlands vertalen. En sneller en beter dan met Google en Bing translate.

Hugging Face SRT Translating

Het resultaat:

dany@pindabook:~$ head Downloads/translated_subtitles.srt 
1
00:00:04,700 --> 00:00:06,736
Waar ga je zo vroeg heen?

2
00:00:06,900 --> 00:00:09,494
Geen berichten meer opnemen
Op mijn wekker.

3

MKVToolNix grafische versie

Werk je liever met een grafisch programma, installeer dan:

dany@pindabook:~$ sudo apt install mkvtoolnix-gui 
[sudo] wachtwoord voor root: 
Pakketlijsten worden ingelezen... Klaar
Boom van vereisten wordt opgebouwd... Klaar
De statusinformatie wordt gelezen... Klaar 
De volgende extra pakketten zullen geïnstalleerd worden:
  libcmark0.30.2
Voorgestelde pakketten:
  mediainfo-gui
De volgende NIEUWE pakketten zullen geïnstalleerd worden:
  libcmark0.30.2 mkvtoolnix-gui
0 opgewaardeerd, 2 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
Er moeten 6.796 kB aan archieven opgehaald worden.
Na deze bewerking zal er 19,9 MB extra schijfruimte gebruikt worden.
Wilt u doorgaan? [J/n] 
Ophalen:1 http://deb.debian.org/debian bookworm/main amd64 libcmark0.30.2 amd64 0.30.2-6 [115 kB]
Ophalen:2 http://deb.debian.org/debian bookworm/main amd64 mkvtoolnix-gui amd64 74.0.0-1 [6.680 kB]
6.796 kB opgehaald in 1s (11,0 MB/s)        
Voorheen niet geselecteerd pakket libcmark0.30.2:amd64 wordt geselecteerd.
(Database wordt ingelezen ... 174237 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../libcmark0.30.2_0.30.2-6_amd64.deb wordt voorbereid...
Bezig met uitpakken van libcmark0.30.2:amd64 (0.30.2-6) ...
Voorheen niet geselecteerd pakket mkvtoolnix-gui wordt geselecteerd.
Uitpakken van .../mkvtoolnix-gui_74.0.0-1_amd64.deb wordt voorbereid...
Bezig met uitpakken van mkvtoolnix-gui (74.0.0-1) ...
Instellen van libcmark0.30.2:amd64 (0.30.2-6) ...
Instellen van mkvtoolnix-gui (74.0.0-1) ...
Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...
Bezig met afhandelen van triggers voor shared-mime-info (2.2-1) ...
Bezig met afhandelen van triggers voor mailcap (3.70+nmu1) ...
Bezig met afhandelen van triggers voor desktop-file-utils (0.26-1) ...
Bezig met afhandelen van triggers voor hicolor-icon-theme (0.17-2) ...
Bezig met afhandelen van triggers voor libc-bin (2.36-9+deb12u10) ...

Start MKVToolNix via de Programmastarter > Multimedia > MKVToolNix GUI (Matroska files creator and tools).

MKVToolNix GUI

Opruimen