feat(voice): 阿里百炼 STT/TTS 主链路接通(base64 STT + cosyvoice TTS按voice_id + REST /audio/* + voice_input.deviceId)
- voice/dashscope.go 新建:DashscopeSTT(qwen-audio-3.0-asr-flash, base64 data URI→text) + DashscopeTTS(cosyvoice 按 voice_id, 取非流式 24h URL 下载字节)
- cloud.go newDashboardSTT/TTS 由空 endpoint stub 改为真实百炼 adapter
- chain.go gating 从 DashscopeAPIKey!="" 改为 voiceConfigured(cfg); silent 兜底保留
- config.VoiceConfig 扩展 DASHSCOPE_BASE_URL/VOICE_STT_*/VOICE_TTS_* 字段(必填 DASHSCOPE_API_KEY)
- gateway: POST /api/v1/audio/{transcribe,speech} (owner+审计+MaxBytesReader); voiceInputRequest 增 deviceId 并透传 runner.Run
- 实测: cosyvoice-v3.5-plus+longxiaochun 回 418(引擎拒绝), 改用 cosyvoice-v3-flash+longxiaochun_v3; TTS 你好我是昔涟->106124B wav -> STT 回 你好我是西联, 链返回真实字节/文本
- 单测: dashscope_test/config voice defaults/gateway audio_test; go build/vet/test 全绿
- 声音复刻(响昔涟音色)待公网参考音频; 不做 create_voice
This commit is contained in:
1 parent
d8044763ac
commit
73dabb9dde
13 files changed
+1070
-15
No files matched your search
@@ -80,8 +80,8 @@ func WithProviders(steps ...Provider) Option {
|
||||
// New assembles a chain from cfg using the fixed degradation order
|
||||
// cloud → local → edge-tts/espeak → silent.
|
||||
//
|
||||
// - cloud is included only when a cloud voice setting is present (today an
|
||||
// API key) so a mis-configured build degrades quietly.
|
||||
// - cloud is included only when a cloud voice credential or model is present
|
||||
// (voiceConfigured) so a mis-configured build degrades quietly.
|
||||
// - local is a pure adaptation point and is only included when supplied via
|
||||
// WithProviders; by default it is skipped.
|
||||
// - the edge-tts or espeak rung is included according to cfg.TTSProvider.
|
||||
@@ -98,7 +98,7 @@ func New(cfg config.VoiceConfig, opts ...Option) *Chain {
|
||||
}
|
||||
|
||||
steps := make([]Provider, 0, 5)
|
||||
if cfg.DashscopeAPIKey != "" {
|
||||
if voiceConfigured(cfg) {
|
||||
steps = append(steps, CloudProvider(newDashboardSTT(cfg), newDashboardTTS(cfg)))
|
||||
}
|
||||
switch cfg.TTSProvider {
|
||||
@@ -110,3 +110,12 @@ func New(cfg config.VoiceConfig, opts ...Option) *Chain {
|
||||
steps = append(steps, SilentProvider())
|
||||
return NewChain(steps...)
|
||||
}
|
||||
|
||||
// voiceConfigured reports whether any cloud voice credential or model is set, so
|
||||
// the cloud rung is only added when the runtime intends to use DashScope. Any
|
||||
// single present field (API key, base URL, or an STT/TTS model) makes the cloud
|
||||
// rung worth trying; a missing key then makes the adapter return ErrNotConfigured
|
||||
// and the chain degrades quietly.
|
||||
func voiceConfigured(cfg config.VoiceConfig) bool {
|
||||
return cfg.DashscopeAPIKey != "" || cfg.DashscopeBaseURL != "" || cfg.STTModel != "" || cfg.TTSModel != ""
|
||||
}
|
||||
Reference in new issue
Block a user