Node.jsからVOICEVOXを使ってみる。


思い出しながらソースをペーストしているので違ってる部分もあるかも
解説というより思い出す為のメモ程度だと思ってください。

VOICEVOXとは

つよつよエンジニアが作った音声読み上げソフト、詳しくはここ見て
https://voicevox.hiroshiba.jp/

こんなツイートがあったので試してみた

とりあえずやりたいこと

Node.jsを使用してVOICEVOXで読み上げデータを作りたい。

準備&インストール

npm install axios
npm install fs

VOICEVOXに含まれている VOICEVOX-0.1.1-win/run.exe を起動しておく
すると http://localhost:50021 に接続することができる。
http://localhost:50021/docs にかかれているメソッドの結果を組み合わせると音声パラメータや音源を生成することができる。

実装

index.js
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秒くらい)←しょうがない、というか十分速いです