cloud text to speechGCP (Google Could Platform)

GCPのCLOUD TEXT-TO-SPEECHで日本語を話す

GCP系もそろそろ触ってみようかと思ったので、とりあえずTTS試してみました。 Node.jsのライブラリインストール 日本語のプロファイルを集める。 全てのプロファイルでmp3を作る せっかくなので、先ほどのプロファイ […]

広告ここから
広告ここまで

GCP系もそろそろ触ってみようかと思ったので、とりあえずTTS試してみました。

Node.jsのライブラリインストール

$ npm i -S @google-cloud/text-to-speech

日本語のプロファイルを集める。

const textToSpeech = require('@google-cloud/text-to-speech');
const wf = async () => {
  const client = new textToSpeech.TextToSpeechClient({
    credentials: {
      client_email: conf.client_email,
      private_key: conf.private_key
    },
    projectId: conf.projectId,
  });

  const [result] = await client.listVoices({});
  const voices = result.voices;

  const items = [];
  voices.forEach(voice => {
    if (!/ja/g.test(voice.name)) return;
    items.push({
      name: voice.name,
      ssmlGender: voice.ssmlGender,
      languageCode: 'ja-JP'
    });
  });
  console.log(JSON.stringify(items));
}
wf()

// 実行結果
[
  {
    "name": "ja-JP-Wavenet-A",
    "ssmlGender": "FEMALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Wavenet-B",
    "ssmlGender": "FEMALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Wavenet-C",
    "ssmlGender": "MALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Wavenet-D",
    "ssmlGender": "MALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Standard-A",
    "ssmlGender": "FEMALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Standard-B",
    "ssmlGender": "FEMALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Standard-C",
    "ssmlGender": "MALE",
    "languageCode": "ja-JP"
  },
  {
    "name": "ja-JP-Standard-D",
    "ssmlGender": "MALE",
    "languageCode": "ja-JP"
  }
]

全てのプロファイルでmp3を作る

せっかくなので、先ほどのプロファイルを使ってmp3を一気に作ります。

const textToSpeech = require('@google-cloud/text-to-speech');
const fs = require('fs');
const util = require('util');

const wf = async () => {
  // クライアントのセットアップ
  const client = new textToSpeech.TextToSpeechClient({
    credentials: {
      client_email: conf.client_email,
      private_key: conf.private_key
    },
    projectId: conf.projectId,
  });

  // 音声の一覧を取得
  const [result] = await client.listVoices({});
  const voices = result.voices;

  // 日本語のプロファイルのみに絞り込む
  const items = [];
  voices.forEach(voice => {
    if (!/ja/g.test(voice.name)) return;
    items.push({
      name: voice.name,
      ssmlGender: voice.ssmlGender,
      languageCode: 'ja-JP'
    });
  });

  // mp3を作成する
  await Promise.all(items.map(async (voice, i) => {
    const request = {
      input: {ssml: '<speak>こんにちは</speak>'},
      voice,
      audioConfig: {audioEncoding: 'MP3'},
    };
    const [response] = await client.synthesizeSpeech(request);
    const writeFile = util.promisify(fs.writeFile);
    await writeFile(`output-${i}.mp3`, response.audioContent, 'binary');
    console.log(`Audio content written to file: output-${i}.mp3`);
  }))
}

wf()

作成すると、7ファイルほど作成されています。

$ ls | grep mp3
output-0.mp3
output-1.mp3
output-2.mp3
output-3.mp3
output-4.mp3
output-5.mp3
output-6.mp3
output-7.mp3

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts