130 lines
3.0 KiB
Go
130 lines
3.0 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sync"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
// Config 包含应用程序的所有配置
|
|
type Config struct {
|
|
Server ServerConfig `yaml:"server"`
|
|
TTS TTSConfig `yaml:"tts"`
|
|
}
|
|
|
|
// ServerConfig 包含HTTP服务器配置
|
|
type ServerConfig struct {
|
|
Port int `yaml:"port"`
|
|
ReadTimeout int `yaml:"read_timeout"` // 单位:秒
|
|
WriteTimeout int `yaml:"write_timeout"` // 单位:秒
|
|
BasePath string `yaml:"base_path"`
|
|
}
|
|
|
|
// TTSConfig 包含Microsoft TTS API配置
|
|
type TTSConfig struct {
|
|
APIKey string `yaml:"api_key"`
|
|
Region string `yaml:"region"`
|
|
DefaultVoice string `yaml:"default_voice"`
|
|
DefaultRate string `yaml:"default_rate"`
|
|
DefaultPitch string `yaml:"default_pitch"`
|
|
DefaultFormat string `yaml:"default_format"`
|
|
MaxTextLength int `yaml:"max_text_length"`
|
|
RequestTimeout int `yaml:"request_timeout"` // 单位:秒
|
|
MaxConcurrent int `yaml:"max_concurrent"`
|
|
SegmentThreshold int `yaml:"segment_threshold"`
|
|
MinSentenceLength int `yaml:"min_sentence_length"`
|
|
MaxSentenceLength int `yaml:"max_sentence_length"`
|
|
VoiceMapping map[string]string `yaml:"voice_mapping"` // OpenAI声音到Azure声音的映射
|
|
}
|
|
|
|
var (
|
|
config Config
|
|
once sync.Once
|
|
)
|
|
|
|
// Load 从指定路径加载配置文件
|
|
func Load(configPath string) (*Config, error) {
|
|
var err error
|
|
once.Do(func() {
|
|
// 设置默认配置
|
|
setDefaults()
|
|
|
|
// 从配置文件加载
|
|
if configPath != "" {
|
|
err = loadFromFile(configPath)
|
|
if err != nil {
|
|
err = fmt.Errorf("加载配置文件失败: %w", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
// 从环境变量覆盖
|
|
overrideFromEnv()
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &config, nil
|
|
}
|
|
|
|
// 设置默认配置值
|
|
func setDefaults() {
|
|
config = Config{
|
|
Server: ServerConfig{
|
|
Port: 8080,
|
|
ReadTimeout: 30,
|
|
WriteTimeout: 30,
|
|
BasePath: "",
|
|
},
|
|
TTS: TTSConfig{
|
|
DefaultVoice: "zh-CN-XiaoxiaoNeural",
|
|
DefaultRate: "0%",
|
|
DefaultPitch: "0%",
|
|
DefaultFormat: "audio-24khz-48kbitrate-mono-mp3",
|
|
MaxTextLength: 5000,
|
|
RequestTimeout: 30,
|
|
MaxConcurrent: 10,
|
|
SegmentThreshold: 500,
|
|
MinSentenceLength: 200,
|
|
MaxSentenceLength: 300,
|
|
VoiceMapping: make(map[string]string),
|
|
},
|
|
}
|
|
}
|
|
|
|
// 从配置文件加载配置
|
|
func loadFromFile(path string) error {
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return yaml.Unmarshal(data, &config)
|
|
}
|
|
|
|
// 从环境变量中覆盖配置
|
|
func overrideFromEnv() {
|
|
if port := os.Getenv("TTS_SERVER_PORT"); port != "" {
|
|
fmt.Sscanf(port, "%d", &config.Server.Port)
|
|
}
|
|
|
|
if apiKey := os.Getenv("TTS_API_KEY"); apiKey != "" {
|
|
config.TTS.APIKey = apiKey
|
|
}
|
|
|
|
if region := os.Getenv("TTS_API_REGION"); region != "" {
|
|
config.TTS.Region = region
|
|
}
|
|
|
|
// 可以添加更多环境变量覆盖
|
|
}
|
|
|
|
// Get 返回已加载的配置
|
|
func Get() *Config {
|
|
return &config
|
|
}
|