| license | mit | ||
|---|---|---|---|
| pipeline_tag | text-to-speech | ||
| tags |
|
go-speech 基于 Golang + ONNX 构建的轻量语音库,支持 TTS(文本转语音)与 ASR(语音转文字)。 集成 MeloTTS、Piper、达摩院 Paraformer 架构模型、Whisper 模型。
go get -u github.com/getcharzp/go-speech模型与动态链接库存放在独立仓库(HuggingFace,含 ModelScope 国内镜像),无需全量下载,请根据实际使用的引擎按需下载所需文件。
- HuggingFace 仓库地址:https://huggingface.co/getcharzp/go-speech
- ModelScope 镜像地址:https://www.modelscope.cn/getcharzp/go-speech
动态链接库选择
onnxruntime 动态链接库需按运行平台选择(默认放置于 lib/ 目录,可通过 OnnxRuntimeLibPath 自定义路径):
| 平台 | 文件 |
|---|---|
| Linux | lib/onnxruntime_amd64.so |
| Windows | lib/onnxruntime.dll |
| macOS | lib/onnxruntime_amd64.dylib |
MeloTTS 支持中英混合合成
package main
import (
"github.com/getcharzp/go-speech/tts/melotts"
"github.com/up-zero/gotool/fileutil"
"log"
)
func main() {
ttsEngine, err := melotts.NewEngine(melotts.DefaultConfig())
if err != nil {
log.Fatalf("创建引擎失败: %v", err)
}
defer ttsEngine.Destroy()
text := "2019年12月30日,中国人口突破14亿人,联系电话: 13800138000。"
wavData, err := ttsEngine.SynthesizeToWav(text, 1.0)
if err != nil {
log.Fatalf("合成失败: %v", err)
}
outputPath := "output.wav"
err = fileutil.FileSave(outputPath, wavData)
if err != nil {
log.Fatalf("保存 WAV 失败: %v", err)
}
}Piper 支持中文合成
package main
import (
"github.com/getcharzp/go-speech/tts/pipertts"
"github.com/up-zero/gotool/fileutil"
"log"
)
func main() {
cfg := pipertts.Config{
OnnxRuntimeLibPath: "../lib/onnxruntime.dll",
ModelPath: "../pipertts_weights/zh_CN-xiao_ya-medium.onnx",
ConfigPath: "../pipertts_weights/zh_CN-xiao_ya-medium.onnx.json",
}
ttsEngine, err := pipertts.NewEngine(cfg)
if err != nil {
log.Fatalf("创建引擎失败: %v", err)
}
defer ttsEngine.Destroy()
testText := "2019年12月30日,中国人口突破14亿人。联系电话: 13800138000。"
wavBytes, err := ttsEngine.SynthesizeToWav(testText)
if err != nil {
log.Fatalf("合成失败: %v", err)
}
outputPath := "pipertts_output.wav"
err = fileutil.FileSave(outputPath, wavBytes)
if err != nil {
log.Fatalf("保存失败: %v", err)
}
}package main
import (
"fmt"
"github.com/getcharzp/go-speech/asr/paraformer"
"log"
)
func main() {
asrEngine, err := paraformer.NewEngine(paraformer.DefaultConfig())
if err != nil {
log.Fatalf("创建引擎失败: %v", err)
}
defer asrEngine.Destroy()
text, err := asrEngine.TranscribeFile("./zh-en.wav")
if err != nil {
log.Printf("识别出错: %v", err)
return
}
fmt.Printf("识别结果: %s\n", text)
}package main
import (
"fmt"
"github.com/getcharzp/go-speech/asr/whisper"
"log"
)
func main() {
asrEngine, err := whisper.NewEngine(whisper.DefaultConfig())
if err != nil {
log.Fatalf("创建引擎失败: %v", err)
}
defer asrEngine.Destroy()
text, err := asrEngine.TranscribeFile("./zh-en.wav", whisper.TranscribeOption{
Language: whisper.LangZh,
Task: whisper.TaskTranscribe,
})
if err != nil {
log.Fatalf("识别出错: %v", err)
return
}
fmt.Printf("识别结果: %s\n", text) // Yesterday was星期一Today is Tuesday明天是星期三
}