-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
テキスト音声合成ライブラリの作成 #1
Comments
最初に要議論で、議論はこちらで行われています |
このプロジェクトの内容を「C++ TTSライブラリ化」に軌道修正し、本格的に稼働したいです。 C++ TTSライブラリができると嬉しいことはこんな感じです。
どこまでできるようにすべきかですが、まず初手は単純なTTS(文字→音声)ができるライブラリにするのが良いかなと思います。
その次が迷っているのですが、AquesTalk記法を使用可能にするか、中間表現(エンジンのQuery)を修正できるレベルを目指したいです。
モーフィング機能・辞書編集機能などは一旦保留にして上記2つを注力すれば良いのかなと思っています。 |
どのように配布するつもりでいますか? DLLでしょうか?
これは各言語ごとにラッパーライブラリができて初めて成立すると思うので、C++製ライブラリ+ラッパーライブラリの作成を行う必要がありそうです。 |
配布は今のVOICEVOX COREと同じで、動的ライブラリの形式を考えています。 言語ごとにラッパーライブラリが作れると嬉しいですね!! |
そういえば以前コメントしたこれを検討しても良いかもしれませんがどうしましょうかね。 |
SWIGも面白そうです。本格的に多言語展開する際にぜひ検討したいですね! struct情報に関しては・・・あ、今のエンジンみたくjsonでやり取りするというのはどうでしょう。 |
SWIGについて少し調べましたが、Swift/Objective-Cの出力がサポートされてないようなのでスマホターゲットを考慮するとiOSをどうするかSWIGを使うにしても考えなければならなそうです。
coreのエラーメッセージのやつですよね。あれはおっしゃってるとおり並列で取得したときにおかしくなるので絶対にやめたほうが良いと思います。 C APIでDLLを扱う場合は、ライブラリの構造体用に確保したメモリの管理操作はユーザー側で行うのが一般的ではあるので、これを避けたければwrapperを提供し、その内部でメモリの管理を行うアプローチが良いのではないでしょうか? SWIGだと定義したclass/structを指定するとそのコードを各言語用に出力できるようなので、そのあたりのwrapper処理コードを自動で出力してくれそうです。 |
SWIG、面白そうなのですが、ライセンスがGPLなので厳しそうでした。。。 一旦SWIGから離れて、最適解を探せればと思いました。 いま問題なのは、「可変長のメモリサイズが必要なパラメータを返すのはどうすればいいか」だという認識です。
でしょうか。 |
C APIに関して、以前AquesTalk10のNode.jsラッパーを書いたことがあり、AquesTalkがwavを生成する際はメモリアドレスとメモリサイズを返す、を行っていました。 他言語ラッパーを書く際に、Cの要素を他言語のものに変換する(上の例であれば
が良いかなと思いました。 |
@Hiroshiba ライセンスGPLってSWIG自体ですよね?SWIGはライブラリではなくコード生成なので大丈夫な気がします(要調査) ちょっと上手く伝わってなかったのですが、メモリ確保/開放はライブラリ側で関数用意するイメージですね。 この構造体実装を隠すテクニックは Opaqueポインタ とよばれてるので参考にしていただければ この中で特に実装を隠さなければならないモチベーションが高いのは下記ですね
DLLで配布した場合、動的にリンクされるので、例えばライブラリがバージョンアップして構造体の実装が変わった時にDLLのみ更新した場合危険な状態になります。 |
では一旦C APIで・・・! 構造体の件ですが、そもそもデータの型がコード( |
あまり一般的なアプローチではないのでユーザーからは違和感は持たれそうです。open jtalkのlabel formatが文字列で返されましたが、あれと似たような違和感があるかと
データの形とは何でしょう? |
そもそもstructは避けたいモチベーションがある感じです。 Python用にCythonでCラッパーを書いて思ったのですが、structやvectorなどのCの独自言語仕様があるとコンパイルが面倒なんですよね・・・ あとそういえば、返したい中間パラメータはAudioQueryなのですが、これは内部で可変長の値を持つのでそもそもstructは無理かもです。 |
ここで想定されているユーザーとはラッパー製作者の方でしょうか,それともライブラリの利用者の方でしょうか.
C言語で可変長の値を持つには配列(mallocで確保するメモリへのポインタ) を用います. reallocやfree等がデストラクタとして実装できないので面倒ですがC APIなら仕方ないところがあると思います. |
これはOpaqueポインタで隠蔽すれば発生しない問題ですよね。
これもOpaqueポインタで隠蔽すれば内部での実装はC++を使えるため、structフィールドとしてvectorを使用可能です。代わりにアクセサ用の関数を結構生やしてあげる必要はありますが |
実際のユーザーの方(ライブラリの利用者)を想定していました! ので、たしかに(ラッパー製作者も含めた)C++ユーザーから使いやすい形が良さそうに感じました! いろいろ議論していて、中間パラメータ(struct)周りは @qwerty2501 さんにおまかせできるとすごく嬉しいのかなと感じました!!!
の2つを @y-chan さんにお願いし、
を @qwerty2501 さんにお願いできればおそらく最高かと思ったのですが、どうでしょう・・・?👀 |
OKです。 |
私もこれに同意です。C++ライブラリを誰でも使えることを目指すよりも、ラッパーライブラリを作りやすくする方が汎用性が高いはずなので、structを使うのがきれいに収まるかなと思いました。
問題ないです。現状のエンジンを元に、structの定義等を軽く作ってしまうと思うので、それをqwertyさんに中間表現出力用にいじってもらう形になるかなぁと思いました。 |
実際にライブラリを開発していくにあたって恐らく外部からQueryの中身を操作したいという欲求が出てくるはずです. ABIを維持するTTSライブラリとABIが変わるSynthesisライブラリ等で分けることもできると思います. その時になってから考えても良いとは思いますが,外部に出しうる構造体についてはクラスを使わずに構造体で書いた方が良い思うのですがどうでしょうか? 追記ABIレベルで後方互換性を確保すべきかは分からないですが,アクセサ関数を提供する形はstructのlayoutに依存しないのでもしかしたら前方互換性が確保できるかも? ABIが変わってるのにロードできるのもそれはそれで怖そうですが・・・ |
@y-chan @qwerty2501 お二人ともありがとうございます!!
とりあえず外部公開用の関数実装と、やりとりの型定義をお願いしたいです! 全Query機能の実装は大変な一方、openjtalkが無くても音声合成できるだけの情報・機能があると嬉しそう・・・? class Mora:
text: str = Field(title="文字")
consonant: Optional[str] = Field(title="子音の音素")
consonant_length: Optional[float] = Field(title="子音の音長")
vowel: str = Field(title="母音の音素")
vowel_length: float = Field(title="母音の音長")
pitch: float = Field(title="音高")
class AccentPhrase:
moras: List[Mora] = Field(title="モーラのリスト")
accent: int = Field(title="アクセント箇所")
pause_mora: Optional[Mora] = Field(title="後ろに無音を付けるかどうか")
is_interrogative: bool = Field(default=False, title="疑問系かどうか")
class AudioQuery:
accent_phrases: List[AccentPhrase] = Field(title="アクセント句のリスト")
prePhonemeLength: float = Field(title="音声の前の無音時間")
postPhonemeLength: float = Field(title="音声の後の無音時間")
ちょっと量が多そうであれば、一旦pitch系とlength系は省いて、音素系とアクセントとpauseを実装とかもありかなと思いました! |
フィールド結構あるので、その分関数が多くなっちゃうんですが大丈夫ですかね? |
関数というのは外に出すAPIでしょうか 👀 |
外に出すAPIですね。 例としては以下のような感じですね。関数名とかは結構適当です。 typedef struct VoicevoxMora_ VoicevoxMora;
char* voicevox_mora_get_text(VoicevoxMora* voicevox_mora);
void voicevox_mora_set_text(VoicevoxMora* voicevox_mora,char* text);
uint64_t voicevox_mora_get_pitch(VoicevoxMora* voicevox_mora);
void voicevox_mora_set_pitch(VoicevoxMora* voicevox_mora,uint64_t pitch);
...
こういう感じでユーザーにアクセスさせたいフィールド毎に関数を公開する必要があるので、フィールド数に比例して関数を公開する必要があり、結構な数になるかと 参考までに例えばgtkはそういう感じの関数定義になっています |
YMM4にCoeFontが初期搭載されるニュースが発表されました。 VOICEVOXも同じこと(TTSシステムの同梱)が可能になる状態を、なるべく早く実現したいなと感じました。 身勝手なのですが、ロードマップ(というか優先順位)を引き直せればと思います🙇 高優先
オプション
更にオプション
僕たちの今の立ち位置から、僕たちのスキルを合わせれば、おそらく2週間でリリースまで到達できると思います。 コア開発に携わってくださったVOICEVOXチームの優秀なメンバー(敬称略 @Yosshi999 @Oyaki122 @y-chan @aoirint @PickledChair @qwerty2501 @Segu-g @shigobu )の皆様、もしよければお力をお借りしたいです。 |
(Discordに書きたかったのですが今不調っぽいのでこちらで。。) |
すごく昔に作ったLite版モデルで音声合成してみました。 ↓通常版 default.mp4↓Lite版 Lite.mp4onnxモデルのサイズは1/10程度に、生成速度は爆速になりますが、やっぱり品質は明確に落ちそうな印象です。 |
あまり状況を把握していないのですが、YMMってすでにvoicevox APIに対応してませんでしたっけ。 |
ファイル容量がざっと300MBくらい違ったりします。 |
@qwerty2501 |
@y-chan さんのTTSできるコードがマージされました! どんどん機能実装&使い勝手を良くしていきたいので、もしよければプルリクエストお待ちしています! |
オプション側のコード追加もじゃんじゃんやっていけると嬉しいですね・・・!
|
製品版をビルドしてみました。TTSが動きました! 残りやりたいことはまだまだありますが、一段落だと思います。 |
こちら、別言語で気軽に使えるようにしたり、いろんなサービスで気軽に利用できるようにしたりできると世界が変わってくると思うので、どんどん進めて行きたいかもです。 ここのリストのタスクを整理すると、これらがメインで残っていそうでした。
オプションとしてはこれらがありそうです。
もしよかったらぜひ・・・! |
Windowsで動くC++用のサンプルコード、Visual Studio(VSCodeで無い)のプロジェクトで良いなら、私作ります。 |
おお!ぜひお願いします!! |
今日 Mac・Linux 向けの小さなサンプルコードを書いてみていました(コマンドの引数で与えられたセリフから音声を生成し、 |
おー!!ありがとうございます!! |
@PickledChair さん、ありがとうございます!!! もしC++でのテストに興味があるorできる方がいらっしゃったら、こちらをお願いできると将来的にリファクタリングしやすかったりで安心かもしれません。
(詳しくないですが、Google Testというのが良さそうに感じています。) |
ちょうどユニットテストフレームワーク導入PR作ろうと思って調べてたんですが、Catch2もありかなとは感じました。 |
おお!!! PR、お待ちしています!! Catch2、たしかにdata driven testをしやすそうに見えました。 日本語資料の有無でいうと、google testは調べると(なぜか)OpenCVが語ってくれていて頼りになりそうでした。 (google testとcatch2どっちも調べてたんですが、どちらもマクロまみれでテストがめちゃくちゃ書きづらそうだなと感じました・・・・・・・。これVSCodeで補完とか効くんですかね。。。 |
あほんとですね。OpenCVに何故か日本語ドキュメントがある。ただ公式ではない以上ドキュメントがいつまでメンテされるかわからないのであまり当てにはしないほうがよいかなとは思いました。すでに古い可能性もありますし。
その2つ以外も含め主要なC++のUnit test frameworkは軒並みマクロに依存しまくってます。まあそういうものだと思って諦めてください。 google testの利点を上げるとすれば、メンテが打ち切られる可能性が限りなく0に近いことでしょうか。ただところどころレガシーな部分は目立つのでそのあたりを天秤にかけてどうかといったところですかね。 |
こちらでC APIの改善に関して議論されています。 |
こちら、コアの言語がC++ではなくRustに変わったため、タイトルを変更いたしました。 |
こちらですが、一旦closeしてしまって、個別にIssueを立てる方針にしたいと思います。 というわけで、一旦おつかれさまでした!!! |
テキスト音声合成ができる薄いライブラリを作る計画です。
今エンジンとコアに機能が分離しているので、これらをうまいことまとめる必要があります。
The text was updated successfully, but these errors were encountered: