声纹识别引擎 govpr
- 授权协议: BSD
- 开发语言: Google Go
- 操作系统: 跨平台
- 软件首页: https://github.com/liuxp0827/govpr
- 软件文档: https://github.com/liuxp0827/govpr/blob/master/README.md
- 官方下载: https://github.com/liuxp0827/govpr/archive/master.zip
软件介绍
简介
govpr是golang 实现的基于 GMM-UBM 说话人识别引擎(声纹识别),可用于语音验证,身份识别的场景. 目前暂时仅支持汉语数字的语音,语音格式为wav格式(比特率16000,16bits,单声道)
安装
go get github.com/liuxp0827/govpr
示例
如下是一个简单的示例. 可跳转至 example 查看详细的例子,示例中的语音为纯数字8位数字.语音验证后得到一个得分,可设置阈值来判断验证语音是否为注册训练者本人.
package main
import (
"github.com/liuxp0827/govpr"
"github.com/liuxp0827/govpr/log"
"github.com/liuxp0827/govpr/waveIO"
"io/ioutil"
)
type engine struct {
vprEngine *govpr.VPREngine
}
func NewEngine(sampleRate, delSilRange int, ubmFile, userModelFile string) *engine {
return &engine{
vprEngine: govpr.NewVPREngine(sampleRate, delSilRange, ubmFile, userModelFile),
}
}
func (this *engine) DestroyEngine() {
this.vprEngine = nil
}
func (this *engine) TrainSpeech(buffers [][]byte) error {
var err error
count := len(buffers)
for i := 0; i < count; i++ {
err = this.vprEngine.AddTrainBuffer(buffers[i])
if err != nil {
log.Error(err)
return err
}
}
defer this.vprEngine.ClearTrainBuffer()
defer this.vprEngine.ClearAllBuffer()
err = this.vprEngine.TrainModel()
if err != nil {
log.Error(err)
return err
}
return nil
}
func (this *engine) RecSpeech(buffer []byte) error {
err := this.vprEngine.AddVerifyBuffer(buffer)
defer this.vprEngine.ClearVerifyBuffer()
if err != nil {
log.Error(err)
return err
}
err = this.vprEngine.VerifyModel()
if err != nil {
log.Error(err)
return err
}
Score := this.vprEngine.GetScore()
log.Infof("vpr score: %f", Score)
return nil
}
func main() {
log.SetLevel(log.LevelDebug)
vprEngine := NewEngine(16000, 50, "../ubm/ubm", "model/test.dat")
trainlist := []string{
"wav/train/01_32468975.wav",
"wav/train/02_58769423.wav",
"wav/train/03_59682734.wav",
"wav/train/04_64958273.wav",
"wav/train/05_65432978.wav",
}
trainBuffer := make([][]byte, 0)
for _, file := range trainlist {
buf, err := loadWaveData(file)
if err != nil {
log.Error(err)
return
}
trainBuffer = append(trainBuffer, buf)
}
verifyBuffer, err := waveIO.WaveLoad("wav/verify/34986527.wav")
if err != nil {
log.Error(err)
return
}
vprEngine.TrainSpeech(trainBuffer)
vprEngine.RecSpeech(verifyBuffer)
}
func loadWaveData(file string) ([]byte, error) {
data, err := ioutil.ReadFile(file)
if err != nil {
return nil, err
}
// remove .wav header info 44 bits
data = data[44:]
return data, nil
}
ACM国际大学生程序设计竞赛题解
赵端阳//袁鹤 / 电子工业 / 2010-7 / 39.00元
随着各大专院校参加ACM/ICPC热情的高涨,迫切需要有关介绍ACM国际大学生程序设计竞赛题解的书籍。《ACM国际大学生程序设计竞赛题解(2)》根据浙江大学在线题库的部分题目,经过分类、筛选、汇编,并进行了解答(个别特别简单或者特别复杂的题目未选择),比较详细地分析和深入浅出地讲解了解题的方法和用到的算法。题目的类型包括基础编程、模拟、字符串处理、搜索、动态规划、回溯、图论、几何和数学题。 ......一起来看看 《ACM国际大学生程序设计竞赛题解》 这本书的介绍吧!
