VOICEVOX/voicevox_core

「不正な(Frame)AudioQuery」を定義し、明示的に拒否する

Opened this issue · 1 comments

内容

現在VOICEVOX COREにこのようなAudioQueryを与えると、内部の添字アクセスのとこなどでRustのパニックが起きます。
(VOICEVOX ENGINEも同様で、例外がそのまま500 Internal Server Errorになるという記憶)

  • consonantconsonant_lengthの有無が一致していない
  • accent位置がモーラ数を超過している
  • 音素が不正 (これについては、Phoneme型を導入すればいいはずではある)
  • 浮動小数点数が負やNaN (これも同様にnewtypeにすればよいはずだが、利便性を損いそう)
  • 他にも色々あるかも

これらの不正な状態を早い段階で検知し、InvalidAudioQueryErrorのようなエラーをユーザーに返します。

ソング機能 (#1073)におけるFrameAudioQueryおよびScoreと合わせて考えたいです。

Pros 良くなる点

  • UXの向上。ユーザーがAudioQueryを編集したときに体験を損ねずにすむ。

Cons 悪くなる点

実現方法

VOICEVOX COREの内部で、次のうちどちらかを行う。

  1. AudioQueryなどにfn validate(&self) -> anyhow::Result<()>を生やし、その"validate"を信頼する。
  2. NormalizedAudioQueryのようなものを考える。

RustのようなParse, don't validateの文化だと、パブリックにValidatedAudioQueryみたいなのを用意した方がよいかもしれない。

VOICEVOXのバージョン

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux
  • Android
  • iOS

その他

#762 の実装がまだなので、output_sampling_rateが24kHzの倍数じゃないのもまずそう。

良さそうに思いました!!
目的を整理すると「わかりやすいエラーを返してたげたい」とかになりそう。