VoiceText Web API on Windows(2)
続き。参った。
Invoke-RestMethod だけど、VoiceText のユーザーだけの標準認証が通らなかった。-Credential に secure-stringを渡して・・・ってパスワード空文字を受け付けない。
仕方ないので、Headerに突っ込むことにした。実際の渡し方は前回のサーバへの送信文字列でも判るし。
param( [String]$text , [String]$speaker="takeru" , [String]$emotion="" , [String]$emotion_level="1" , [String]$pitch="100" , [String]$speed="100" , [String]$volume="100" ) # , [switch]$play ) Function base64_encode { param($str) $byte = [Text.Encoding]::UTF8.GetBytes( $str ) return [Convert]::ToBase64String( $byte ) } Function msPlayerSync { param($wavfile) $ms = New-Object Media.SoundPlayer( (Resolve-Path $wavfile) ) $ms.PlaySync() } # main if($Env:VOICETEXT_API_KEY -eq $NULL){ # APIキーがセットされてない $apikey = Read-Host "YOUR_API_KEY" $Env:VOICETEXT_API_KEY = $apikey } $endpoint = "https://api.voicetext.jp/v1/tts" $hdr = @{} $hdr["Authorization"] = "Basic " + (base64_encode ( $Env:VOICETEXT_API_KEY + ":" )) # check => text if($text -eq ""){ throw 'Please set Text!' } if($text.Length -gt 200 ){ # 200文字以内 throw 'Text is in 200 characters!' } $rest_body = @{} $rest_body["text"] = $text $rest_body["speaker"] = $speaker $rest_body["emotion"] = $emotion $rest_body["emotion_level"] = $emotion_level $rest_body["pitch"] = $pitch $rest_body["speed"] = $speed $rest_body["volume"] = $volume $wavfile = [IO.Path]::GetTempFileName() + ".wav" Invoke-RestMethod -Uri $endpoint -Method POST -Headers $hdr ` -BODY $rest_body -OutFile $wavfile msPlayerSync $wavfile del $wavfile
このスクリプトを posh-VoiceText.ps1 てな名前で適当に保存する。
スクリプトを実行したことがない場合は、
Set-ExecutionPolicy RemoteSigned
を実行する必要がある。詳しくは、
Windows PowerShell 入門(3)-スクリプト編 (2/4):CodeZine を参照あれ。
このスクリプトの特徴は
- Powershellで書いたので、Windows7 SP2以降でインストールの必要なく動く
- 最初に APIキーを入れてね。以降は環境変数に保持してる
- .NETのメソッドで再生するので、その場で聞ける
- 拡張しやすいよ
って、とこかな。-text "ほげほげ" のオプション指定とかは「-」以降をTAB補完してくれます。
「-emotion sadness -emotion_level 2 -speaker takeru -speed 80」が疲れた感じがしてオススメ。
.\posh-VoiceText.ps1 -emotion sadness -emotion_level 2 ` -speaker takeru -speed 80 -text 'だが断る。 この岸部露伴が最も好きな事のひとつは、 自分で強いと思ってるやつに「ノー!」と断ってやる事だ…'
これを全部コピーして、PowerShellコンソールに貼り付けて実行するとしゃべるよー