fix(audio): :bugs: fix webm audio strconv.ParseFloat: parsing "N/A"
This commit is contained in:
@@ -249,13 +249,36 @@ func SaveTmpFile(filename string, data io.Reader) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetAudioDuration returns the duration of an audio file in seconds.
|
// GetAudioDuration returns the duration of an audio file in seconds.
|
||||||
func GetAudioDuration(ctx context.Context, filename string) (float64, error) {
|
func GetAudioDuration(ctx context.Context, filename string, ext string) (float64, error) {
|
||||||
// ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 {{input}}
|
// ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 {{input}}
|
||||||
c := exec.CommandContext(ctx, "ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filename)
|
c := exec.CommandContext(ctx, "ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filename)
|
||||||
output, err := c.Output()
|
output, err := c.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrap(err, "failed to get audio duration")
|
return 0, errors.Wrap(err, "failed to get audio duration")
|
||||||
}
|
}
|
||||||
|
durationStr := string(bytes.TrimSpace(output))
|
||||||
|
if durationStr == "N/A" {
|
||||||
|
// Create a temporary output file name
|
||||||
|
tmpFp, err := os.CreateTemp("", "audio-*"+ext)
|
||||||
|
if err != nil {
|
||||||
|
return 0, errors.Wrap(err, "failed to create temporary file")
|
||||||
|
}
|
||||||
|
defer os.Remove(tmpFp.Name())
|
||||||
|
defer tmpFp.Close()
|
||||||
|
|
||||||
return strconv.ParseFloat(string(bytes.TrimSpace(output)), 64)
|
// ffmpeg -y -i filename -vcodec copy -acodec copy tmpFp
|
||||||
|
ffmpegCmd := exec.CommandContext(ctx, "ffmpeg", "-y", "-i", filename, "-vcodec", "copy", "-acodec", "copy", tmpFp.Name())
|
||||||
|
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())
|
||||||
|
output, err := c.Output()
|
||||||
|
if err != nil {
|
||||||
|
return 0, errors.Wrap(err, "failed to get audio duration after ffmpeg")
|
||||||
|
}
|
||||||
|
durationStr = string(bytes.TrimSpace(output))
|
||||||
|
}
|
||||||
|
return strconv.ParseFloat(durationStr, 64)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
"one-api/common"
|
"one-api/common"
|
||||||
"one-api/constant"
|
"one-api/constant"
|
||||||
"one-api/dto"
|
"one-api/dto"
|
||||||
@@ -345,13 +346,13 @@ func countAudioTokens(c *gin.Context) (int, error) {
|
|||||||
if err = c.ShouldBind(&reqBody); err != nil {
|
if err = c.ShouldBind(&reqBody); err != nil {
|
||||||
return 0, errors.WithStack(err)
|
return 0, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
ext := filepath.Ext(reqBody.File.Filename) // 获取文件扩展名
|
||||||
reqFp, err := reqBody.File.Open()
|
reqFp, err := reqBody.File.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.WithStack(err)
|
return 0, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpFp, err := os.CreateTemp("", "audio-*")
|
tmpFp, err := os.CreateTemp("", "audio-*"+ext)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.WithStack(err)
|
return 0, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
@@ -365,7 +366,7 @@ func countAudioTokens(c *gin.Context) (int, error) {
|
|||||||
return 0, errors.WithStack(err)
|
return 0, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
duration, err := common.GetAudioDuration(c.Request.Context(), tmpFp.Name())
|
duration, err := common.GetAudioDuration(c.Request.Context(), tmpFp.Name(), ext)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.WithStack(err)
|
return 0, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user