webrick で rubyスクリプトで rest api サーバーを立ち上げて、voicevox にアクセスできるようにした(powershell で rest api サーバーを書いていたがそれをやめて ruby だけで書いた)。voicevox2.rb
require 'net/http'
require 'uri'
require 'json'
require 'webrick'
def speak(text, speaker)
puts text, speaker
uri = URI.parse("http://localhost:50021/audio_query")
uri.query = URI.encode_www_form({ "text" => text, "speaker" => speaker })
headers = {
"Content-Type" => "application/json",
"User-Agent" => "vox-client:0.1",
}
response = Net::HTTP.post(uri, "", headers)
case response
when Net::HTTPSuccess
result = JSON.parse(response.body)
else
puts "audio query error: #{response}"
end
uri = URI.parse("http://localhost:50021/synthesis")
uri.query = URI.encode_www_form({ "speaker" => speaker })
response = Net::HTTP.post(uri, response.body, headers)
if response.code == '200'
File.open("output#{speaker}.wav", "wb") do |f|
f.write(response.body)
end
else
puts "synthesis response error"
end
end
# サーバーの設定
server = WEBrick::HTTPServer.new(
Port: 6001,
BindAddress: '0.0.0.0'
)
# POST /talk というパスへの処理を定義
server.mount_proc '/talk' do |req, res|
# POSTメソッド以外は受け付けない
if req.request_method == 'POST'
begin
# 1. リクエストボディを読み込んでJSONパース
data = JSON.parse(req.body)
# 2. "message" キーを取り出して表示
message = data["message"]
puts "[#{Time.now}] 受信メッセージ: #{message}"
speak(message, 1)
# powershell で output*.wav を鳴らす
system("powershell -ExecutionPolicy Bypass -command .\\sound1.ps1")
# 3. ステータスコード 204 (No Content) を設定
res.status = 204
rescue => e
puts "エラーが発生しました: #{e.message}"
res.status = 400 # 不正なリクエスト
end
else
res.status = 405 # Method Not Allowed
end
end
# Ctrl+C で安全に停止するための設定
trap('INT') { server.shutdown }
# サーバー起動
puts "Server started on http://localhost:6001"
server.start
ruby (もしくは python) でできることは powershell でやる必要は無いなと思う。powershell でしかできないこと(windows固有の、wavを再生するとか)だけを powershell に投げれば良いのではないか。いや、それが当たり前なんだろうけど。