-
Notifications
You must be signed in to change notification settings - Fork 311
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
fix: YMM4のカスタムボイス機能が使えない問題の対策 #2437
Conversation
🚀 プレビュー用ページを作成しました 🚀 更新時点でのコミットハッシュ: |
プルリクエストありがとうございます! これ多分どちらかというとVOICEVOX側の課題ではない気がします。 おそらくYMM4側はファイル保存イベントを監視していて、moveイベントは監視していないんだと思います。 ちょっと元ポストのリンクを教えていただいてもよろしいでしょうか 🙇 それはそれとして、
この2点は普通に問題だと思います!! |
@Hiroshiba Xのポストです。
自分もVOICEVOXの問題ではないという認識です。
こちらも後ほどPRを出そうと思います。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Copilot reviewed 1 out of 1 changed files in this pull request and generated no comments.
長いファイルとかだと途中で書き込み失敗した時とかでエラーが発生するとかもありえそうなので、やっぱり基本書き込みが完了した後にmvが良さそうに思います! だから「どっちにしろ問題は起こりうる」な気がしますね! |
ご連絡して、来年1月上旬の次回アップデート時にmvも検知可能なように修正したいとの回答をいただきました! なのでこのPRは一旦draftにするのもありかもです・・・! release-0.22にhotfixするとしたら、 これなら実は29日にアップデートがあるので、そのタイミングで取り込めると思います。
WRITE_FILE: (_, { filePath, buffer, options }) => {
let data = new DataView(buffer instanceof Uint8Array ? buffer.buffer : buffer)
try {
// NOTE: unsafeはYMM4がファイルmvでの変更検知できないののワークアラウンド。YMM4が対応したら消す。
if (options?.unsafe) {
whiteFile(filePath, data)
}
else {
writeFileSafely(filePath, data);
}
return success(undefined);
} catch (e) {
// throwだと`.code`の情報が消えるのでreturn
const a = e as SystemError;
return failure(a.code, a);
}
}, |
@Hiroshiba
YMM4に修正が入るならHotfixではなくていいと思います。
新規ファイルの場合書き込み失敗しても失われるデータはないのでアトミックである必要が必ずしもない気がします。
一方その後の これはそもどのようにするべきなのでしょうか? |
deec382
to
24ceffe
Compare
手法にもよりそうですが、他には書き込んでる途中にデータ読んじゃうとかもありえるかなぁと思いました!
これは流石にシンボリックリンクであることを無視して、シンボリックリンク関係なくそのパスにファイルを移動するのが良い気がします! export function writeFileSafely(
path: string,
data: string | NodeJS.ArrayBufferView,
) {
// 上書きでないのなら直接書き込む
fs.writeFileSync(path, data, { flag: "wx" });
const tmpPath = `${path}.tmp`;
fs.writeFileSync(tmpPath, data);
moveFileSync(tmpPath, path, {
overwrite: true,
});
} まあエラーログは とりあえず方針としては、いったんYMM4の更新を待ちつつ、unsafe版whiteFileを実装するか考えるのが良さそうかなと思いました! 個人的な今の考えだと、待機が安定かな?と思ってます 🙏 |
YMM4の修正が既に終わっているようなのでCloseします。 |
内容
YMM4のカスタムボイス機能が正常に動作しないというXのポストを見かけたため修正しました。
ymm4/faq/ゆっくりボイス/外部の音声合成エンジンで作成した音声ファイルを使用したい
原因の詳細は不明ですが音声ファイルを一時ファイルに書き込みファイル名を変更していることが問題のようです。
このPRでは書き込み先にファイルが存在しない場合は直接書き込むように変更します。
その他
writeFileSafely
で気になったこと${path}.tmp
が既に存在した場合それを上書きしてしまう。ユーザーが作成していないと仮定しても本当に平気だろうか?moveFileSync
失敗時に作成した一時ファイルの後始末をしていない。