From b33d808bc17b08620fc3f56bb3ee18d96eb9ef50 Mon Sep 17 00:00:00 2001 From: chenjm <540896980@qq.com> Date: Tue, 17 Jun 2025 10:04:36 +0800 Subject: [PATCH] fix(audio): :bugs: fix webm audio strconv.ParseFloat: parsing "N/A" --- common/utils.go | 12 +++++++----- relay/channel/openai/relay-openai.go | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/common/utils.go b/common/utils.go index d9e05c44..d9db67d0 100644 --- a/common/utils.go +++ b/common/utils.go @@ -263,17 +263,19 @@ func GetAudioDuration(ctx context.Context, filename string, ext string) (float64 if err != nil { return 0, errors.Wrap(err, "failed to create temporary file") } - defer os.Remove(tmpFp.Name()) - defer tmpFp.Close() + tmpName := tmpFp.Name() + // Close immediately so ffmpeg can open the file on Windows. + _ = tmpFp.Close() + defer os.Remove(tmpName) - // ffmpeg -y -i filename -vcodec copy -acodec copy tmpFp - ffmpegCmd := exec.CommandContext(ctx, "ffmpeg", "-y", "-i", filename, "-vcodec", "copy", "-acodec", "copy", tmpFp.Name()) + // ffmpeg -y -i filename -vcodec copy -acodec copy + ffmpegCmd := exec.CommandContext(ctx, "ffmpeg", "-y", "-i", filename, "-vcodec", "copy", "-acodec", "copy", tmpName) if err := ffmpegCmd.Run(); err != nil { return 0, errors.Wrap(err, "failed to run ffmpeg") } // Recalculate the duration of the new file - c = exec.CommandContext(ctx, "ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", tmpFp.Name()) + c = exec.CommandContext(ctx, "ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", tmpName) output, err := c.Output() if err != nil { return 0, errors.Wrap(err, "failed to get audio duration after ffmpeg") diff --git a/relay/channel/openai/relay-openai.go b/relay/channel/openai/relay-openai.go index 3c261067..4dc0fc60 100644 --- a/relay/channel/openai/relay-openai.go +++ b/relay/channel/openai/relay-openai.go @@ -351,6 +351,7 @@ func countAudioTokens(c *gin.Context) (int, error) { if err != nil { return 0, errors.WithStack(err) } + defer reqFp.Close() tmpFp, err := os.CreateTemp("", "audio-*"+ext) if err != nil {