You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

112 lines
3.0 KiB

package echomeet
import (
"context"
"fmt"
"yunyan/pb"
"yunyan/sys/iflytek/openaichat"
"yunyan/sys/iflytek/ost"
)
// 科大讯飞 SparkChain 的两条服务端能力:
// 转写用 SDK 里 RegionMSFT 的录音文件引擎(音频地址仍是客户端 OSS 公网 URL);
// 总结用同一套凭据的海外文本模型,domain=openai(gpt-5.3-chat),不走星火。
type iflytekTranscriber struct {
sys *ost.Client
}
func newIflytekTranscriber(f map[string]string) (Transcriber, error) {
appID, err := need(f, "iflytek", "app_id")
if err != nil {
return nil, err
}
key, err := need(f, "iflytek", "api_key")
if err != nil {
return nil, err
}
secret, err := need(f, "iflytek", "api_secret")
if err != nil {
return nil, err
}
sys, err := ost.New(appID, key, secret, f["host"], f["task_type"])
if err != nil {
return nil, err
}
return &iflytekTranscriber{sys: sys}, nil
}
func (this *iflytekTranscriber) Submit(_ context.Context, req SubmitRequest) (*SubmitResult, error) {
taskID, err := this.sys.Create(req.AudioURL, req.EnableSpeaker, req.Language)
if err != nil {
return nil, err
}
return &SubmitResult{TaskID: taskID}, nil
}
func (this *iflytekTranscriber) Query(_ context.Context, taskID, _ string) (*QueryResult, error) {
status, segs, err := this.sys.Query(taskID)
switch status {
case ost.StatusSuccess:
out := make([]*pb.ContextStruct, 0, len(segs))
for _, s := range segs {
out = append(out, &pb.ContextStruct{
Content: s.Text,
Starttime: s.StartMs,
Endtime: s.EndMs,
Speaker: s.Speaker,
})
}
return &QueryResult{Status: StatusSuccess, Contexts: out}, nil
case ost.StatusRunning:
return &QueryResult{Status: StatusRunning}, nil
default:
if err == nil {
err = fmt.Errorf("iflytek ost query failed")
}
return &QueryResult{Status: StatusFailed}, err
}
}
type iflytekSummarizer struct {
sys *openaichat.Client
}
func newIflytekSummarizer(f map[string]string) (Summarizer, error) {
appID, err := need(f, "iflytek", "app_id")
if err != nil {
return nil, err
}
key, err := need(f, "iflytek", "api_key")
if err != nil {
return nil, err
}
secret, err := need(f, "iflytek", "api_secret")
if err != nil {
return nil, err
}
// 库里若还留着星火的 host/domain,New 会丢掉,改走 SDK 预置的 openai 地址和 gpt-5.3-chat。
sys, err := openaichat.New(appID, key, secret, f["host"], f["model"])
if err != nil {
return nil, err
}
return &iflytekSummarizer{sys: sys}, nil
}
// iflytekSummaryDisplayName 生成弹窗里显示的模型名,跟真正发出去的模型一致。
func iflytekSummaryDisplayName(fields map[string]string) string {
model := ""
if fields != nil {
model = fields["model"]
}
return openaichat.EffectiveModel(model)
}
func (this *iflytekSummarizer) Chat(_ context.Context, messages []ChatMessage) (string, error) {
in := make([]openaichat.Message, 0, len(messages))
for _, m := range messages {
in = append(in, openaichat.Message{Role: m.Role, Content: m.Content})
}
return this.sys.Chat(in)
}