代码初始化

This commit is contained in:
2026-05-20 11:32:39 +08:00
parent 219b7e39c7
commit e76bf57d54
20 changed files with 1585 additions and 309 deletions

View File

@@ -1,11 +1,15 @@
package audio
import "github.com/gogf/gf/v2/frame/g"
// TranscribeReq 语音转文字请求JSON body / URL 方式)
type TranscribeReq struct {
VideoURLs []string `json:"video_urls" v:"required#视频URL列表不能为空" dc:"视频URL列表"`
Model string `json:"model" dc:"whisper模型(tiny/base/small/medium)" d:"medium"`
Language string `json:"language" dc:"语言(zh/en/ja)" d:"zh"`
Threshold float64 `json:"threshold" dc:"场景检测阈值(0.1-0.5)" d:"0.3"`
g.Meta `path:"/transcribe" method:"post" tags:"音频转写" summary:"语音转文字(异步)" dc:"创建异步语音转文字任务,返回taskId"`
VideoURLs []string `json:"video_urls" v:"required#视频URL列表不能为空" dc:"视频URL列表"`
Model string `json:"model" dc:"whisper模型(tiny/base/small/medium)" d:"medium"`
Language string `json:"language" dc:"语言(zh/en/ja)" d:"zh"`
Threshold float64 `json:"threshold" dc:"场景检测阈值(0.1-0.5)" d:"0.3"`
CallbackURL string `json:"callback_url" dc:"任务完成后的回调地址(可选)成功后POST结果到此URL"`
}
// TranscribeRes 语音转文字响应

130
model/dto/audio/task_dto.go Normal file
View File

@@ -0,0 +1,130 @@
package audio
import (
"gitea.com/red-future/common/beans"
"github.com/gogf/gf/v2/frame/g"
)
// CreateTaskRes 创建任务响应
type CreateTaskRes struct {
TaskID string `json:"taskId" dc:"任务ID"`
}
// ---------- 获取任务详情 ----------
// GetTaskReq 获取任务详情请求
type GetTaskReq struct {
g.Meta `path:"/{taskId}" method:"get" tags:"音频转写" summary:"查询任务详情" dc:"根据taskId查询任务详情和明细"`
TaskID string `json:"taskId" dc:"任务ID"`
}
// GetTaskRes 获取任务详情响应
type GetTaskRes struct {
TaskInfo TranscribeTaskItem `json:"taskInfo" dc:"任务信息"`
DetailList []TranscribeTaskDetailItem `json:"detailList" dc:"明细列表(每视频一条)"`
}
// TranscribeTaskItem 任务批次项
type TranscribeTaskItem struct {
ID int64 `json:"id,string" dc:"数据库ID"`
TaskID string `json:"taskId" dc:"任务ID"`
Status string `json:"status" dc:"任务状态"`
Progress int `json:"progress" dc:"进度0-100"`
TotalFiles int `json:"totalFiles" dc:"文件总数"`
SuccessFiles int `json:"successFiles" dc:"成功文件数"`
FailFiles int `json:"failFiles" dc:"失败文件数"`
Model string `json:"model" dc:"whisper模型"`
Language string `json:"language" dc:"语言"`
Threshold float64 `json:"threshold" dc:"场景检测阈值"`
InputType string `json:"inputType" dc:"输入类型"`
InputData string `json:"inputData" dc:"输入数据"`
FileNames string `json:"fileNames" dc:"文件名列表"`
CallbackURL string `json:"callbackUrl" dc:"回调地址"`
Result string `json:"result,omitempty" dc:"完整的处理结果JSON(成功后返回)"`
ErrorMessage string `json:"errorMessage" dc:"错误信息(失败后返回)"`
CreatedAt int64 `json:"createdAt" dc:"创建时间戳"`
UpdatedAt int64 `json:"updatedAt" dc:"更新时间戳"`
}
// TranscribeTaskDetailItem 任务明细项(每视频)
type TranscribeTaskDetailItem struct {
ID int64 `json:"id,string" dc:"明细ID"`
TaskID string `json:"taskId" dc:"任务ID"`
FileIndex int `json:"fileIndex" dc:"文件序号"`
FileName string `json:"fileName" dc:"文件名"`
TranscribedText string `json:"transcribedText" dc:"语音识别文字"`
Scenes string `json:"scenes" dc:"分镜分析JSON"`
AudioSize int64 `json:"audioSize" dc:"音频文件大小"`
AudioDuration string `json:"audioDuration" dc:"音频时长"`
Model string `json:"model" dc:"whisper模型"`
Language string `json:"language" dc:"语言代码"`
ErrorMessage string `json:"errorMessage" dc:"错误信息"`
}
// ---------- 获取任务进度 ----------
// GetProgressReq 获取任务进度请求
type GetProgressReq struct {
g.Meta `path:"/{taskId}/progress" method:"get" tags:"音频转写" summary:"查询任务进度" dc:"查询任务的当前处理进度"`
TaskID string `json:"taskId" dc:"任务ID"`
}
// GetProgressRes 获取任务进度响应
type GetProgressRes struct {
TaskID string `json:"taskId" dc:"任务ID"`
Status string `json:"status" dc:"任务状态"`
Progress int `json:"progress" dc:"进度0-100"`
}
// ---------- 任务列表 ----------
// ListTaskReq 获取任务列表请求
type ListTaskReq struct {
g.Meta `path:"/tasks" method:"get" tags:"音频转写" summary:"查询任务列表" dc:"分页查询任务列表,可按状态筛选"`
*beans.Page
Status string `json:"status" dc:"按状态筛选"`
}
// ListTaskRes 获取任务列表响应
type ListTaskRes struct {
List []TranscribeTaskItem `json:"list" dc:"任务列表"`
Total int `json:"total" dc:"总数"`
}
// ---------- 回调通知结构 ----------
// CallbackPayload 回调通知内容
type CallbackPayload struct {
TaskID string `json:"taskId" dc:"任务ID"`
Status string `json:"status" dc:"任务状态"`
TotalFiles int `json:"totalFiles" dc:"文件总数"`
SuccessFiles int `json:"successFiles" dc:"成功文件数"`
FailFiles int `json:"failFiles" dc:"失败文件数"`
Result string `json:"result,omitempty" dc:"完整的处理结果JSON"`
ErrorMessage string `json:"errorMessage,omitempty" dc:"错误信息"`
DetailList []TranscribeTaskDetailItem `json:"detailList" dc:"明细列表"`
}
// ---------- 任务处理结果结构(用于result JSONB) ----------
// TaskResult 单任务处理结果
type TaskResult struct {
Results []TaskResultItem `json:"results" dc:"处理结果列表"`
}
// TaskResultItem 单视频处理结果
type TaskResultItem struct {
FileName string `json:"fileName" dc:"文件名"`
Result *TaskResultDTO `json:"result,omitempty" dc:"识别结果"`
Error string `json:"error,omitempty" dc:"错误信息"`
}
// TaskResultDTO 识别结果详情(对外输出,隐藏内部路径)
type TaskResultDTO struct {
Text string `json:"text" dc:"识别文本"`
Model string `json:"model" dc:"使用的模型"`
Language string `json:"language" dc:"语言"`
AudioSize int64 `json:"audioSize" dc:"音频文件大小(字节)"`
AudioDuration string `json:"audioDuration" dc:"音频时长"`
Scenes *SceneSummaryDTO `json:"scenes,omitempty" dc:"分镜分析"`
}

View File

@@ -1,9 +1,20 @@
package video
import "github.com/gogf/gf/v2/frame/g"
// ConcatReq 视频拼接请求JSON body / URL 方式)
type ConcatReq struct {
g.Meta `path:"/concat" method:"post" tags:"视频拼接" summary:"视频拼接(URL模式)" dc:"从视频URL下载并拼接"`
VideoURLs []string `json:"video_urls" v:"required#视频URL列表不能为空" dc:"视频URL列表(按此顺序拼接)"`
Method string `json:"method" dc:"拼接方式(auto/fast/reencode)" d:"auto"`
Upload bool `json:"upload" dc:"是否上传到MinIO" d:"false"`
}
// ConcatUploadReq 视频拼接请求(文件上传模式)
type ConcatUploadReq struct {
g.Meta `path:"/concat/upload" method:"post" tags:"视频拼接" summary:"视频拼接(文件上传)" dc:"上传视频文件并拼接(至少2个视频)"`
Method string `json:"method" dc:"拼接方式(auto/fast/reencode)" d:"auto"`
Upload bool `json:"upload" dc:"是否上传到MinIO" d:"false"`
}
// ConcatRes 视频拼接响应
@@ -14,4 +25,21 @@ type ConcatRes struct {
DurationStr string `json:"durationStr" dc:"可读时长"`
MethodUsed string `json:"methodUsed" dc:"实际使用的拼接方式"`
InputFiles int `json:"inputFiles" dc:"输入文件数"`
FileURL string `json:"fileURL" dc:"MinIO访问地址上传后返回"`
}
// UploadFileBytesReq 上传文件请求(字节流)
type UploadFileBytesReq struct {
FileName string `json:"fileName" dc:"文件名"`
FileBytes []byte `json:"fileBytes" dc:"文件字节流"`
FileStoreURL string `json:"fileStoreURL" dc:"文件存储路径"`
}
// UploadFileBytesRes 上传文件响应
type UploadFileBytesRes struct {
FileURL string `json:"fileURL" dc:"上传地址"`
FileSize int `json:"fileSize" dc:"文件大小"`
FileName string `json:"fileName" dc:"文件名称"`
FileFormat string `json:"fileFormat" dc:"文件格式"`
FileAddressPrefix string `json:"fileAddressPrefix"`
}

View File

@@ -0,0 +1,63 @@
package audio
import "gitea.com/red-future/common/beans"
// TranscribeTask 语音转文字任务批次头实体
type TranscribeTask struct {
beans.SQLBaseDO `orm:",inherit"`
TaskID string `orm:"task_id" json:"taskId" description:"任务批次唯一标识"`
Status string `orm:"status" json:"status" description:"任务状态:pending/running/success/failed"`
Progress int `orm:"progress" json:"progress" description:"进度0-100"`
TotalFiles int `orm:"total_files" json:"totalFiles" description:"文件总数"`
SuccessFiles int `orm:"success_files" json:"successFiles" description:"成功文件数"`
FailFiles int `orm:"fail_files" json:"failFiles" description:"失败文件数"`
Model string `orm:"model" json:"model" description:"whisper模型"`
Language string `orm:"language" json:"language" description:"语言"`
Threshold float64 `orm:"threshold" json:"threshold" description:"场景检测阈值"`
InputType string `orm:"input_type" json:"inputType" description:"输入类型:upload/url"`
InputData string `orm:"input_data" json:"inputData" description:"输入数据(文件路径/URL列表JSON)"`
FileNames string `orm:"file_names" json:"fileNames" description:"文件名列表JSON"`
CallbackURL string `orm:"callback_url" json:"callbackUrl" description:"任务完成后的回调地址"`
Result string `orm:"result" json:"result" description:"完整的处理结果JSON"`
ErrorMessage string `orm:"error_message" json:"errorMessage" description:"错误信息"`
}
// TranscribeTaskCol 字段定义
type TranscribeTaskCol struct {
beans.SQLBaseCol
TaskID string
Status string
Progress string
TotalFiles string
SuccessFiles string
FailFiles string
Model string
Language string
Threshold string
InputType string
InputData string
FileNames string
CallbackURL string
Result string
ErrorMessage string
}
// TranscribeTaskCols 字段常量
var TranscribeTaskCols = TranscribeTaskCol{
SQLBaseCol: beans.DefSQLBaseCol,
TaskID: "task_id",
Status: "status",
Progress: "progress",
TotalFiles: "total_files",
SuccessFiles: "success_files",
FailFiles: "fail_files",
Model: "model",
Language: "language",
Threshold: "threshold",
InputType: "input_type",
InputData: "input_data",
FileNames: "file_names",
CallbackURL: "callback_url",
Result: "result",
ErrorMessage: "error_message",
}

View File

@@ -0,0 +1,48 @@
package audio
import "gitea.com/red-future/common/beans"
// TranscribeTaskDetail 语音转文字任务明细实体(每视频一条)
type TranscribeTaskDetail struct {
beans.SQLBaseDO `orm:",inherit"`
TaskID string `orm:"task_id" json:"taskId" description:"所属任务批次ID"`
FileIndex int `orm:"file_index" json:"fileIndex" description:"文件序号(从0开始)"`
FileName string `orm:"file_name" json:"fileName" description:"文件名"`
TranscribedText string `orm:"transcribed_text" json:"transcribedText" description:"语音识别文字"`
Scenes string `orm:"scenes" json:"scenes" description:"分镜分析JSON"`
AudioSize int64 `orm:"audio_size" json:"audioSize" description:"音频文件大小(字节)"`
AudioDuration string `orm:"audio_duration" json:"audioDuration" description:"音频时长"`
Model string `orm:"model" json:"model" description:"whisper模型"`
Language string `orm:"language" json:"language" description:"语言代码"`
ErrorMessage string `orm:"error_message" json:"errorMessage" description:"错误信息"`
}
// TranscribeTaskDetailCol 字段定义
type TranscribeTaskDetailCol struct {
beans.SQLBaseCol
TaskID string
FileIndex string
FileName string
TranscribedText string
Scenes string
AudioSize string
AudioDuration string
Model string
Language string
ErrorMessage string
}
// TranscribeTaskDetailCols 字段常量
var TranscribeTaskDetailCols = TranscribeTaskDetailCol{
SQLBaseCol: beans.DefSQLBaseCol,
TaskID: "task_id",
FileIndex: "file_index",
FileName: "file_name",
TranscribedText: "transcribed_text",
Scenes: "scenes",
AudioSize: "audio_size",
AudioDuration: "audio_duration",
Model: "model",
Language: "language",
ErrorMessage: "error_message",
}