Open Hiroshiba opened 2 years ago
一番の課題は、音声合成用の機械学習モデルの推論をどう実現するかだと思います。 とりあえずCoreMLに変換する方法がありそうなので検討中です。 ちょっと調べた感じ、onnxruntimeをスマホ用にビルドすることもできそうですが、前例がなかなか見つからず、前途多難な予感がしています。
こちらの件について、ONNX RuntimeをiOS向けにビルドするためのドキュメントがあったので共有しておきます。 CoreMLを利用する場合のビルドオプションに関する記述もあります。 https://onnxruntime.ai/docs/build/ios.html
また、CoreMLでサポートされているオペレーションについては以下のドキュメントに記載があります。 https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider
ありがとうございます! 同じページを見ていたのですが、ビルドしてみた報告ブログなどが見つからず、onnxruntimeのビルドがうまくいくかは修羅の道なのかもと思ってたりします。
オペレーション一覧はまだ見てませんでした。VOICEVOXの推論機構が全部表現できるかはパッとわからないですね。。足りてないのがあるかもしれない。。
でもOSSとして開発していくのであれば、おそらく暗号化済みのモデルファイルを共有する仕組みがない(?)CoreMLよりも、ローカルストレージにあるバイナリファイルからモデルをloadできるonnxruntimeのほうが筋が通っているように感じました。 onnxruntimeでやっていきたいですね!!
オペレーション一覧はまだ見てませんでした。VOICEVOXの推論機構が全部表現できるかはパッとわからないですね。。足りてないのがあるかもしれない。。
VOICEVOX/voicevox_core で公開されている各種onnxファイルとオペレーションが変わらないのであれば、そこから対応可能か確認できそうです。 ちょっと確認してみます。
おそらく暗号化済みのモデルファイルを共有する仕組みがない(?)
この点については、CoreMLでモデルを暗号化して提供することはできそうです。 https://developer.apple.com/documentation/coreml/encrypting_a_model_in_your_app https://qiita.com/kazuhiro4949/items/becb1850172d2e96281f
また、CoreMLの形式もアプリにバンドルすることは可能なので、アプリのリリースとともにモデルを配布することもできそうです。 https://developer.apple.com/documentation/coreml/integrating_a_core_ml_model_into_your_app?changes=latest_minor
CoreMLとONNXのパフォーマンスの違いはおそらくないと思います。 ですので、開発の方針として「他プラットフォームとの開発の差異を限りなく小さくすること」を優先するのであれば、ONNXモデルのまま利用できたほうがいいと思います。
yukarin_s.onnnx
、yukarin_sa.onnx
、decode.onnx
の3つのONNXモデルについて、CoreML実行プロバイダを利用できるかオペレーションを確認してきました。
以下の表が3つのONNXモデルで使っているオペレーションとその対応状況です。
かなり多くのオペレーションが対応していないので、CoreML実行プロバイダをONNXで使うのは難しそうです。
Operator | Supported? |
---|---|
Add | Yes |
Cast | Yes |
Concat | Yes |
ConcatFromSequence | No |
ConstantOfShape | No |
Conv | Yes |
ConvTranspose | No |
Cos | No |
Div | No |
Equal | No |
Expand | No |
Gather | No |
GRU | No |
LeakyRelu | No |
Loop | No |
MatMul | Yes |
Mul | No |
Pow | No |
Range | No |
ReduceMean | No |
Relu | Yes |
Reshape | Yes |
ScatterND | No |
Shape | No |
Sigmoid | Yes |
Sin | No |
Slice | No |
Softmax | No |
SplitToSequence | No |
Sqrt | No |
Sub | No |
Tanh | Yes |
Transpose | Yes |
Unsqueeze | No |
Where | No |
参考として、CoreMLに変換する場合のことを書いておきます。 ONNXからCoreMLに変換する機能は、Core ML Toolsというツールが提供していますが、次のバージョンでONNXからの変換が廃止されるようです。 PyTorchから直接変換する機能は提供されています。 https://developer.apple.com/jp/documentation/coreml/converting_trained_models_to_core_ml/ https://coremltools.readme.io/docs/onnx-conversion https://coremltools.readme.io/docs/pytorch-conversion
VOICEVOX/voicevox_core で公開されている各種onnxファイルとオペレーションが変わらないのであれば
こちら、少なくとも今は変わってないです!
対応表ありがとうございます!!!!とても参考になります!! そして思った以上に未対応が多いですね・・・ (cosとかsinとかどこで使ってるんだろうと思ったら、位置エンコーディングですね・・・) 僕もonnxruntimeでCoreMLを使うのは(かなり)難しいと思いました。
CoreMLのこともありがとうございます。 ローカルファイルから読む方法、あるんですね! であればこちらでも全然OSSとして開発できそうな印象を受けました。 まあCoreMLを使う感じ・・・かなぁ・・・
一応他にも、onnxruntimeをCoreML使わずCPUで利用するとか、WebViewを経由してWebGL版onnxruntimeを使うとかの方法が考えられます。 WebViewを経由する方法はそれはそれでしんどそうなので微妙な気持ちですが、 性能が良いらしいiPhoneであればCPU推論が意外と早いかもとちょっと思ってます。 CPU推論が実用に耐えうるかサクッと試したいかもですが、方法ありそうでしょうか👀
性能が良いらしいiPhoneであればCPU推論が意外と早いかもとちょっと思ってます。 CPU推論が実用に耐えうるかサクッと試したいかもですが、方法ありそうでしょうか👀
ONNX化の影響でCPU推論がかなり高速化されたので、もしかするとiPhoneやiPadでもCPUで十分快適に動作するかもしれません。
(とはいえ、現在サポートされているiPhoneやiPadの中には古いものもあるので、快適に利用できないものもありそうです)
現在、CocoaPods(iOSなど向けのライブラリ管理ツール)にonnxruntime(onnxruntime-mobile-c
)があります。
これを使えば、ONNXモデルが動作するか、そしてどれぐらいの処理速度かを確認することはできそうです。
おーーなるほどです!!割と簡単に確かめられるかもなんですね!!
wasmでどれくらい速度が出るのか調べるために、onnxruntime-web
を用いてonnxモデルで推論してみるコードを書いてみました。
https://github.com/Hiroshiba/vv_check_web/tree/6809d140e526eeaa109d64d3483329f63ee71a51
PC上でブラウザを開いてCPUを用いて推論したところ、5秒ほどの音声を生成するのに10秒ほどかかりました。 ネイティブで生成した場合はCPUでも1秒未満で完了するので、比較するとざっと10倍ほど遅そうです。さすがに使えなさそう。
また、onnxruntime-web
はWebGLモードもあるのですが、対応していないものがあって推論できませんでした。
ちなみにTypeError: int64 is not supported
というエラーでした。
WebGLを用いてどれくらい早くなるのかを確かめたい気持ちがあります。 onnxモデル作成コードはこちらにあります。
onnxruntime-webのthreadingを有効にした状態で検証してみました。 (thx @yamachu !!! ) https://github.com/Hiroshiba/vv_check_web/tree/9adb272b576e3c125432459ee32fe6119658ac0f 時間は大幅に縮まりましたが、Core i7-11700で5秒の音声を生成するのに3.4秒かかり、まだやっぱりちょっと遅いなという印象でした。
WebGLを使うルートも検証し始めました。 pytorchモデルの中の処理を変える必要がある、というのがわかってきました。 ご興味あればぜひ一緒に検証しましょう・・・!!!
NCNN, good one! Due to encryption, I would like to load the model from memory (not from a file), but I couldn't find in the documentation if it is possible. ;->
Check this tutorial, ncnn supports stripping readable information.
Great!!! I will try to convert it to NCNN model.
Great, BTW if you're converting from pytorch, it's recommended to give ncnn's pnnx tool a try. It can directly convert the pytorch module to ncnn without generating redundant OPs like in ONNX.
I tried to convert using ncnn
from onnx, but there seemed to be a lot of errors! ;->
Great, BTW if you're converting from pytorch, it's recommended to give ncnn's pnnx tool a try.
I didn't know there was such a thing!
It's a bit of effort as it requires torch script
, but I'd like to give it a try.
(It looks like I could get ncnn
params and bin, but it doesn't say if this will work on ncnn
...)
I see that pnnx was in a separate repository. I will try to use the exe distributed in the releases here.
Check the second line of its README:
Note: The current implementation is in https://github.com/Tencent/ncnn/tree/master/tools/pnnx
Apparently they merged pnnx into ncnn's repo.
Oh, I know that one!
I didn't find the executable binary in ncnn/tools/pnnx
, but I did find it in pnnx/pnnx
.
Thanks!
I tried pnnx
!
I found that execution stopped without any useful error messages.
The .pt
file can be found here. The hiho_decode_script_cpu.pt
is the target you want to onnx
convert.
The shape
I'm inputting looks right at [-1,1],[-1,45],[1]i64
.... It seems difficult.
https://github.com/Hiroshiba/yukarin_soso_connector/blob/b875c25a1f2e331c3647a26a692316a9e38d634e/yukarin_soso_connector/jit_forwarder/jit_forwarder.py#L255-L259
The error message is very useful. For the decoder,
terminate called after throwing an instance of 'c10::Error'
what(): forward() Expected a value of type 'List[Tensor]' for argument 'f0_list' but instead found type 'Tensor'.
It says that you specified the f0_list
in forward call to be List[Tensor]
but in pnnx you use [-1,1]
which means a 2d Tensor.
I think you may fix it by stacking the list of f0 into one Tensor
. Also, do the same thing to the phoneme list.
I also tried out the yukarin_s
and yukarin_sa
, got this error from both of them:
RuntimeError: index out of range in self
at the forward call of
self.speaker_embedder
I think this might could be fixed by specifying an example_input
in jit export, with a speaker id no larger than the embedding size.
I'd like to fix them myself but I don't have access to the original models so \_(ツ)_/
It's true! I ran the ubuntu version and got an error!!!
I'd like to fix them myself but I don't have access to the original models so _(ツ)_/
I see! The binary data of the models can be found here. https://github.com/Hiroshiba/vv_core_inference/releases/tag/0.0.1
The network structure of the model can be found here. https://github.com/Hiroshiba/yukarin_soso_connector
The conversion to torch script can be done with the following code.
python run_jit.py \
--yukarin_s_model_dir "model/yukarin_s" \
--yukarin_sa_model_dir "model/yukarin_sa" \
--yukarin_sosoa_model_dir "model/yukarin_sosoa" \
--hifigan_model_dir "model/hifigan" \
--texts "hello" \
--speaker_ids 0 1
I've changed List[Tensor]
to Tensor
! Working on this branch.
https://github.com/Hiroshiba/yukarin_soso_connector/tree/to-ncnn
I ran the above code to get a new .pt
file and the level0 optimization passed through 🎉.
And I got a wonderful error in level1 optimization. ;->
############# pass_level1
no attribute value
Segmentation fault
2022/06/24 I created the issue.
Sorry recently I didn't have time to check it out 🙇
creates the issue
I guess it's better this way, the maintainer of ncnn is actively involved in the community and would give solutions way better than mine. Nevertheless, I'll keep tracking this issue whenever I have the time.
decodeのncnn用のバイナリができました! https://github.com/Hiroshiba/vv_core_inference/releases/tag/ncnn
pnnx経由でncnn化する制約としてtorch.jit.trace
を使う必要があるのですが、その影響でyukarin_saの自己回帰が使えず、saのncnn化ができてません。
Have you tried it out? Actually I didn't see any issues with tracing an auto regressive model, see this tutorial.
Thanks for letting me know!
In this example, the autoregression code was written in GreedySearchDecoder
, where torch.jit.script
was used instead of trace
.
Sorry I wasn't around for a period, I went out to try other frameworks, ncnn
, tvm
, openvino
, TNN
, tract
... and ended up with Alibaba
's MNN
.
Like NCNN
is (kinda) from Tencent
, MNN
is also made by a Chinese Big Tech Alibaba
, the one running AliExpress
. It could either be an advantage or disadvantage, fortunately it has an English doc for non-Chinese speaker.
Anyway, I was able to convert the onnx model here to MNN
format with little tweaking. predict-duration
and predict-intonation
works out-of-box, while on decoder
I only need to change an axes attribute. It's just amazing in regard to NCNN which can't even run Unsqueeze
.
I haven't written any deployment or inference code yet since I don't have Android Studio
or XCode
on my laptop.
Edit: n.op_type -> n.name
That's great !!!!!!!!!!!!! I'm very interested whether it will work on a smart phone or not !!!!!
It works, if you go to the docs' about page you'll see
● iOS platform: static library size for armv7+arm64 platforms is about 5MB, size increase of linked executables is about 620KB, and metallib file is about 600KB.
● Android platform: core so size is about 400KB, OpenCL so is about 400KB, Vulkan so is about 400KB.
Originally it was made for mobile platforms, just like NCNN
.
ここ数日間でのDiscord会話や自分が試してわかったことからタスクリストを作ってみました。
( voicevox/voicevox_mobile#28 に移動)
新設計APIを使えばエンジンのJS実装部分を減らすことができそうだったので、それを使うようにタスクリストを更新しました。
スマホ版VOICEVOXを作りたいです。
目的
VOICEVOXのバリューであるユーザー数の増加と、ミッションである音声合成キャラの浸透ができそうだからです。
背景
そもそも動画を作る人というのは、高校生・大学生が多いと思います。時間がないと作れないからです。 今の高校生・大学生は基本的にスマホで物事を完結します。動画作成も例外ではないです(想像できませんが・・・) スマホで動く音声合成アプリは少なく、特に無料のものとなるとかなり数が少ないはずです。そこを攻めます。 この領域は特に企業が参入しづらいはずです。どう頑張っても儲からないからです。 ほとんど未開のこの領域に踏み込んでみたい、というのがこのプロジェクトの意図です。
ゴール
とりあえずTTSができるアプリのデモができればOKとしたいです。 リリースに向けての動き方とかは後々に考える見込みです。
内容
開発はOSSベースを想定しています。いろんな方の力をお借りしたいからです。 初手はiOSだけで良いと思います。日本語TTSを使うメインユーザーが日本のユーザーであり、かつデバイスの計算リソースが強めなためです。 UIフレームワークはReact Nativeを検討しています。VOICEVOXがjs製なのと、マルチプラットフォームに展開したいからです。
課題
一番の課題は、音声合成用の機械学習モデルの推論をどう実現するかだと思います。 とりあえずCoreMLに変換する方法がありそうなので検討中です。 ちょっと調べた感じ、onnxruntimeをスマホ用にビルドすることもできそうですが、前例がなかなか見つからず、前途多難な予感がしています。
2番めの課題は、openjtalkが必要な点です。 これはこちらのプロジェクトのC++ TTSライブラリができ次第着手するのが効率がいいのかなと思っています。
3番めの課題はUIです。がんばってデザインしていきます。 とりあえずアクセント調整だけできれば良いかなとも思っています。
その他
手が空き次第、僕が着手しようかなと思っていますが、他のタスクも多くなかなか手がつけられていません。 もしご興味があればコメント等頂ければと思います!