[PowerShell] Google Cloud Text-to-Speechでテキストから音声ファイルをつくる


やりたいこと

テキストから自然な音声を生成したい。無償のソフトなりwebサービスなどがあるが不自然なものばかり。
そのなかでも、GoogleのText to Speechは最も自然に発音してくれた。
GoogleのText to Speechを使って、wavファイルを生成する。PowerShellを使ってやってみる。

Cloud Text-to-Speech
https://cloud.google.com/text-to-speech/?hl=ja

Google Cloud Platformの設定

Googleのチュートリアルに従えばほぼできる。
https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja

  • Google Cloud Platformの利用登録
  • Cloud プロジェクトの作成
  • Cloud Text-to-Speech API を有効。
  • 認証の設定 (ここで、.jsonファイルが生成されるのであとで使う)
  • Google cloud SDKのインストール

PowerShellのスクリプト

ほぼこれを使用させてもらった。
https://www.mitabou.com/2020/05/ai.html
(リンク切れ)

そのままでは変換できなかったのと、wavファイルがほしかったので、2点スクリプトは変更している。

  • Googleのチュートリアルに書かれているように、認証設定のところで生成された.jsonのパスを、スクリプトに入れておく必要がある。
$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\xxxxx\xxxxxx\xxxxxx.json"
  • もとのスクリプトは、mp3に変換するものだった。wavにしたいときは、mp3をwavに書き換えるだけでよい。
certutil -decode -f synthesize-output-base64.txt synthesized-audio.wav
  • 食わせるjsonファイル(request.json)は、同じフォルダに置いておく。Cloud Text-to-Speechのサイトで、喋らせたい言葉を入力しし、show jsonを押して、表示されたRequest Bodyのところをそのままコピペする。

  • request.jsonは、UTF-8にして保存しないとだめ。(保存するときにUTF-8を選択)

スクリプト

$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\xxxxx\xxxxx\xxxx.json"

$cred = gcloud auth application-default print-access-token

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

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 > lf_synthesize-output-base64.txt
[string]::Join("`r`n",(Get-Content .\lf_synthesize-output-base64.txt)) | Set-Content .\crlf_synthesize-output-base64.txt
findstr /r "audioContent" crlf_synthesize-output-base64.txt > find_lf_synthesize-output-base64.txt
$audioline = [string]::Join("`r`n",(Get-Content .\find_lf_synthesize-output-base64.txt))
$wqcontent = $audioline.split(":")
$noaudioline = $wqcontent[1]
$wqcontent = $noaudioline.trim()
$content = $wqcontent.trim('"')
$content > .\lfcontent_synthesize-output-base64.txt
[string]::Join("`r`n",(Get-Content .\lfcontent_synthesize-output-base64.txt)) | Set-Content .\synthesize-output-base64.txt
certutil -decode -f synthesize-output-base64.txt synthesized-audio.wav

参考

  • Googleのチュートリアルより細かくかかれている。

https://blog.apar.jp/web/9893/

・Google Cloud SDK のインストールについて

https://cloud.google.com/sdk/docs/install?hl=JA