思い出しながらソースをペーストしているので違ってる部分もあるかも
解説というより思い出す為のメモ程度だと思ってください。
VOICEVOXとは
つよつよエンジニアが作った音声読み上げソフト、詳しくはここ見て
https://voicevox.hiroshiba.jp/
こんなツイートがあったので試してみた
「 #VOICEVOX を外部のソフトウェアから使えますか?」という質問をよく貰います。すごく簡単に使えます!
— ヒホ(ヒロシバ)🗑️ (@hiho_karuta) August 4, 2021
VOICEVOXの音声合成エンジンはローカルにHTTPサーバーが立っているだけなので、こんな感じでPOSTを叩けばテキスト読み上げができます。
詳しくは localhost:50021/docs をご覧ください。 pic.twitter.com/JFg2xMLgGK
とりあえずやりたいこと
Node.jsを使用してVOICEVOXで読み上げデータを作りたい。
準備&インストール
npm install axios
npm install fs
VOICEVOXに含まれている VOICEVOX-0.1.1-win/run.exe を起動しておく
すると http://localhost:50021 に接続することができる。
http://localhost:50021/docs にかかれているメソッドの結果を組み合わせると音声パラメータや音源を生成することができる。
実装
const { default: axios } = require("axios");
const fs = require("fs");
//axios=通信するやつ
//httpを省略するとうまく接続できなかったのでしっかり書いておく。
const rpc = axios.create({ baseURL: "http://localhost:50021", proxy: false });
//text:喋ってもらいたい言葉
//filepath:保存先
//ex:genAudio("こんにちは","./greeting.wav");
async function genAudio(text, filepath) {
/* まずtextを渡してsynthesis宛のパラメータを生成する、textはURLに付けるのでencodeURIで変換しておく。*/
const audio_query = await rpc.post('audio_query?text=' + encodeURI(text) + '&speaker=1');
//audio_queryで受け取った結果がaudio_query.dataに入っている。
//このデータをメソッド:synthesisに渡すことで音声データを作ってもらえる
//audio_query.dataはObjectで、synthesisに送る為にはstringで送る必要があるのでJSON.stringifyでstringに変換する
const synthesis = await rpc.post("synthesis?speaker=1", JSON.stringify(audio_query.data), {
responseType: 'arraybuffer',
headers: {
"accept": "audio/wav",
"Content-Type": "application/json"
}
});
//受け取った後、Bufferに変換して書き出す
fs.writeFileSync(filepath, new Buffer.from(synthesis.data), 'binary');
}
genAudio("こんにちは","greeting.wav");
偶に読み上げに失敗するとステータス500が返ってきたりするので、うまくいかないときは特殊文字とかが含まれてたり
読ませたい文字が長すぎではないかを確認する。
再起動などするとうまくいくときもある。
結果
greeting.wavが生成されている、再生すると可愛い声の「こんにちは」を聞くことができる。
そのうちやりたいこと
Chrome拡張とか作って選択箇所を読ませるのを作りたい。
追記:作ってみたけど実用的ではない速度でした。(大体1ツイート30秒くらい)←しょうがない、というか十分速いです