🔊

CeVIO AIをpythonから呼ぶ時のメモ

2022/02/21に公開

はじめに

CeVIO AI comコンポーネントをPythonから呼び出す方法についてまとめました。
公式ドキュメントを参照してください。(この文章はほぼ焼き直しです。)
公式ドキュメント
動作環境はCeVIO AIがインストールされているWindowsです。筆者はCeVIO AIにて確認しました。(ドキュメントを見る限りCeVIOでも同様に動作する...と思います)

喋らせるだけ

以下のプログラムはCevio AIを用いてテキストを喋らせるのみの機能を持ちます。

import win32com.client
cevio = win32com.client.Dispatch("CeVIO.Talk.RemoteService2.ServiceControl2")
cevio.StartHost(False)
talker = win32com.client.Dispatch("CeVIO.Talk.RemoteService2.Talker2V40")
talker.Cast = "さとうささら"
state = talker.Speak("しゃべらせたいテキスト")
state.Wait()
cevio.CloseHost(0)

解説

import win32com.client

comコンポーネントを扱うためにwin32comモジュールが必要です。
あらかじめ

pip3 install pywin32

でインストールしておきましょう。


cevio = win32com.client.Dispatch("CeVIO.Talk.RemoteService2.ServiceControl2")
talker = win32com.client.Dispatch("CeVIO.Talk.RemoteService2.Talker2V40")

comオブジェクトをディスパッチします。
ServiceControl2はCeVIOアプリケーションの制御、Talker2はトーク機能の制御に用います。今後のそれぞれcevioとtalkerと呼びます。


cevio.StartHost(False)

起動の関数です。すでに起動している場合は何もしません。引数がFalseの場合起動が完了するまで処理が止まります。


talker.Cast = "さとうささら"

Castに値を代入することでキャスト(喋らせるキャラクター)を設定します。キャストの設定が無いとvolumeやspeakを設定した場合にCeVIO側でエラーになります(ポップアップが出ます)。


state = talker.Speak("しゃべらせたいテキスト")

Speakを呼ぶと喋りはじめます。

state.Wait()

Speakは喋り始めに処理を返します。WaitがないとPython側の処理が終わってしまい喋りません。 WaitはSpeakの内容が喋り終わるまでsleepし、スクリプト側の処理を止めます(time.sleep()と同等の効果ですがSpeakの時間分だけ止まるので喋る途中で処理が始まったり余分に処理を止めたりしなくなります)。


cevio.CloseHost(0)

cevioを終了します。

パラメータ

パラメータは以下の5種のパラメータを持ちます。0~100の範囲で設定でき、初期値は50です。パラメータはキャストを切り替えたときに初期化されます。

パラメータ 内容
talker.Volume 音量
talker.Speed 速度
talker.Tone 音の高さ
talker.ToneScale 抑揚
talker.Alpha 声質
talker.Cast = "さとうささら"
talker.ToneScale = 100
talker.Speed = 30
state = talker.Speak("ゆっくり抑揚つけて喋ります")
state.Wait()

感情

感情はtalker.Componentsのパラメータです。
componentsのパラメータ個数、種類はキャストで違います。

キャスト Components
さとうささら "普通", "元気", "怒り", "哀しみ"
小春六花 "嬉しい", "普通", "怒り", "哀しみ", "落ち着き"

Castが設定されている場合talker.componentsに格納されているのでこんな感じで取得できます

cast_components = [
    [talker.components.At(x).Name, talker.components.At(x).Value]
    for x in range(0, talker.components.Length)
]

0~100の範囲で設定でき、初期値は普通100それ以外0です。適切なComponentsでない場合エラーになります。

出力

OutputWaveToFileでwavファイルに出力できます。(例えばエフェクトをかけたいときはwavに出力してから取り込んで処理した方が良さそう?)

state = talker.OutputWaveToFile("喋らせたいテキスト", "output_path")

音素

リップシンク用に音素を取得することができます。StartTime、EndTime属性は累計時間での音素が読まれる開始時間と終了時間です。

phoneme = talker.GetPhonemes("音素を取得したいテキスト")
print([[phoneme.at(x).Phoneme,phoneme.at(x).StartTime,phoneme.at(x).EndTime] for x in range(0,phoneme.Length)])
print([phoneme.at(x).Phoneme for x in range(0,phoneme.Length)])
# 出力
# ['sil', 'o', 'N', 's', 'o', 'o', 'sh', 'U', 't', 'o', 'k', 'u', 'sh', 'I', 't', 'a', 'i', 't', 'e', 'k', 'I', 's', 'u', 't', 'o', 'sil']
# [['sil', 0.0, 0.005], ['o', 0.005, 0.165], ['N', 0.165, 0.22], ['s', 0.22, 0.315], ['o', 0.315, 0.385], ['o', 0.385, 0.51], ['sh', 0.51, 0.5650000000000001], ['U', 0.5650000000000001, 0.62], ['t', 0.62, 0.655], ['o', 0.655, 0.705], ['k', 0.705, 0.77], ['u', 0.77, 0.8250000000000001], ['sh', 0.8250000000000001, 0.87], ['I', 0.87, 0.91], ['t', 0.91, 0.9500000000000001], ['a', 0.9500000000000001, 1.025], ['i', 1.025, 1.095], ['t', 1.095, 1.185], ['e', 1.185, 1.24], ['k', 1.24, 1.32], ['I', 1.32, 1.385], ['s', 1.385, 1.425], ['u', 1.425, 1.47], ['t', 1.47, 1.55], ['o', 1.55, 1.675], ['sil', 1.675, 1.8]]

Discussion