加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

govpr--golang实现的gmm-ubm算法的说话人识别(声纹识别)引擎

发布时间:2020-12-16 18:24:43 所属栏目:大数据 来源:网络整理
导读:简介 govpr是golang 实现的基于 GMM-UBM 说话人识别引擎(声纹识别),可用于语音验证,身份识别的场景. 目前暂时仅支持汉语数字的语音,语音格式为wav格式(比特率16000,16bits,单声道) 安装 go get github.com/liuxp0827/govpr 示例 如下是一个简单的示例. 可跳

简介

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,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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读