Node.js / Google Cloud Text-to-Speech を使ったテキストの読み上げ機能を実装

hikaru🐧
@alclimb

ローカルでテキスト文字列から MP3 音声ファイルをサクッと出力するツールが欲しくて Node.js で書いてみた。声質の設定を日本向けにすると日本語も割と流暢にしゃべってくれる。

package.json

{
    ... 省略

    "scripts": {
        "start": "ts-node ./src/index.ts"
    },
    "dependencies": {
        "@google-cloud/text-to-speech": "^2.3.0",
        "dotenv": "^8.2.0",
        "fs-extra": "^8.1.0",
        "ts-node": "^8.8.1",
        "typescript": "^3.8.3"
    }
}


.secrets/.env

GOOGLE_APPLICATION_CREDENTIALS=".secrets/text_to_speech-service_account.json"


.secrets/text_to_speech-service_account.json

{
  "type": "service_account",
  "project_id": <省略>,
  "private_key_id": <省略>,
  "private_key": <省略>,
  "client_email": <省略>,
  "client_id": <省略>,
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": <省略>
}


src/index.ts

import dotenv from "dotenv"
import * as fs from "fs-extra"
import { TextToSpeechClient, protos } from "@google-cloud/text-to-speech"

// 環境設定を読み込み
dotenv.config({ path: `./.secrets/.env` })

// メイン処理を実行
main()

async function main() {
    // TextToSpeechのクライアントを生成
    const client = new TextToSpeechClient()

    // 音声合成要求設定
    const request: protos.google.cloud.texttospeech.v1.ISynthesizeSpeechRequest = {
        // しゃべってもらう文字列
        input: { text: `hello, world!` },

        // 声質の設定
        voice: { languageCode: `en-US`, name: `en-US-Wavenet-D` },

        // 音声出力の設定
        audioConfig: {
            audioEncoding: `MP3`,
            pitch: 0.00,
            speakingRate: 1.00
        },
    }

    // 音声合成要求を実行
    const [response] = await client.synthesizeSpeech(request)

    // バイナリ音声データをローカルファイルに書き込む
    fs.writeFileSync(`output.mp3`, response.audioContent, `binary`)

    console.log(`Audio content written to file: output.mp3`)
}


npm run start コマンドを実行するとカレントディレクトリに output.mp3 が出力される。

参考資料


広告欄
WRITTEN BY
hikaru🐧
@alclimb
SERIES
この記事に連載はありません。
READ NEXT
COMMENTS
コメント機能は開発中です。実装完了まで今しばらくお待ちください。