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

ソング:ノートをコピーしてから、歌詞貼り付けを行うと変な文字列が貼り付けられる #2591

Open
1 of 3 tasks
terapotan opened this issue Mar 4, 2025 · 3 comments

Comments

@terapotan
Copy link
Contributor

不具合の内容

ノートをコピー(Ctrl+C)してから、別のノートに歌詞貼り付け(Ctrl+V)すると、下記のような文字列が貼り付けられる。

[{"position":1440,"duration":600,"noteNumber":65,"lyric":"ド"}]

現象・ログ

不具合発生時の動画。
Image

再現手順

ノートのコンテキストメニューから、もしくはCtrl+Cによって、ノートをコピーし、ノートの歌詞を選択してCtrl+Vを押すと、不具合が再現する。コピーはコンテキストメニュー・ショートカットキーどちらからでもよいが、貼り付けはショートカットキーを使った貼り付けでないと、不具合が再現しない。

期待動作

ノートをコピーして、歌詞貼り付けを行っても変な文字列が貼り付けられないこと。

VOICEVOXのバージョン

0.23.0

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

  • Windows
  • macOS
  • Linux

Windows 11 Home 10.0.26100 ビルド 26100

その他

貼り付けられた文字列は、恐らくノートを表すJSON形式の文字列だと思われる。コンテキストメニュー経由での貼り付けの場合は考慮されているが、ショートカットキーを使用した貼り付けの考慮が漏れていると考えられる。一番良いのは、ノート情報がクリップボードに貼り付けられないこと(現状だとクリップボード履歴から、文字列がすべて見えてしまっている)だが、実装上可能なのか、またそうすべきなのかについては議論が必要と考えられる。

@Hiroshiba
Copy link
Member

Hiroshiba commented Mar 4, 2025

issue作成ありがとうございます!!
たしかにこの挙動は課題かもですね!

ノート情報をクリップボードにどう保存すれば良いのか調べるのがまず必要かな~と感じました!
というのも、google presentationとかのテキスト入りの矩形オブジェクトをコピーしたときは理想の動きをしてそうなので・・・。

google presentationでテキスト入り矩形オブジェクトをコピーしてこのツールで中身確認してみたところ、以下のデータが含まれてそうでした!

kind	type	getAsFile()
string	text/plain	N/A
string	text/html	N/A
string	application/x-vnd.google-docs-document-slice-clip+wrapped	N/A
string	application/x-vnd.google-docs-drawings-object+wrapped	N/A
string	application/x-vnd.google-docs-internal-clip-id	N/A

ノート用のtypeを作ってそっちにjsonを書き込みつつ、text/plainには普通の歌詞を書き込めば良さそう・・・?
typeを自作する場合どういう命名規則にすれば良いんだろうとか気にしないといけないことはまだありそうだけど、そんなに難しくなく実装できそう・・・?
ChatGPTくんに聞いてみた結果もメモ)

@terapotan
Copy link
Contributor Author

terapotan commented Mar 8, 2025

現状だけ整理しておきます。

現状、ノートのコピー処理は、下記コードで行われています。
処理としてはシンプルで、コピーされたノートをJSON形式にシリアライズしてクリップボードにコピーするだけです。
貼り付け時には、クリップボードの文字列をJSONとしてパースし、シーケンサー上に貼り付けます。
https://github.com/VOICEVOX/voicevox/blob/0e1e83d1d0ae9fd55d8716bb6a54cc2f10f272e2/src/store/singing.ts#L3215C1-L3306C5

  COPY_NOTES_TO_CLIPBOARD: {
...
}

  COMMAND_PASTE_NOTES_FROM_CLIPBOARD: {
...
  },

Image

問題は、JSON文字列をクリップボードのtext/plainに直接貼り付けてしまっていることです。
text/plainに保存してしまうと、普通にテキストとして貼り付け可能であるため、今回のようなバグが発生します。
なので、それ以外の型に保存すればよいと思っています(ヒホさんのコメントより)。

実装や型名等について、Grokくんにも聞いてみました。以下に結果を載せておきます。

https://x.com/i/grok/share/v2290Y6Vg2e1KskJ7L6qsTxOU

Grokくんは、型名としてapplication/jsonかapplication/x-voicevox-noteを提案してきてるみたいです……

以上です。参考になれば!

@Hiroshiba
Copy link
Member

Hiroshiba commented Mar 8, 2025

型名としてapplication/jsonかapplication/x-voicevox-note

なるほどです!! ちょっと調べた感じ、スラッシュの後ろは/vnd.名前.タイプとするのが良さそうな雰囲気でした。
ソング関連だというのを加味しつつ複数形にして・・・こうが良さそう・・・・・?
application/vnd.voicevox.song-notes

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

2 participants