fix a bug
This commit is contained in:
@@ -171,15 +171,19 @@ enum ImitationAssessor {
|
||||
}
|
||||
body.append(Data("--\(boundary)--\r\n".utf8))
|
||||
|
||||
var headers = [
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "multipart/form-data; boundary=\(boundary)",
|
||||
]
|
||||
if !AppConfig.authToken.isEmpty {
|
||||
headers["Authorization"] = "Bearer \(AppConfig.authToken)"
|
||||
}
|
||||
let result = try await HTTPClient.execute(
|
||||
baseURL: AppConfig.serverBaseURL,
|
||||
path: "api/v1/dub-shares",
|
||||
method: "POST",
|
||||
timeout: 120,
|
||||
headers: [
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "multipart/form-data; boundary=\(boundary)",
|
||||
],
|
||||
headers: headers,
|
||||
body: body
|
||||
)
|
||||
guard (200...299).contains(result.statusCode) else {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -17,6 +17,7 @@ enum Theme {
|
||||
static let textDark = Color(hex: 0x12181F)
|
||||
static let textMuted = Color(hex: 0x97A2AE)
|
||||
static let textSubtle = Color(hex: 0x58626C)
|
||||
static let danger = Color(hex: 0xDC2626)
|
||||
static let textOverlay = Color(hex: 0xA3ACB6)
|
||||
|
||||
static func formatTime(_ ms: Int64) -> String {
|
||||
|
||||
Reference in New Issue
Block a user