ガイド

Ruby の音声読み上げ:スクリプトと Rails アプリ

Ruby には独自の音声合成がありません。スクリプトでは Mac の say や Linux の espeak を呼ぶことが多いものの声はロボット的で、Rails アプリはたいていテキストを文字数課金のクラウドAPIに送っています。

無料の SuperClonica エンジンはアプリの隣で HTTP サーバーとして動き、31言語の自然な声を使えます。呼び出すのに必要なのは Ruby の標準ライブラリだけ。このガイドでは、シンプルなスクリプト、Active Job と Active Storage を使う Rails の構成、本番で安全に運用するための習慣を紹介します。

Ruby が話す方法

音声はテキストの版ごとに一度だけ作ってファイルで配信し、リクエストのたびに合成しないようにしましょう。

  • システムの声:system() で say や espeak。設定不要ですが、ロボット的でマシンごとに違います。
  • クラウドAPI:自然な声ですが、キー、文字数ごとの請求、そして他社のサーバーに渡るテキスト。
  • SuperClonica:自然な声、キャラクターの声、自作の声を使えるローカルサーバー。Ruby は JSON を送り、WAV を受け取ります。
  • 31言語を話します。中国語にはまだ対応していません。

声を無料で聞く

コードを書く前に、どの声のページでも30〜100文字の文を入力し、言語を選んで生成ボタンを押してみてください。数秒で、アプリに持たせられる声が分かります。アカウントは不要です。

音声サーバーを起動する

NVIDIA のグラフィックカードと cuda イメージなら速くなりますが、ふつうのCPUで十分です。

  • 同じマシンか非公開のマシンでサーバーを起動:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。
  • 初回起動時に Supertonic 3 のモデル(約385 MB)がダウンロードされます。準備ができたかは GET /health で分かります。
  • POST /synthesize は text、voice、lang、seed、normalize を含む JSON を受け取り、16ビット・モノラルの WAV を返します。
  • 既定では1リクエスト5,000文字まで(SUPERCLONICA_MAX_TEXT)。長い文章は段落ごとに分けましょう。

Ruby から呼び出す

gem は不要です:require "net/http"; require "json"; uri = URI("http://localhost:8000/synthesize"); res = Net::HTTP.post(uri, { text: "Ruby からこんにちは!", voice: "F1", lang: "ja" }.to_json, "Content-Type" => "application/json"); File.binwrite("hello.wav", res.body) if res.is_a?(Net::HTTPSuccess)。カタログの声を使うなら、標準の名前の代わりに読み込んだファイルを送ります:voice: JSON.parse(File.read("voice.json"))。アプリですでに Faraday や HTTParty を使っているなら、同じように使えます。

Rails:バックグラウンドジョブと Active Storage

Rails では、Web リクエストの中ではなく Active Job で音声化し、結果をレコードに添付します:post.audio.attach(io: StringIO.new(res.body), filename: "post-#{post.id}.wav", content_type: "audio/wav")。テキストが変わったときだけ作り直しましょう。ポート8000をインターネットに公開しないでください。サーバーに SUPERCLONICA_API_KEY を設定して Authorization: Bearer ヘッダーで送るか、サーバーを非公開ネットワークに置きます。音声が生成されたものであることも聞き手に伝えましょう。