Open5

CeVIO連携用につくったもの

いぬいぬいぬいぬ

NodoAme

https://www.youtube.com/watch?v=lHshJSPfd-M

https://inuinu2022.github.io/NodoAme.Home/

  • 歌声合成ソフトCeVIOソングのボイスを”しゃべらせる”ためのソフト
  • しゃべり方は対応TTSソフトを”まね”する
    • CeVIOトーク、VOICEVOX、OpenJTalk、SHAREVOX
    • v0.4では書き出した音声ファイルとlabファイルがあればどんなソフトも対応
  • 詳しい経緯はnoteの記事
  • (まだ)OSSじゃないです

https://note.com/inuinu_/n/nb8c5c45295a0

技術的なところ

基本スペック

  • C#
    • 内部処理部分とUI処理部分が同じ言語でかけるのでラク!
    • エラーを握りつぶさないので、ユーザーに使ってもらうときにちゃんとエラーをつぶせる
    • 必要なライブラリがnugetで簡単に導入出来てラク(python版はビルドが必要…)
  • dotnet framework 4.8
    • CeVIOの外部連携インターフェイスがこれじゃないと動かない
  • WPF
  • Epoxy (MVVMライブラリ)
    • WPFを置き換える可能性を考えて

タイミング情報

  • タイミング情報ファイル(.labファイル)がCeVIOのソングとトークで共通なところから着想したもの
  • CeVIOトークの外部連携インターフェイスはタイミング情報が自動で取得できるのでこれで音素とタイミングを合わせてます
  • labファイルと外部連携インターフェイスでは時間の単位が違うので注意が必要です

OpenJTalk

  • CeVIOと同じくOpen JTalkが使われてるVOICEVOXも同じ仕組みで対応
    • タイミング情報が取れないソフト(COEIROINKなど)は対応できてません
  • CeVIOトークもVOICEVOXが無くても動作するようにOpen JTalkのdotnetラッパー SharpOpenJTalkを使ってます(便利)

音声分析

  • ピッチ(音程)情報の解析はWORLDのdotnetラッパー DotnetWorldを使ってます
  • DotnetWorldのwavファイル読み込みには制限があるみたいなので、NAudioで置き換えてます
  • 16bit/48kHzに内部的に変換
    • 演技指導に使うTTSソフトはソフトによって書きだしフォーマットがバラバラ、変更可能なので統一

NAudio

  • 定番音声処理ライブラリ
  • v0.4では色んなフォーマットの音声ファイルを16bit/48kHz wavに変換するのにつかってます

Wanakana-net

  • ローマ字→かな変換ライブラリWanaKana.jsの dotnet移植版 Wanakana-net
  • 音素→ひらがな変換につかってます
    • そのままではOpenJTalk/CeVIOの音素に対応できないので追加ルールを加えてます
いぬいぬいぬいぬ

Fluent CeVIO Wrapper

https://github.com/InuInu2022/FluentCeVIOWrapper

  • CeVIOトークの外部連携インターフェイスをつかいやすくしたラッパーライブラリ&サーバー
  • .NET Core系でも連携できるようになります
  • 新しめの書き方で書けます

ドキュメント

https://inuinu2022.github.io/FluentCeVIOWrapper/

特徴

  • CeVIO AI, CeVIO Creative Studio 7 対応
  • 共通ライブラリAPIはモダンな記法が可能
    • async / await
    • nullable
    • ValueTask<T>
    • C# 10
  • nuget経由での導入
    • No more GAC、nupkg形式での提供
    • 現在はローカルnugetの想定です
  • 共通ライブラリは .NET Standard 2.0対応
    • .NET Framework系環境・.NET Core系環境どちらからも利用可能
    • .NET 6 / 7での動作を確認済
  • 連携IPCサーバーは .NET Framework 4.8上で起動
    • 名前付きパイプでのIPCを行います

Problems of the CeVIO .NET interface

  1. .NET Framework 4.8
  2. Not supported async/await
  3. Different name API (CeVIO CS / CeVIO AI)
  4. Old style C# 7.3

構成

  • FluentCeVIOWrapper.Common
    • アプリに組み込む用のライブラリのプロジェクト
    • APIドキュメント
    • .NET Standard 2.0
  • FluentCeVIOWrapper.Server
    • CeVIO連携用サーバーのプロジェクト
    • これを子プロセスとかで動かして連携する想定
  • FluentCeVIOWrapper.Unity
    • Unity3Dで動かす用のプロジェクト
    • .unitypackage に必要なライブラリ一式とServerも一緒にいれてます
いぬいぬいぬいぬ

LibSasara

https://github.com/InuInu2022/LibSasara

音声合成ソフトウェアのCeVIOのプロジェクトファイル(.ccs)、トラックファイル(.ccst)、タイミングラベルファイル(.lab)を便利に扱うための.NETライブラリです。

特徴

  • The utility .NET class library for CeVIO files
  • Written in C# 10
  • .NET Standard 2.0
  • Supported file formats:
    • CeVIO project file (.ccs)
    • CeVIO track file (.ccst)
    • timing label file (.lab)

API documents

https://inuinu2022.github.io/LibSasara/

経緯

NodoAmeを実装したときにccsファイル(中身はXML)とかlabファイルの処理が大変だったのでライブラリ化したものです。NodoAmeから移植したりしています(v0.4からNodoAmeでも一部使用)。

ccs/ccstファイルの処理はLINQ to XMLの薄いラッパーになってます。必要な処理から加えているので、ccs/ccstの全要素にはまだ対応していません。対応してない処理はRaw~で直接元の XElement を取得して処理できるようになっています。

いぬいぬいぬいぬ

cevio-casts

https://github.com/InuInu2022/cevio-casts

JSON形式で定義されたCeVIOのキャスト(ボイスライブラリ)の定義データです。

特徴

  • CeVIOトークの外部連携インターフェイスを経由せずにキャスト(ボイスライブラリ)の名前やIDを取得できます
  • CeVIOトークボイスの感情パラメータの名前やIDも同様に静的に取得できます
  • CeVIOソングボイスの内部IDも静的に取得できます
  • キャスト名・感情名は日本語表記の他、一部英語表記の定義も含まれます

データ

https://github.com/InuInu2022/cevio-casts/blob/main/data/data.json

ccsファイルなどで各キャストを参照するには、idではなくcnameを使ってください。
cnameは実際のccsファイルで使われていますが、一部のボイスがトークボイス・ソングボイスの区別がありません(同じ文字列です)。そのため、ボイスをしっかり区別できるよう、そのようなボイスは cevio-casts オリジナルのidを定義しています。

JSONスキーマ

JSONスキーマを用意しています。

https://github.com/InuInu2022/cevio-casts/blob/main/model/schema.json

各言語むけにquicktypeをつかってヘルパーコードを出力できます。

quicktype ../data/data.json -o csharp/CevioCasts/Definitions.cs -l csharp --namespace CevioCasts --features complete -S ../model/schema.json

C#の例

C#向けには生成済みのヘルパーコードを用意しています。また、それを呼び出せるクラスライブラリプロジェクトがあります。

機械生成ではなく一部手動で修正しています。

using CevioCasts; //if you included classlib `CevioCasts`

var jsonString = File.ReadAllText("path/to/data.json");
var defs = Definitions.FromJson(jsonString);