LoginSignup
8
8

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-08-08

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

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

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8