【トーク】外部APIの利用方法

タグ:トーク



概要



公式ドキュメント



できること

SAPI5

  • Microsoftが策定した読み上げ用APIにCeVIOは対応しています
  • Windows10の「ナレーター」機能のように何もしなくても対応しているものがあります
  • 汎用のAPIのため、CeVIOの細かな調声パラメータには対応していません

  • 制限
    • Win10の特定Ver.より制限が増え、CeVIOと連携できないツールが増えました(Word/Excel/Acrobat Reader/Chromeなど)
    • CS6以前は32bitアプリから、CS7/AI以降は64bitアプリからでないと連携できません


COMコンポーネント


  • いろいろな言語から呼び出すことができます
    • .NET以外で細かいことをやりたい場合はコレ一択です
    • .NETからも呼ぶことはできます

  • 利用可能な言語
    • C++, python, C#

.NET


  • .NETアプリケーションから利用できます
    • ※ちなみにCeVIO CS/AIのエディタも.NETアプリケーションです

  • 利用可能な言語
    • C#, F#, VB.NET, PowerShell Script

CeVIO連携ツールの作り方


はじめに考えること


  • 他のトークソフトも対象のツールを作りたい場合
  • UIはいる?いらない?
    • CUIツールはサクッと作れますが、普通のCeVIOユーザーには使ってもらいにくいです
    • UIを作るとなると色々環境の選定など大変です
  • ツールの実行に必要な環境はある?
    • スクリプトの場合、作るのは簡単ですがユーザーの手元に実行環境が無いと動きません

制限・仕様


  • 合成の文字数制限
    • エディタ上と同じく、同時に合成できる文字数には制限があります
    • 小説の読み上げ、などの長文読み上げを行う場合は適宜分割処理と逐次合成処理が必要になります
  • 同時利用アプリ数の制限
    • 外部インターフェイスを利用できるのは同時に1アプリまでです
      • 読み上げさせながら同時に動画編集、はできないことになります
    • CSとAIは別アプリのため、外部APIも同時利用可能です
  • 辞書登録された単語の読み・アクセントは反映されます
    • プリセットは取得するAPIがありません(デフォルトのプリセットとして反映させることはできます)
  • API利用次、企業等による商用利用は商用ライセンスが必要です

各言語からの利用

C#

  • 最も情報が多く作りやすいでしょう
  • .NETアセンブリとしてVSやVSCodeでインテリセンスを効かせながら組むことができます

  • 注意点:.NET Framework 4.8である必要があります
    • .NET Coreや.NET 5以降では動作しません
    • ※内部的な通信にDeprecatedなAPI(.NET Remoting)を利用しているため
    • 公式ドキュメントではdll参照にGACが指定されていますが、.NET Core系ではこれも廃止されているため将来的な問題の可能性があります
    • なお、dotnet cliを利用したりC#8.0以降を使いながらFramework向けにビルドすることは可能です

CeVIO CSとAIを透過的に扱いたい
  • dllが異なりますが、最終的なメソッド名やプロパティ名はほぼ同じため、ラッピングできます
  • System.Reflection.Assembly と Activator.CreateInstance() でdynamic型で呼び出す方法が使えます
  • インテリセンスは効かなくなりますが、APIの数は多くないのでそれほど問題になりません

var assembly = Assembly.LoadFrom("path/to/cevio/dll");
 
var service = assembly.GetType("CeVIO.Talk.RemoteService2.ServiceControl2");  //CSは "CeVIO.Talk.RemoteService.ServiceControl"
MethodInfo startHost = service.GetMethod("StartHost");
var result = startHost.Invoke(null, new object[] { false });
 
var talker = Activator.CreateInstance(
  assembly.GetType("CeVIO.Talk.RemoteService2.Talker2"),  //CSは "CeVIO.Talk.RemoteService.Talker"
  new object[] { "さとうささら" }
);
 
talker.Volume = 100;
talker.Components.ByName("元気").Value = 100;
var result = talker.Speak("こんにちは、さとうささらです。");
result.Wait();
 

最新の.NET 5以降で動かしたい
  • 制限がありますが、COM経由で呼び出す方法があります
    • .NET 6 RC版では、一部のAPI呼び出しがエラーになります(キャストの感情パラメータマップ関連API)
  • .NETアセンブリと微妙にAPIが異なる(主に型)ため注意が必要です(LINQなどが使えない場合あり)
  • インテリセンスは効かなくなります

var service = Activator.CreateInstance(Type.GetTypeFromProgID("CeVIO.Talk.RemoteService2.ServiceControl2"));
service.StartHost(false);
 
var talker = Activator.CreateInstance(Type.GetTypeFromProgID("CeVIO.Talk.RemoteService2.Talker2"));
talker.Cast = "さとうささら";
 
var result = talker.Speak("こんにちは、さとうささらです。");
result.Wait();
 
//...
 
//開放忘れるとメモリリーク
System.Runtime.InteropServices.Marshal.ReleaseComObject(talker);
System.Runtime.InteropServices.Marshal.ReleaseComObject(service);
 

SAPI5でCeVIOが呼び出せない

.NET Core/.NET 5以降

WinRTの Windows.Media.SpeechSynthesis 経由だと選択肢から取得できません。
System.Speech.Synthesis 経由でリストアップできます(.NET Core系はnugetから取得)。
(※SAPI対応アプリでもCeVIOをリストアップできないアプリ(Chrome等)はこれが原因かもしれません)。

※.NET6 SDK / Win10.19043.1415 で確認。

//取得可能
var synth = new System.Speech.Synthesis.SpeechSynthesizer();
foreach (var voice in synth.GetInstalledVoices())
{
	var vi = voice.VoiceInfo;
	Console.WriteLine($"{vi.Culture}: {vi.Description}");
}
 
//取得不可
var synth2 = Windows.Media.SpeechSynthesis.SpeechSynthesizer.AllVoices;
foreach (var voice in synth2)
{
	Console.WriteLine($"{voice.Language}: {voice.Description}");
}
 

Go




python


  • ※TODO*



PowerShell


  • .NET APIとCOMコンポーネントインターフェイスの両方が使用できます
    • ※TODO*

  • 制限
    • COM経由でエディタのポーズが反映されない


JavaScript


Node.js

  • Edge-jsという.NET APIをブリッジするライブラリがありますが、dll参照が上手く行きません
    • メンテされていないオリジナル版のedgeではなく、メンテされているedge-jsを利用して下さい(サンプルソースは古いままなので注意)
    • dynamic型を用いた動的読み込みなら出来る可能性があります(未確認)

  • say.jsというnpmライブラリで利用できるようにしたpatchがあります

※TODO*

WSH

  • 公式のVBScriptサンプルと同様に、Windows Script HostでJavaScript(JScript)が利用できます。
  • WSH自体がレガシーでモダンな文法が使えないのがネックです。
  • shift-jisにしないと日本語部分でエラーになります。

var service = WSH.CreateObject("CeVIO.Talk.RemoteService.ServiceControl");
var hostState = service.StartHost(false);
 
var talker = WSH.CreateObject("CeVIO.Talk.RemoteService.Talker");
var talker40 = WSH.CreateObject("CeVIO.Talk.RemoteService.TalkerV40");
 
talker.Cast = "さとうささら";
var state = talker.Speak("さとうささらです");
state.Wait;
 



APIの解説


  • ※TODO*

キャスト・パラメータ一覧


  • APIから呼び出せるキャスト名や感情パラメータ名(日本語環境)
    • CeVIO AIの「OИE」はキャスト名3パターンあり
      • ver.8.1.16以前:「ONE」
      • ver.8.1.21:「OИE」
      • ver.8.1.24以降はどちらもOK
    • CeVIO AI ver.8.1.8以降、キャスト名は日英どちらもOK
      • 「弦巻マキ (英)」と「Tsurumaki Maki (EN)」
    • CeVIO AI ver.8.1.8より前はキャスト名はOS言語依存

CeVIO CS

 CeVIO CS 

製品 キャスト名 感情パラメータ名 備考
CeVIO CS さとうささら 元気 普通 怒り 哀しみ
すずきつづみ クール 照れ
タカハシ 元気 普通 へこみ
IA High Mid MidLow Low
ONE High Mid MidLow Low


CeVIO AI

 CeVIO AI 

製品 キャスト名 感情パラメータ名 備考
CeVIO AI さとうささら 元気 普通 怒り 哀しみ
小春六花 嬉しい 普通 怒り 哀しみ 落ち着き
IA Bright Normal Strong Dark
OИE Bright Normal Strong Dark ※表記はver.8.1.16以前は「ONE」、ver.8.1.24以降はどちらもOK
弦巻マキ (日) 元気 怒り 落ち着き 哀しみ 穏やか ※スペース、カッコは半角
弦巻マキ (英) 元気 怒り 落ち着き 哀しみ 穏やか ※日本語環境
フィーちゃん 嬉しい 普通 怒り 哀しみ 落ち着き
ロサ (ROSA) 嬉しい 普通 怒り 哀しみ ※スペース、カッコは半角




参考



タグ:

トーク
+ タグ編集
  • タグ:
  • トーク

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2023年05月08日 11:22