视频保存
This commit is contained in:
@@ -107,17 +107,20 @@ func (c *OpenAICompatibleClient) Transcribe(ctx context.Context, cfg *dao.STTCon
|
||||
}
|
||||
|
||||
// 3) 构造请求
|
||||
endpoint := strings.TrimRight(cfg.Provider.BaseURL, "/") + "/audio/transcriptions"
|
||||
endpoint := buildTranscriptionEndpoint(cfg.Provider.BaseURL)
|
||||
if endpoint == "" {
|
||||
return nil, fmt.Errorf("STT provider base_url is empty: provider=%s model=%s", cfg.Provider.ProviderCode, cfg.Model.ModelCode)
|
||||
}
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, body)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("构造 STT 请求失败: %w", err)
|
||||
return nil, fmt.Errorf("构造 STT 请求失败: endpoint=%s provider=%s model=%s: %w", endpoint, cfg.Provider.ProviderCode, cfg.Model.ModelCode, err)
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+cfg.Key.APIKey)
|
||||
req.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
resp, err := c.httpClient.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("调用 STT 接口失败: %w", err)
|
||||
return nil, fmt.Errorf("调用 STT 接口失败: endpoint=%s provider=%s model=%s: %w", endpoint, cfg.Provider.ProviderCode, cfg.Model.ModelCode, err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
@@ -132,7 +135,7 @@ func (c *OpenAICompatibleClient) Transcribe(ctx context.Context, cfg *dao.STTCon
|
||||
if len(preview) > 300 {
|
||||
preview = preview[:300] + "..."
|
||||
}
|
||||
return nil, fmt.Errorf("STT 接口返回 %d: %s", resp.StatusCode, preview)
|
||||
return nil, fmt.Errorf("STT 接口返回 %d: endpoint=%s provider=%s model=%s body=%s", resp.StatusCode, endpoint, cfg.Provider.ProviderCode, cfg.Model.ModelCode, preview)
|
||||
}
|
||||
|
||||
// 4) 解析
|
||||
@@ -151,6 +154,17 @@ func (c *OpenAICompatibleClient) Transcribe(ctx context.Context, cfg *dao.STTCon
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func buildTranscriptionEndpoint(baseURL string) string {
|
||||
base := strings.TrimRight(strings.TrimSpace(baseURL), "/")
|
||||
if base == "" {
|
||||
return ""
|
||||
}
|
||||
if strings.HasSuffix(base, "/audio/transcriptions") {
|
||||
return base
|
||||
}
|
||||
return base + "/audio/transcriptions"
|
||||
}
|
||||
|
||||
// downloadAudio 从给定 URL 拉取音频内容,返回字节流 + 推断的文件名
|
||||
//
|
||||
// 文件名仅作为 multipart 的 filename 参数,主要决定 Content-Type 推断;
|
||||
|
||||
@@ -165,6 +165,12 @@ func (s *TranscribeService) runJob(transcriptID int64, rec meetingModel.MeetingR
|
||||
"model_code": cfg.Model.ModelCode,
|
||||
"key_id": cfg.Key.ID,
|
||||
}).Error
|
||||
logs.Info(ctx, funcName, "已选择 STT 配置",
|
||||
zap.Int64("transcript_id", transcriptID),
|
||||
zap.String("provider_code", cfg.Provider.ProviderCode),
|
||||
zap.String("model_code", cfg.Model.ModelCode),
|
||||
zap.String("base_url", cfg.Provider.BaseURL),
|
||||
zap.String("file_url", rec.FileURL))
|
||||
|
||||
result, err := s.sttClient.Transcribe(ctx, cfg, rec.FileURL, language)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user