drill_devのブログ

にんともかんとも

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コンソールに貼り付けて実行するとしゃべるよー