fix a bug

This commit is contained in:
2026-09-05 13:09:39 +08:00
parent f928dd5c68
commit 6d9f9a5468
13 changed files with 805 additions and 107 deletions

View File

@@ -58,13 +58,16 @@ struct TestView: View {
}
HStack(spacing: 8) {
sentenceButton("上一句") {
stopDubPlayback(message: nil)
controller.seekToPreviousSentence()
}
sentenceButton("播放原句") {
stopDubPlayback(message: nil)
controller.playCurrentSentenceAndStop()
controller.showTransientMessage("正在播放当前句子,播放完自动停止")
}
sentenceButton("下一句") {
stopDubPlayback(message: nil)
controller.seekToNextSentence()
}
}
@@ -80,19 +83,24 @@ struct TestView: View {
.buttonStyle(.plain)
.disabled(isAssessing)
HStack(spacing: 8) {
dubButton("播放配音", enabled: !dubSegments.isEmpty && !dubbingPlayback && !isGeneratingDub) {
dubButton(
dubbingPlayback ? "停止播放" : "播放本句录音",
enabled: dubbingPlayback || (controller.currentSentence.flatMap { dubSegments[$0.index] } != nil)
) {
toggleDubPlayback()
}
dubButton("生成配音", enabled: !dubRawSegments.isEmpty && !dubbingPlayback && !isGeneratingDub) {
stopDubPlayback(message: nil)
generateDubShareAudio()
}
dubButton("分享配音", enabled: mergedDubURL != nil && !dubbingPlayback && !isSharingDub) {
stopDubPlayback(message: nil)
shareMergedDub()
}
}
Text(dubbingStatus)
.font(.system(size: 13))
.foregroundColor(Theme.accentDeep)
.foregroundColor(isSharingDub ? Theme.danger : Theme.accentDeep)
.frame(maxWidth: .infinity, alignment: .leading)
Text(scoreSummary)
.font(.system(size: 22, weight: .bold))
@@ -159,6 +167,7 @@ struct TestView: View {
// MARK: - 录音
private func toggleRecording() {
stopDubPlayback(message: nil)
if isRecording {
stopRecordingAndAssess()
} else {
@@ -394,32 +403,40 @@ struct TestView: View {
private func toggleDubPlayback() {
if dubbingPlayback {
stopDubPlayback(message: "已停止配音播放")
stopDubPlayback(message: "已停止录音播放")
return
}
let sentence = controller.currentSentence
let audioURL = mergedDubURL ?? sentence.flatMap { dubSegments[$0.index] }
guard let audioURL else { return }
if mergedDubURL == nil, let sentence = sentence {
controller.seek(to: sentence.startMs)
guard let sentence = controller.currentSentence else {
dubbingStatus = "请先选择要播放的句子"
return
}
guard let audioURL = dubSegments[sentence.index] else {
dubbingStatus = "当前句还没有录音,请先录音后再播放"
return
}
// Always play the current sentence recording only (never the merged full track).
stopDubPlayback(message: nil)
controller.seek(to: sentence.startMs)
controller.pause()
controller.setVolume(0)
let player = dubPlayer ?? AVPlayer()
dubPlayer = player
player.replaceCurrentItem(with: AVPlayerItem(url: audioURL))
let item = AVPlayerItem(url: audioURL)
player.replaceCurrentItem(with: item)
dubbingPlayback = true
dubbingStatus = mergedDubURL == nil ? "正在播放当前句配音,视频原声静音" : "正在播放整段配音,视频原声静音"
dubbingStatus = "正在播放当前句录音"
player.play()
if dubPlaybackObserver == nil {
dubPlaybackObserver = NotificationCenter.default.addObserver(
forName: AVPlayerItem.didPlayToEndTimeNotification,
object: player.currentItem,
queue: .main
) { _ in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
stopDubPlayback(message: "配音播放完成")
}
if let dubPlaybackObserver {
NotificationCenter.default.removeObserver(dubPlaybackObserver)
self.dubPlaybackObserver = nil
}
dubPlaybackObserver = NotificationCenter.default.addObserver(
forName: AVPlayerItem.didPlayToEndTimeNotification,
object: item,
queue: .main
) { _ in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
stopDubPlayback(message: "本句录音播放完成")
}
}
}
@@ -468,7 +485,7 @@ struct TestView: View {
return
}
isSharingDub = true
dubbingStatus = "正在生成分享链接…"
dubbingStatus = "正在生成分享链接,请稍候..."
let request = DubShareUploadRequest(
videoHash: item.id,
title: item.title,