勉強がてらCeVIO AIの外部連携インターフェイスを叩くラッパーを作ってみました。
(pip install sasawrapper
でインストールできます。)
これを作った時の備忘録です。
PythonでCOMコンポーネントを使う
COMコンポーネントの形で公開されているのでこれを使用します。
PythonからCOMコンポーネントを使用するにはpywin32を使用します。
pipでインストールします。
pip install pywin32
COMコンポーネントを読み込む
CeVIOの外部インターフェースのコンポーネントは2つあるのでそれぞれ読み込み、インスタンスを作成します。
service_controlは制御機能、talker2はトーク機能です。
import win32com.client
service_control = win32com.client.Dispatch("CeVIO.Talk.RemoteService2.ServiceControl2V40")
talker2 = win32com.client.Dispatch("CeVIO.Talk.RemoteService2.Talker2V40")
実際に操作する
制御機能
CeVIO AIを起動する
service_control.StartHost(False)
バージョンを確認する
print(service_control.HostVersion)
8.1.34.0
CeVIO AIに終了を要求する
service_control.CloseHost(0)
トーク機能
予めCeVIO AIを起動する
service_control.StartHost(False)
キャストを確認する
string_array = talker2.AvailableCasts
print([string_array.At(i) for i in range(string_array.Length)])
['さとうささら']
キャストを設定する
talker2.Cast = "さとうささら"
音量を設定する
talker2.Volume = 60
感情を確認する
component_array = talker2.Components
print([component_array.At(i).Name for i in range(component_array.Length)])
['元気', '普通', '怒り', '哀しみ']
感情を設定する
component_array.ByName("元気").Value = 0
component_array.ByName("普通").Value = 0
component_array.ByName("怒り").Value = 50
component_array.ByName("哀しみ").Value = 50
再生する
text = "こんにちは"
talker2.Speak(text).Wait()
音素のデータを取得する
phoneme_data_array = talker2.GetPhonemes(text)
result = []
for i in range(phoneme_data_array.Length):
phoneme_data = phoneme_data_array.At(i)
result.append((phoneme_data.StartTime, phoneme_data.EndTime, phoneme_data.Phoneme))
print(result)
[(0.0, 0.005, 'sil'), (0.005, 0.125, 'k'), (0.125, 0.20500000000000002, 'o'), (0.20500000000000002, 0.25, 'N'), (0.25, 0.34500000000000003, 'n'), (0.34500000000000003, 0.4, 'i'), (0.4, 0.51, 'ch'), (0.51, 0.5700000000000001, 'i'), (0.5700000000000001, 0.635, 'w'), (0.635, 0.78, 'a'), (0.78, 0.905, 'sil')]
おまけ:sasawrapperを使って呼び出す
バージョンを確認する
import sasawrapper
print(sasawrapper.get_cevioai_version())
8.1.34.0
キャストの情報を確認する
print(sasawrapper.get_cast_info())
{'さとうささら': ['元気', '普通', '怒り', '哀しみ']}
再生する
sasawrapper.speak("こんにちは", volume=60, cast="さとうささら", emotion={"怒り":50,"哀しみ":50})
音素のデータ(モノフォンラベル)を取得する
print(sasawrapper.get_monophone_label("こんにちは", volume=60, cast="さとうささら", emotion={"怒り":50,"哀しみ":50}))
0 50000 sil
50000 1250000 k
1250000 2050000 o
2050000 2500000 N
2500000 3450000 n
3450000 4000000 i
4000000 5100000 ch
5100000 5700000 i
5700000 6350000 w
6350000 7800000 a
7800000 9050000 sil