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

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark