-
Notifications
You must be signed in to change notification settings - Fork 120
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
VVMのマニフェストの形式の再考 #581
Comments
これはそうだと思います。 (2023/10/15 1:23追記)
|
追加で:
|
|
これちょっと考えたんですけどどっちに倒そうか難しい感じです 😇 @y-chan さん的にSHAREVOXやユーザーニーズを考えたとき、使うあるいは使いそうだったりであれば是非足した方が良いかなと!! (ちなみにVOICEVOX的には「使うかも」って感じです。これくらいの淡い温度感で用意していいのかどうかがわからない。。) |
なるほどです!! (2023/10/15 1:25追記) |
コメント遅くなりました! VMM Manifestについてですが、SHAREVOXだとUUIDがライブラリを読み込むためのキーとして用いているので、あると嬉しい(VMM形式になるとファイル名を引数にとってモデルを読み込むことになるのでおそらくいらない)かなぁと思いました。 |
あ〜 たしかにnameはあると便利かも。賛成寄りです。 |
UUIDについてですが、今はnanoidというライブラリでIDとなる文字列を生み出してそれを |
一つ追加で思い付きました。TFLite使うならこういうのも要るかも?
|
@qryxip おお、なるほどです! |
ちょっと放送のやり取りで気づいたことをメモです。
また対象のVVMが読めなくなった時(onnxruntimeのバージョンが上がる・モデルのinput/outputが変わるなどの破壊的変更があった時)に上げるバージョン値を決めておく必要があるかもです。 メモ
2023/10/18 1:11追記 |
こちらのタスクをまとめ直しました。やることは次の3点かなと。
それ以外はマストじゃないかなという気持ちです(ずれていたら教えてください)。 2は多分僕でも簡単にできて、1も値を足すぐらいだったらできる気がするのですが、バリデーションコードを多言語ラッパーできる形で書いたり、3の |
一例use serde::{de, Deserialize, Deserializer};
#[derive(Deserialize)]
struct Manifest {
vvm_format_version: ManifestVersionV1,
// …
}
struct ManifestVersionV1;
impl<'de> Deserialize<'de> for ManifestVersionV1 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
return deserializer.deserialize_str(Visitor);
struct Visitor;
impl<'de> de::Visitor<'de> for Visitor {
type Value = ManifestVersionV1;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("a string")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
match v {
"1" => Ok(ManifestVersionV1),
v => Err(E::custom(format!("未知の`vvm_format_version`です: `{v}`"))),
}
}
}
}
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::Manifest;
#[rstest]
#[case("{\"vvm_format_version\":\"1\"}", Ok(()))]
#[case(
"{\"vvm_format_version\":\"2\"}",
Err("未知の`vvm_format_version`です: `2` at line 1 column 25")
)]
fn vvm_format_version(
#[case] input: &str,
#[case] expected: Result<(), &str>,
) -> anyhow::Result<()> {
let actual = serde_json::from_str::<Manifest>(input).map_err(|e| e.to_string());
let actual = actual.as_ref().map(|_| ()).map_err(std::ops::Deref::deref);
assert_eq!(expected, actual);
Ok(())
}
} Error:
| {
2 | "vvm_format_version": "2"
| ^ 未知の`vvm_format_version`です: `2` at line 2 column 27
| } エラー内容が多少雑でいいなら以下のものでもOK。 use serde::Deserialize;
#[derive(Deserialize)]
struct Manifest {
vvm_format_version: ManifestVersion,
// …
}
#[derive(Deserialize)]
enum ManifestVersion {
#[serde(rename = "1")]
V1,
} Error:
| {
2 | "vvm_format_version": "2"
| ^ unknown variant `2`, expected `1` at line 2 column 27
| } (あとこういうのは
まずRustについてですが、IDを文字列ではなく
nanoidでIDを発行しているところを削除して
C/Python/Javaについては、 |
@qryxip ありがとうございます!! |
@Hiroshiba さん、 @y-chan さん、 @qryxip の3名で行った2024-03-04のミーティングから:
|
ありがとうございます!!🙇 |
内容
今現在、VVMのmanifestはこのような形になっています。
もしもこの形式を考え直すなら、v0.15のリリースより前に行うのが最善です。
私がとりあえず思ったのは次の2つです。
manifest_version
はSemVerでなくてもよいかもしれません。edition的な概念が将来生まれるかもしれませんが、その時は別の概念にすればよいと思います。
style_id_to_model_inner_id
について、"model_inner_id"ではなく"inner_voice_id"とかでもよいかもしれません 。styleIdとsession.runに渡す数値が異なっているVVMでも音声合成できるようにする #551 (comment)
Pros 良くなる点
Cons 悪くなる点
実現方法
VOICEVOXのバージョン
N/A
OSの種類/ディストリ/バージョン
その他
The text was updated successfully, but these errors were encountered: