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

ソング:frameAudioQueryの音高をオクターブ(あるいはキー)変更できるようにしたい #1838

Closed
Hiroshiba opened this issue Feb 10, 2024 · 14 comments

Comments

@Hiroshiba
Copy link
Member

内容

VOICEVOXのハミングの仕組みは、最初歌が歌えるスタイルで歌い方(音高やパワーなど)を生成し、成果物をハミングに入力して音を生成しています。

歌が歌えるキャラクターの得意音域と、ハミングのキャラクターの得意音域が違う場合、音声合成がかなりうまくいかないことが分かりました。
特に現状歌が歌えるキャラクターは波音リツのみで、音域的にどうしても男性領域をカバーできないので、男性ハミングがうまくいかない状況です。

解決策は色々あるのですが、中でもエディタの変更だけである程度迂回できる方法があります。
歌い方を生成した後、生成された音高のオクターブやキーを変更してあげることです。

このissueではオクターブや変更ができるようになったり、あるいは問題がそもそも解決したら完了だと思います。
現状男性キャラクターをリリースできない状況なので、優先度が最大になっています。
やり方を詳しく実現方法のところに書いているので、もし誰か取り組めたら是非取り組んでみてほしいです!

Pros 良くなる点

カバーできない音域をカバーできる。
得意音域が若干違っている時も調整ができるようになる。

Cons 悪くなる点

UI が1つ増える。

実現方法

frameAudioQueryはこの辺りで取得しています。

"singFrameAudioQuerySingFrameAudioQueryPost"

中に.f0パラメーターがあり、その中に周波数がフレームレベルで入っています。
f0(ちなみに基本周波数です)を変調してあげればオクターブやキーシフトができます。

変調する時の計算式はf0 = f0 * 2 ** (key / 12)です。**は累乗です。
例えば1オクターブ下げる場合はkey=-12で、f0 = f0 * 2 ** (-12 / 12) = f0 / 2です。
ここでいうkeyはカラオケとかでよく見るキーのことです。

あとはどれぐらいシフトするかの量を UI で選べるようにし、↑の計算式に従って計算すれば終わりだと思います。
UIは例えば「オクターブ2つ下・1つ下・変更しない・1つ上・2つ上」みたいな選択リストを作って選べるようにすれば完了かなと!

その他

実際には関係ないのですが、この機能をどう案内しようか結構迷ってます。
ピッチシフトだと出力音量の周波数がシフトされるイメージですが、実際は入力ピッチなので・・・。
得意音域のシフト、とか・・・?

@sigprogramming
Copy link
Contributor

ひとまず処理だけ実装してみます…!

@romot-co
Copy link
Contributor

romot-co commented Feb 12, 2024

ざっくりデザイン案(シンガーの場合のみ):

https://xd.adobe.com/view/e2dd1809-cb0e-4f09-8cb9-6a1434ffb249-b78e/

すでにDiscordでみなさまに案出されておりまして、
それに従う形でよさそうに思っております!(すごい)

1つだけ追加するとしたら「シンガー」の「キーシフト?」「歌い方?」に見える形がいいかも

一例としては:
キーシフト(1部)

@Hiroshiba
Copy link
Member Author

「歌い方」なるほどです!!良さそう感。

これ本当はハミングキャラクターと、歌い方を生成するキャラクターが別なんですよね。
今は歌い方生成できるキャラクターが1人だけですが。
なので将来は使い方生成用キャラクター表示の隣に「歌い方」欄を作ることになるかもです。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Feb 12, 2024

↓にも書いたのですが、やっぱり UX で迷っています 😇
#1842 (review)

現状「f0」がユーザーが入力したスコア、キーシフトしたスコア、生成したf0、その後 キーシフトしたf0、実際になっている音のf0と数多あって、認識がもしかしたらずれてるかもと思ったのでちょっと詳しく紹介する動画を撮ってみました!!
参考になれば。。

hoge.mp4

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Feb 12, 2024

あ、個人的に1番良いのは、各スタイルの得意音域を予め持っておき、歌い方キャラとハミングキャラの音域のずれを勝手に補正する形だと思ってます。
うまくいけば手動で調整する必要はなくせるかなぁと。ただ各キャラの音域を調べてデータ構造にするのが大変(コアから調整になる…)なのと、上手くいくかわからないので、一旦手動調整可能にする形が丸いのかなと感じてます!

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Feb 13, 2024

#1842 でトランスポーズ機能が実装されました!
キー変更した分だけ出力の音の高さが変わる機能です。例えば+2の場合、ノートがC4にあるとD4の高さになります。

今のところ自分の中で考えてる UX をまとめてみます。

  • 一番嬉しいのは初心者も慣れてる人もわかる UI
  • 「トランスポーズ」は慣れてる方はわかるけど、初心者の方は分からない
    • でも分からないということはわかるので、使い方に書けば良い
    • あるいはマウスホバーした時の案内(設定ダイアログのヘルプとかで使ってる)
  • たぶん一番多くの人が嬉しいのは自動補正
    • キャラクターのスタイルそれぞれの得意音域をデータ化していれば可能なはず
    • (結構時間かかる)
  • 自動補正があってもまだ音域調整をしたい人はいそう
    • 高めのところはパワフルに歌うことが多いけど、どこを高めと感じるかは人による
    • そういう人のために何かしら手動調整できる機能もあると良さそう
    • それはもう初心者向けではないので用語は「トランスポーズ」で良さそう
      • ちょっと語句が長いから UI として収まりづらい というのはあるかも
  • 結論
    • 得意音域をデータ化して自動補正
    • 手動補正もあると良さそう、その名称は「トランスポーズ」でOKなはず

@sigprogramming
Copy link
Contributor

sigprogramming commented Feb 14, 2024

#1842 でピッチをトランスポーズする機能を実装しましたが、表示が「トランスポーズ」だけだと、(ピッチの推論時に入力する)ノートはトランスポーズされない(単純なトランスポーズではない)ことにユーザーは気づけないかもと思いました…!

一応表示を「ピッチのトランスポーズ」にすることで、ノートではなくピッチのトランスポーズであることはユーザーに伝わると思いますが、@romot-coさんがおっしゃる通り、UIの表示だけで「値を変更したときに起こること」や「何のための機能なのか」をユーザーに伝えることは難しく、「機能・ソングのスタイル周りの説明」が必要になりそうです。

手動補正で、ユーザーに伝える必要があるのは、以下の4つかなと思います。

  1. ノートを入力として「歌い方」スタイルでピッチが生成され、ピッチを入力として「ハミング・ソング」スタイルで音声が生成されること
  2. 「歌い方」スタイルと「ハミング」スタイルの得意音域が違うこと
  3. 値を変更することで音域の補正を行える(単純なトランスポーズではない)こと
  4. 値を変更した場合、見た目の音程と出力の音程は一致するか

4の、一致させるかどうか(1つのパラメーターでノートとピッチの両方をトランスポーズするか)はまだ決まっていません(#1842)が、一致させて、使い方やツールチップで機能の説明を行うことを前提に表示を「音域の補正」にすると、UIはシンプルになるかもと思いました。

@romot-co
Copy link
Contributor

romot-co commented Feb 14, 2024

@Hiroshiba @sigprogramming
ありがとうございます、@Hiroshibaさん、@sigprogrammingさんにおっしゃることに同意です!

無理にやるとすれば、案としては以下のような形でどうでしょうか(悩み苦しんでいる感じですが…)

  • 4.について、できれば表示ピッチと出力ピッチはあわせる(その方が一般的っぽい)
  • ガイドボーカルを「歌い方」とし、音域とともに表示する
  • 「音域マッチ」という項目を用意し、ガイドボーカルの音域と表示位置を揃うように表示させる
  • +-したら音域 相当として表示が変わる: A2 - A4 元キーを+1したら Ab2 - Ab4 相当 などとする

※ 以下はマルチトラックの場合想定
test-match

ただ、これだと意味が違う・なんだかわからない気もしており、やはり機能説明はいるかも…

@romot-co
Copy link
Contributor

romot-co commented Feb 14, 2024

  • シンガーの適正音域は変わらない
  • 波音リツさんの歌い方である
  • 歌い方は波音リツさんの音域で歌う・けどシンガーの適正音域で歌わせる ← これをどう表現するか…?あたりでしょうか

→ 今回はとりあえずシフトする機能あればよさそう

@romot-co
Copy link
Contributor

初期分を考えると、

トランスポーズ相当の場合

キーを [+1] して歌う

ピッチ戻す場合

歌い方を [+1] キーにする

みたいな感じのをもういっそUIに書いてしまえば([+1]あたりは入力)いちおう起こることはわかりそう…?

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Feb 14, 2024

なるほどです!!!
とりあえず今週末あたりにリリースしたい気持ちがあるので、一旦

  • 項目名
    • 「音域の補正」か「音域マッチ」
  • UI
    • 今のまま(ツールバーに表示)
  • 仕様
    • 見た目の音程と出力の音程は一致させる(Romotさんの「ピッチを戻す場合」)

にするのが丸いかなと思いました!
UI の追加が不要なのと、今までにない名称なので別の機能だと勘違いすることがなく、分からないということが分かりやすいかなと!
項目名はなんとなく手動感がある「音域の補正」が良さそうだと感じています。
特に異論なくアプデ迎えたらこの形に微調整させてもらおうかなと・・・!!

(リリース前のちょっとワークアラウンド的な微調整は主に僕がやっちゃって、そもそもの抜本的な解決を @romot-co さん主体で取り組んでいただくとうまく回るかもとちょっと思ってます!)


それはさておき 最高の UI も考えてました。

僕も @romot-co さんと似ていて、2者の音域を合わせるような UI が良いかなと!
違いとしては、音域を文字ではなくピアノロール上に表すのを考えてました。

で、得意音域外のピアノロールが暗くすれば音域を変えた時に見た目が分かりやすそう。
あとは歌い方とハミング両方の音域をどうにかして可視化できれば良さそう、でもどっちがどっちかわかるようにする方法ないな・・・ってとこで詰まりました 😇

@romot-co
Copy link
Contributor

romot-co commented Feb 15, 2024

@Hiroshiba
ありがとうございます!
こちら「音域の補正」ふくめ異論ございません!(現時点だと最良な気がしています、ありがとうございます


違いとしては、音域を文字ではなくピアノロール上に表すのを考えてました。

で、得意音域外のピアノロールが暗くすれば音域を変えた時に見た目が分かりやすそう。
あとは歌い方とハミング両方の音域をどうにかして可視化できれば良さそう、でもどっちがどっちかわかるようにする方法ないな・・・ってとこで詰まりました 😇

おなじくで、悩んでみた軌跡を置いておきます…叩き台になれば…!(良いアイデア求む
https://xd.adobe.com/view/55a02bc1-f9be-4c9a-9f29-6b2008acbcdb-00f3/

ラインがいちばんマシに思えますが、それでもよくわからない気がしております
ピアノロールで既存の音域をあらわしつつ、歌い方のみ変更を無理なく表現させるいい感じの方法を知りたい…!

@Hiroshiba
Copy link
Member Author

@romot-co 眺めさせていただきました!!
半透明にするの、何が何かわからないの、やっぱりそうですよね。。。。

鍵盤のとこにアイコン表示、いい感じな方向に思いました!!!

音域補正をGUI上でも動かせるのなるほどでした!!
ガイドの方は動かせるけどシンガーの方が動かせないの、ちょっと不思議に思われるかも・・・?

アイデアの足し程度ですが、シンガーの音域はスコア上の色で表現して、ガイドの音域だけピアノ鍵盤あたりに表示するとか思いつきました!
「何が表示されてるかわからないけどなんとなく合わせとくか!」くらいのことはユーザー側に伝わってくれる。。。。。。かなぁ。。。。

@Hiroshiba
Copy link
Member Author

完璧なUIが何なのかの探索と、とりあえずラベルを変える部分がまだですが、issueの目的は達成できたと思うのでcloseします!

UIの方は引き続きここで議論するもよし、別issueでリスタートするもよしだと思います!

@sigprogramming さん、実装ありがとうございました!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants
@Hiroshiba @romot-co @sigprogramming and others