🔊

Node.jsからA.I.VOICEに発話させる

2023/04/07に公開

はじめに

A.I.VOICEにはCOMコンポーネントによるAPIが用意されています。
Node.jsから呼び出す際、COMの知識がなく若干手こずったのでそれの備忘録です。

環境構築

Node.jsからCOMコンポーネントもとい、ActiveXコントロール(違いはわからん)を呼び出すにはwinaxが必要なので、最初に導入しておきます。

npm install winax

winaxはネイティブモジュールなので、事前にPythonとVisualStudioインストーラからC++によるデスクトップ開発をインストールしておく必要があります

チュートリアル

以下は、公式ドキュメント一部をjsに書き換えたもの(+追加)です。
とりあえず、任意のテキストを発話させるところまでやります。

APIオブジェクトを生成する

A.I.VOICE Editorを操作するためのオブジェクトを生成します。

require("winax");
let ttsControl=new ActiveXObject("AI.Talk.Editor.Api.TtsControl");

APIを初期化する

GetAvailableHostNames()で利用可能なホストの名称を取得して、それをAPIの初期化関数に渡しています。
戻り値が配列になってますが、とりあえず0個目を指定しています。(要素が二個以上ある場合ってあるんですかね?)

let currentHost=ttsControl.GetAvailableHostNames()[0];
ttsControl.Initialize(currentHost);

ホストへ接続する

ここでA.I.VOICE Editorと接続を確立しています。エディタが起動していない(NotRunning)の場合はStartHost()で起動しています。
また、Connect()したあと、10分間APIを介した操作をしていない状態が続くと自動的に接続が解除されます。

const HostStatus={
    NotRunning: 0,
    NotConnected: 1,
    Idle: 2,
    Busy: 3
}

try{
    if(ttsControl.Status===HostStatus.NotRunning){
        ttsControl.StartHost();
    }
    ttsControl.Connect();
    console.log(`ホストバージョン: ${ttsControl.Version}`);
    console.log("ホストへの接続を開始しました。");
}
catch(ex){
    throw new Error(`ホストへの接続に失敗しました。\n${ex.message}`);
}

ボイス一覧を取得・設定する

A.I.VOICE Editor
エディタには、デフォルトの標準ボイスと、値をカスタムしたユーザーボイスがあります。
VoiceNamesプロパティは、標準ボイス(キャラクター名)一覧を取得します。
VoicePresetNamesプロパティは、上記に加え、ユーザーボイス名一覧も入ります。
CurrentVoicePresetNameプロパティに上記で取得した文字列を代入することでボイスを変更することができます。

const voiceNames=ttsControl.VoiceNames;//利用可能なキャラクター名一覧を取得
// [ '琴葉 茜', '琴葉 茜(蕾)', '琴葉 葵', '琴葉 葵(蕾)' ]

const voicePresetNames=ttsControl.VoicePresetNames;//標準ボイス、ユーザーボイス名一覧を取得
// [ '琴葉 茜 - 新規', '琴葉 茜', '琴葉 茜(蕾)', '琴葉 葵', '琴葉 葵(蕾)' ]

//ボイスを琴葉 葵に設定する
ttsControl.CurrentVoicePresetName=voiceNames[2];

テキストを設定して喋らせる

GetPlayTime()で再生時間をミリ秒単位で取得できます。

try{
    ttsControl.Text=`${ttsControl.CurrentVoicePresetName}やで~`;// '琴葉 葵やで~'

    ttsControl.Play();
    console.log("音声を再生しました。");
    console.log(`再生時間: ${ttsControl.GetPlayTime()/1000}`);// '再生時間: 1.301秒'

    //ttsControl.Stop()で音声を停止
}
catch(ex){
    throw new Error(`音声の再生に失敗しました。\n${ex.message}`);
}

ホストとの接続を解除する

try{
    //ホストプログラムとの接続を解除する
    ttsControl.Disconnect();

    console.log("ホストへの接続を終了しました。");
}
catch(ex){
    throw new Error(`ホストへの接続の終了に失敗しました。\n${ex.message}`);
}

他にもいろいろありますので、詳しくはリファレンスを参照してください

参考

VOICEPEAKもAPI対応してください....

Discussion