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