Node.jsからA.I.VOICEに発話させる
はじめに
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}`);
}
ボイス一覧を取得・設定する
エディタには、デフォルトの標準ボイスと、値をカスタムしたユーザーボイスがあります。
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