Files
Microsoft-tts/internal/config/config.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
}