Skip to content
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

APIに読点等の無音時間を調整するパラメータを追加 #1289

Closed
X-20A opened this issue May 20, 2024 · 15 comments
Closed

APIに読点等の無音時間を調整するパラメータを追加 #1289

X-20A opened this issue May 20, 2024 · 15 comments
Labels
機能向上 状態:実装 実装をおこなっている状態

Comments

@X-20A
Copy link
Contributor

X-20A commented May 20, 2024

内容

現状エディタにおいては「、」や「 「」 」等の無音時間は一つ々々手動で調整しなければなりません。
これを一括で調整できるようにするため、APIパラメータの追加を提案します。

Pros 良くなる点

エディタにおける編集効率が上がる

実現方法

現在実装されている"speedScale","pitchScale",・・・(以降まとめてquery)にpauseLength(仮称)を追加します
他のqueryがどのように処理されているか把握していませんが、
0 ~ 2.0 のように倍率で設定し、pauseMora > vowelLengthに乗算という形になるかと思います

その他

元々この提案はエディタ側で議論されていました#1698,#2083
しかし既存の実装がmorasにおいて、マニュアル値以外はエンジンに委任していることが分かったので
こちらにissueを作成しました
pauseLength、及びpauseMoraについて例外的にエディタ側で調整するのは可能であるにしても設計上の
懸念があります

@tarepan tarepan added 要議論 実行する前に議論が必要そうなもの 状態:必要性議論 必要性を議論している状態 labels May 20, 2024
@stIprurIJu
Copy link

『、』『。』『…』ぐらいが指定できれば、めちゃめちゃ楽になるんですけどね(汗)

@X-20A
Copy link
Contributor Author

X-20A commented May 20, 2024

文字ごとの設定はできると便利だろうと思います
ただその場合、エンジンに要請する内容が違うものになると思います
なので、
・queryによる一括指定か、文字ごとの指定か → #1698
・文字ごとに指定する為のエンジン側の処理の調整 → VOICEVOX engineで新たなissue
で議論することを提案します

@X-20A
Copy link
Contributor Author

X-20A commented May 21, 2024

着手しています

@stIprurIJu
Copy link

ありがとう御座います。

@Hiroshiba
Copy link
Member

issue作成ありがとうございます!
待望された機能なのでぜひ実装を進められるととても嬉しいです。

使用に関して相談です!
ポーズの長さは倍率指定と長さそのまま指定(絶対値指定)、どちらがユーザーに求められていそうでしょうか?

ユーザーがイメージしやすいのは絶対値指定だと思います。
ただニーズがあるなら倍率指定も別で実装しても良いのかもと、個人的には感じています。

まずはイメージしやすい絶対値指定を作り、倍率指定は今後検討する、とかどうでしょうか?

ちなみにもし倍率にするなら、他のパラメータと名前を合わせてpauseLengthScaleにすると直感的かもですね!
個人的にはそのままの名前にして絶対値指定の形が使いやすくて良いかなと思ってます…!

@Hiroshiba
Copy link
Member

Hiroshiba commented May 21, 2024

ちなみにpause文字ごとに長さ変更はopenjtalkライブラリに手を加えることから始まるため、工程が10倍くらいになってとんでもなく大変なので、いったん考えなくて良い(というより考えるのが難しい)かなと思います!

@X-20A
Copy link
Contributor Author

X-20A commented May 21, 2024

ひとくちに無音時間といっても語句、或いは文脈?によって微妙な差があるようなのでそれを活かした方がいいかなという意図でした
添付画像参照: 括弧、読点、感嘆符によってpause_mora > vowel_lengthが異なる

キャプチャ_2024_05_21_23_27_21_703

エディタで確認してみましたが私の感覚ではどちらが良いとも判断できないですね
デファルト
絶対値調整(0.1)
倍率調整(約1 / 2)

vv_test.mp4

あと絶対値調整の実装についてですが、
pause_mora調整についてspeed_scaleによる調整の前後どちらでするかが問題になります
単位は秒で指定するとして、話速の影響を受けることを期待する場合と、飽くまで設定した絶対値そのままが反映されることを期待する場合とがあると思います
つまり、
・話速の影響を受ける
・話速の影響を受けない
・選択式にする
と3つ(倍率調整と併せると4つ)の実装方式が考えられます
どれが直感に即すかは正直分からないので意見を頂ければと思います

@stIprurIJu
Copy link

自分の使い方では、括弧も句読点も感嘆符も、揃っていて欲しいですね~

話速は一度設定したら動かさないので、秒数の指定で自分は大丈夫です。

@Hiroshiba
Copy link
Member

@X-20A どちらも有用そうですね!!

たぶん解説系にはテンポを決められる絶対値指定が、日常会話系には自然になる倍率指定が良さそうに感じました。
とはいえこの機能は片方あればもう片方はほぼなくても大丈夫なはずなので、少なくともまずは片方だけ実装で良さそうかなと。

・・・両方の実装をお願いしてもよいでしょうか!
pauseLengthが指定されていたらpauseLengthが採用され、そうじゃなければpauseLengthScale倍されるイメージでいます。

エディタ側は余力があればどっちも実装(設定で切り替えられると良さそう)、難しければ倍率の方だけ実装をお願いできるととても助かります!
自然なのは倍率の方な気がするのでこちら推しが良さそう。デフォルトで倍率指定UIが表示されているイメージでいます。
絶対値指定の方はたぶん「pauseの長さを固定するかどうか」チェックボックスがパラメータ欄に必要そうで、他のUIと違うため、ちょっと実装難度が高いかもしれません。

@tarepan tarepan added 状態:実装 実装をおこなっている状態 and removed 要議論 実行する前に議論が必要そうなもの 状態:必要性議論 必要性を議論している状態 labels May 25, 2024
@X-20A
Copy link
Contributor Author

X-20A commented May 25, 2024

すっかり忘れてたのですが今の実装だと
「一括指定してから任意の部分をマニュアルで指定」ということが出来ないですね
エディタ側でpause_mora部に新しくkey:manualの値を設定してエンジン側で一括調整後にさらにマニュアル値を設定、とすればなんとかなると思いますが

@Hiroshiba
Copy link
Member

Hiroshiba commented May 25, 2024

あーーーーーーーーーーーーーーー本当ですね・・・。。。。。。

とりあえずエンジン側は今の実装(絶対値指定と相対値指定の療法がある)で良さそう!!
読み上げAPIとして使ってる方とかには便利なはず。

エディタ側は・・・確かにmanual用の値を追加すれば実装は可能かもですが、まあそもそも固定にしたなら固定値以外の値を与えられなくてもそこまで問題ない気もしました。
あと相対値モードなら普通にいじれる&デフォルトは相対値モードにする予定なので、問題ないことが多そうに思います。

仮に固定値を無視した値を設定可能にするにしても、APIはそのままにできると思います。(APIはなるべくシンプルにしておきたい。。)
代わりに、UIで設定した「pauseの長さ絶対値」を、全pauseMora.lengthに代入していく感じにすれば・・・!

@X-20A
Copy link
Contributor Author

X-20A commented May 26, 2024

ちょっとイメージが掴めないのですが
エディタでマニュアル値を設定してもエンジンで上書きされますよね?
私の考えだと

pauseMora: {
    "text": "、",
    "vowel": "pau",
    "vowelLength": 0.374168336391449,
    "pitch": 0
}

pauseMora: {
    "text": "、",
    "vowel": "pau",
    "vowelLength": 0.374168336391449,
    "pitch": 0,
    "isManual": true
}

のようにすれば、APIに新たなパラメータを追加しなくてもエンジンで

def apply_pause_length(moras: list[Mora], query: AudioQuery) -> list[Mora]:
    """モーラ系列へ音声合成用のクエリがもつ無音時間(絶対値)(`pauseLength`)を適用する"""
    for mora in moras:
        if mora.text == "、"  and not getattr(mora, "isManual", False):
            mora.vowel_length = query.pauseLength
    return moras

と処理できるはずです

@Hiroshiba
Copy link
Member

Hiroshiba commented May 26, 2024

@X-20A
あっすみません、言葉足らずでした!

おっしゃるとおり、isManualをデータ構造に加えれば実現できるとは思います。
でもたぶん正確にはisManualではなくisManualVowelLengthになる気がします。

というのも、「パラメータを固定する」という概念はpauseのlengthだけでなく、全体の音高に対するpitch、イントネーションに対するpitch、全体の話速に対するconsonantLengthやvowelLengthとかにも現れうるんですよね・・・。
将来的に「音量」パラメータとかももし追加された場合はその分増えてしまう。
パラメーター一部固定にエンジンを巻き込んでしまうとAPIが複雑化しそうなので、なるべくシンプルに進めたいなぁという感じです。


といってもエディタ側でなんともならないのであれば、エンジン側を変えるべきだと思います!
今回の場合はエディタ側でなんとかなると思ってます。

例えばpauの長さを固定している状態で一部だけpauの長さを変えたいときは、pauseLength=Noneにすれば良いと考えてました。
例えばこうかなと・・・!

  • ユーザー)pauLength=1にする
  • エディタ)pauLength=1をセット
  • ユーザー)1つだけpauの長さを0.5にする
  • エディタ)0.5にしたpau以外のpauの長さを全部1にセットし、pauLength=Noneとする
  • ユーザー)再生ボタンを押す
  • エンジン)pauLength=None、pauにそれぞれ長さが入ってる状態で音声合成

@stIprurIJu
Copy link

進捗はどうでしょうか?

@Hiroshiba
Copy link
Member

エンジン側は完成しました!

closeしていなかったのでcloseします!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
機能向上 状態:実装 実装をおこなっている状態
Projects
None yet
Development

No branches or pull requests

4 participants