見出し画像

GASで作ったnote記事読み上げツールにAivis Cloud TTSを追加してみた


こんばんは。ほったりたです。

以前、「note記事を音声で紹介するツール」をGAS(Google Apps Script)で作りました。

Gemini TTSを使って、8種類のキャラクター(アナウンサー、お笑い芸人、博士、半魚人ウオ太郎など)が記事を紹介してくれるツールです。

ただ、GeminiTTSの音声って綺麗なんですけど、あんまり差別化ができないので、日本語のTTSを色々探ってたところ、Aivis Cloud という日本語特化の音声合成APIを知り合いの方に教えていただいたので試してみました。しかも今はベータ版で無料とのことなので触り放題?です!

今回はこのAivis Cloudを既存ツールに組み込んでみた話です。


完成したツールの紹介

まずは完成したツールの様子を見てみてください。

既存の8キャラクター(Gemini TTS)に加えて、Aivis Cloudで2キャラクターを追加しました。

朗らかおじさん

アイドル

これで合計 10キャラクター になりました!

それぞれのキャラクターが、note記事の内容を分析して、そのキャラクターらしい口調で紹介してくれます。


Aivis Cloud とは

詳しくは公式サイトで。。

ベータ版の間はAPI利用も無料みたいなので使ってみました。



技術スタック

今回の実装で使用した技術は以下の通りです。

  • GAS(Google Apps Script):メインの実行環境

  • Gemini TTS API:既存の音声合成エンジン

  • Aivis Cloud API:新しく追加した音声合成エンジン

  • REST API:Aivis Cloudとの通信

既存のツールに機能を追加する形なので、基本的な構造は変えていません。


実装のポイント

やったこと

  1. Aivis Cloud APIキーを取得

  2. GASにAivis Cloud API呼び出し関数を追加

  3. キャラクターごとにTTSエンジン(Gemini / Aivis)を切り替え

  4. 音声フォーマット対応(Gemini→WAV / Aivis→MP3)

Aivis Cloud モデルUUID管理

各キャラクターに対応するAivis CloudのモデルUUIDを管理します。

UUIDはAvis Hubのキャラクターの詳細からコピーできます

function getAivisModelUUID(character) {
  var models = {
    'hogaraka_ojisan': '47e53151-a378-46f3-abee-ce13aa07feb1',
    'idol': '3328da9a-8124-4619-a853-f7fc2f37889f'
  };
  return models[character] || null;
}

AivisHubで気に入った声を見つけたら、そのUUIDをここに追加するだけです。

Aivis Cloud API呼び出し

GASからAivis Cloud APIを呼び出す関数です。

function callAivisCloudTTS(text, character) {
  var apiKey = PropertiesService.getScriptProperties().getProperty('AIVIS_API_KEY');
  var modelUUID = getAivisModelUUID(character);
  var url = 'https://api.aivis-project.com/v1/tts/synthesize';

  var payload = {
    model_uuid: modelUUID,
    text: text,
    use_ssml: false,
    use_volume_normalizer: true,
    output_format: 'mp3',
    speaking_rate: 0.95  // しっとり読み上げのため少しゆっくり
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    headers: { 'Authorization': 'Bearer ' + apiKey },
    payload: JSON.stringify(payload)
  };

  var response = UrlFetchApp.fetch(url, options);
  var audioBlob = response.getBlob();
  return Utilities.base64Encode(audioBlob.getBytes());
}

REST APIなので、GASから呼び出すのがとても簡単です。

speaking_rateで話す速度を調整できます。今回は0.95に設定することで、少しゆっくりとした読み上げになっています。

使ってみた感想


日本語のイントネーションは結構自然ですが、普通にテキストを渡すだけだと文と文のつながりが気になる。間をとったりして自然な話ぶりにしたいところなのでSSMLを活用した方が良さそうです。


最後まで読んでいただきありがとうございました!

普段は「はっきんぐパパ」として電子工作やものづくりの記事も書いていますので、こちらもぜひ覗いてみてください。

はっきんぐパパはこちら↓


いいなと思ったら応援しよう!

Hottarita(ほったりた) いつも読んで頂きありがとうございます! いただいたサポートは子どものためのもの作りの活動費に使わせていただきます!