Skip to content

SpeakerInfoの画像や音声のデータをURLで返すようにする? #1208

@Hiroshiba

Description

@Hiroshiba

内容

エンジンのリソース情報を取得しようとすると結構な時間がかかることがわかっています。
VOICEVOXエディタは全キャラのリソース取得を起動時に行い、かつそれが必須な形であらゆるものがコーディングされていて、起動時間が10秒ほどかかる要因の1つとなっています。

時間がかかっているのは話者情報の取得API(/speaker_info/singer_info)です。
その中でもファイル取得やbase64エンコードに時間がかかっていることもわかっています(その他の関連リンク参照)。
これらの課題を一挙に解決できる方法の1つが、ファイル取得そのものを遅延させる方法です。

このissueでは画像や音声ファイルをbase64エンコードして/speaker_info等で返さず、何らかの方法でURLとして返すようにするかどうかを議論するissueです。

そもそもURL化するのが良いと思う理由

そっちのが一般的なことと、スケーラビリティが高いことと、エディタと親和性が高いためです。

  • そっちのが一般的
    • base64を返すのはあまり一般的じゃない 気がする
    • URLを返す他にも、IDを返してそのIDを元にリクエストしてもらう形式があるけど、後々のスケールのことも考えるとURLのがお得な気がする(↓参照)
  • スケーラビリティが高い
    • URLで返すなら、エンジンと関係ない場所にあるリソースを返すこともできる
    • 外部URLに立ち絵を置いておけば、立ち絵を後から自由に変更できるなど、柔軟な設計も可能にはなる
  • エディタと親和性が高い
    • そもそも画像や音声はblob化してsrcなどに指定してます
    • なのでURLだった場合はblob化しなければ自然と置き換えができる(はず)

実現方法

リソースファイルのURLは/static/speaker_infoAPIを作ってstaticでファイルを返せば良さそう。
ファイルパスはspeaker_info関数内で取ってきてるので、それをbase64エンコードするか、ファイルURLにするかの違いなだけなのでコード変更量は大きくなさそう。
エンジン自身のURLを取得するのはrequest.urlを取ってこればできるはず

互換性を考慮しつつファイルURLを返すように切り替える方法は、ワークアラウンド引数を追加する方法と、v2 APIを作る方法があると思います。

  • /speaker_info APIの引数に「URLで返すかどうか」情報をもたせるワークアラウンド
    • /speaker_info?workaround_resource_url=trueなどとすれば画像・音声をURLで返す
    • 型の変更がないのでエンジン・エディタともに変更が少なくて済む
    • engine_manifestは変えなくても良い・・・かも?
    • ワークアラウンドとしてるけど、正式な方法として提供しても良いかも(問題ないか結構検討したほうが良さそう)
  • /v2/speaker_info APIを作り、SpeakerInfoV2のようなモデルを返す
    • APIとモデルを作ること自体は簡単
    • APIが増えるのでengine_manifestを変える必要がある
    • エディタ側もマルチエンジンのこと考えるとそれなりの改修が必要
    • 他のv2 APIの拡張性も考え始めると検討事項が増えていく

個人的には議論の末引数指定を正式リリースできそうならそっちが良さそうに思いました。
できなそうなら、v2化するかワークアラウンドにするか諦めるかを考える感じかなと。

その他

関連リンク

Metadata

Metadata

Assignees

No one assigned

    Labels

    機能向上状態:実装実装をおこなっている状態状態:設計設計をおこなっている状態要議論実行する前に議論が必要そうなもの

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions