Lav dine egne lydfiler med google text to speech og powershell

Google har nogle rigtigt gode tjenester til at lave tekst til tale, hvor du kan sende tekst ind og få en mp3 fil tilbage med din tekst læst op. Denne guide vil vise dig hvordan du bruger dem sammen med et powershell script til at lave mp3 filer i høj kvalitet på dansk. Du kan lytte til et eksempel her.

Dette kan være en stor hjælp hvis du hurtigt skal bruge en masse lydfiler på næsten et hvilket som helst europæisk sprog.

Tjenesten er ikke gratis men de første 4 millioner (eller 1 million tegn hvis man bruger højkvalitetsstemmer som i dette eksempel) tegn (bokstaver) om måneden er gratis, hvilket burde dække rigtigt mange behov inden for den gratis ramme. Bruger man mere end det kan man se priserne her.

Powershell scripts

Først skal du lave en mappe dine filer kan være i. Derefter skal du oprettet en fil kaldet request.json der beskriver hvad du vil have google til at læse op. Her er et eksempel med kommentarer:

{
        "input":{
          "text":"Her skal du skrive hvad du vil have google til at sige!"
        },
        "voice":{
          "languageCode":"da-dk",
          "name":"da-DK-Wavenet-A",
          "ssmlGender":"FEMALE"
        },
        "audioConfig":{
          "audioEncoding":"MP3"
        }
}
  • Text er det som google skal læse op. Det er vigtigt at stavning og grammatik er korrekt, ellers begynder det meget hurtigt at lyde forkert.
  • languageCode er det sprog og lande kode den skal læse op, hvis den skal læse svensk op skal det ændres til sv-se.
  • Name er ”navnet” på den stemme som google skal bruge til at læse teksten op. Du kan finde dem alle samme her.

Nu skal du lave et powershell script, du kan for eksempel kalde det ”lav-lyd-fil.ps1” og åbne det i din editor (jeg anbefaler visual studio code). Scriptet skal se ud som dette:

$cred = "XYZ" #Skift XYZ ud med din token, se artiklen for hvordan

$headers = @{ "Authorization" = "Bearer $cred" }

$resultat = Invoke-WebRequest  -Method POST -Headers $headers -ContentType: "application/json; charset=utf-8" -InFile request.json -Uri "https://texttospeech.googleapis.com/v1/text:synthesize" | Select-Object -Expand Content 
# Hvis du skal bruge en proxy kan du putte -Proxy  "http://adresse:port" efter Invoke-WebRequest 
 
$lydFil = $resultat | ConvertFrom-Json  #Konverter til json så vi kan trække data ud

$lydfil.audioContent | Out-File -FilePath "./resultat.txt" -Encoding ascii -Force # Gem json lyd indholdet som en fil vi kan konvertere

certutil -decode "resultat.txt" $args[0] #Gemmer resultatet som en mp3 fil med navnet fra første kommandolinie parameter, resultat.txt er bare et tekst resultat der skal konverteret til en mp3 fil

For at kører scriptet skal du have en google cloud platform konto. Det kan du oprette på cloud.google.com. Når den er oprettet, skal du have din godkendelses token, den kan du få ved at gå til https://developers.google.com/oauthplayground/

Her skal du vælge Cloud Text-to-Speech API v1 og klikke ”Authorize API’s”.

auth API

Nu skal du trykke på den blå ”Exchange authorization code for tokens” og så kopiere nøglen der står i feltet Access token og sætte den ind hvor der står XYZ på første linie på dit script.

auth API

Som standard udløber din token efter et stykke tid, det kan du forhindre ved at sætte kryds i auto-refresh. Denne token skal du ikke dele med andre, alle vil kunne bruge den til at lave tekst til tale med din google cloud konto.

Nu kan du kører dit script ved at skrive PowerShell.exe -ExecutionPolicy Bypass -File .\lav-lyd-fil.ps1 min-lyd.mp3 i en powershell kommando linie. Så vil det se ud som følger:

powershell command execution

Hvis vi bryder kommandoen ned, er der 3 dele:

  • PowerShell.exe -ExecutionPolicy Bypass -File Denne del fortæller powershell at det er ok at kører scripts, hvilket ellers er slået fra som default.

  • .\lav-lyd-fil.ps1 som er dit script

  • Min-lyd.mp3 hvilket er en parameter der fortæller hvor lyden skal gemmes. Du kan bruge et hvilket som helst filnavn.

Hvis du kører kommandoen i visual studio code eller direkte på en server kan du bare skrive .\lav-lyd-fil.ps1 min-lyd.mp3 Du kan hente en zip fil med alle de refererede filer her.

Mulige fejl

Hvis du har problemer med din API token vil du få en fejl som denne:

PS C:\Users\marti\OneDrive\kode\powershell-googleTTS> .\lav-lyd-fil.ps1
Invoke-WebRequest : Fjernserveren returnerede en fejl: (401) Uautoriseret.
At C:\Users\marti\OneDrive\kode\powershell-googleTTS\lav-lyd-fil.ps1:5 char:13
Her skal du prøve at kopiere den fra websitet igen.

Hvis der er fejl i din request.json vil den for eksempel sige:

PS C:\Users\marti\OneDrive\kode\powershell-googleTTS> .\lav-lyd-fil.ps1
Invoke-WebRequest : Fjernserveren returnerede en fejl: (400) Forkert anmodning.
Her bør du kigge efter manglende tegn eller slå fejl. Du kan evt starte forfra med mit eksempel.

Mulige forbedringer

Det manuelle skridt med at få en access token via deres hjemmeside kan scriptes så programmet selv hente en ny ved hver kørsel. Du kan automatisere skabelsen af request.json så den tekst der bliver genereret bliver skabt dynamisk af et andet program så skaber lydfilerne.