package main
import (
"bytes"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
const (
APIURL = "https://api.senseaudio.cn/v1/t2a_v2"
SENSEAUDIO_API_KEY = "SENSEAUDIO_API_KEY"
)
type TTSRequest struct {
Model string `json:"model"`
Text string `json:"text"`
Stream bool `json:"stream"`
VoiceSetting VoiceSetting `json:"voice_setting"`
}
type VoiceSetting struct {
VoiceID string `json:"voice_id"`
LatexRead bool `json:"latex_read"`
}
type TTSResponse struct {
Data struct {
Audio string `json:"audio"`
Status int64 `json:"status"`
} `json:"data"`
ExtraInfo struct {
AudioLength int64 `json:"audio_length"`
} `json:"extra_info"`
BaseResp struct {
StatusCode int64 `json:"status_code"`
StatusMessage string `json:"status_msg"`
} `json:"base_resp"`
}
func main() {
payload := TTSRequest{
Model: "senseaudio-tts-1.5-260319",
Text: "道可道,非常道。名可名,非常名。",
Stream: false,
VoiceSetting: VoiceSetting{
VoiceID: "male_0004_a",
LatexRead: false,
},
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", APIURL, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer "+SENSEAUDIO_API_KEY)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var result TTSResponse
json.Unmarshal(body, &result)
if result.Data.Audio != "" {
// 将 hex 编码的音频数据解码为二进制
audioBytes, _ := hex.DecodeString(result.Data.Audio)
os.WriteFile("output.mp3", audioBytes, 0644)
fmt.Println("合成成功")
fmt.Printf("音频时长: %dms\n", result.ExtraInfo.AudioLength)
} else {
fmt.Printf("合成失败: %s\n", result.BaseResp.StatusMessage)
}
}