2018-03-13 19:58:38 UIUCGOGOGO 阅读数 263
  • C语言自学--基础视频教程

    随着目前热门的云计算、物联网、移动互联网、智能家居、虚拟世界等信息技术的高速发展,C语言也发挥着越来越重要的作用。现在C语言开发人才紧俏,学好C语言,相信您会有个可以期待的美好未来。本课程适合想要自学C语言的人

    25619 人正在学习 去看看 传智

关键概念:

一帧信号通过傅里叶变换可以提取出频谱,频谱具有精细结构(反映音高,用处不大)包络(反映音色,用处大)。

MFCC:梅尔频率倒谱系数,主要描述频谱包络。梅尔频率是基于人耳听觉特性提出来的, 它与Hz频率成非线性对应关系。梅尔频率倒谱系数(MFCC)则是利用它们之间的这种关系,计算得到的Hz频谱特征。主要用于语音数据特征提取和降低运算维度(对于一个很多维(采样点)的数据,可以通过MFCC提取出其中最重要的几个采样点从而降低了数据的维度)。

识别一个未知语音之后,要通过计算其与模板(提前已知)距离来判断语音是什么意思。比较这个距离,要用到DTW动态弯算法,让待识别语音中的每一帧与模板中最相似的一帧进行匹配,总距离即为各帧匹配后所得的欧氏距离之和。

GMM:高斯混合模型。如果每个词有多个模板,便可把模板训练成模型(将模板切割成多个段落),在采用GMM模型识别语音时,依然是采用动态弯算法,将欧氏距离代替为GMM概率密度,概率最大的模型即为识别结果。

HMM:隐马尔可夫模型。(具体意义见PPT)

Bigram:一个马尔可夫模型。音素HMM模型通过词典复合成单词HMM模型,再由单词HMM模型与语言模型复合成语言HMM。


现在的结构已经应用了神经网络,具体见PPT。

补充资料:https://www.zhihu.com/question/20398418

2019-04-07 11:21:48 boyStray 阅读数 760
  • C语言自学--基础视频教程

    随着目前热门的云计算、物联网、移动互联网、智能家居、虚拟世界等信息技术的高速发展,C语言也发挥着越来越重要的作用。现在C语言开发人才紧俏,学好C语言,相信您会有个可以期待的美好未来。本课程适合想要自学C语言的人

    25619 人正在学习 去看看 传智

没有语音识别的背景,单看kaldi的代码是看不懂的,去kaldi的新手qq群里面问也没人会教的。好在国外还有2门课程可以自学,

1、英国爱丁堡大学的语音识别课程

http://www.inf.ed.ac.uk/teaching/courses/asr/lectures-2019.html

2、美国斯坦福大学的语音识别课程

http://web.stanford.edu/class/cs224s/

另外csdn的一个博主的文章挺全面的

https://blog.csdn.net/quheDiegooo

举个简单的图来总结语音识别的步骤,GMM其实就是将一个frame(25ms长度)的语音做分类,输出是某个音素phone。后续的hmm只处理音素phone,不再处理MFCC的数据了。

2018-08-01 18:15:23 qq_21876195 阅读数 1290
  • C语言自学--基础视频教程

    随着目前热门的云计算、物联网、移动互联网、智能家居、虚拟世界等信息技术的高速发展,C语言也发挥着越来越重要的作用。现在C语言开发人才紧俏,学好C语言,相信您会有个可以期待的美好未来。本课程适合想要自学C语言的人

    25619 人正在学习 去看看 传智

开发环境、工具:QT5.11、Windows10 

开发目的:尝试使用Qt调用百度语音识别的api接口,来实现在线的语音识别。属于自学范畴,大神们请不要责怪。

说明:由于 Qt 访问请求 http 和 百度语音识别的 json 格式要求已经被我封装成静态库文件。所以大部分关键代码看不见。

一、以下是我的项目代码展示:

mainwindow.h头文件 

二、自己封装的BaiVop类的头文件,这个头文件中说明了接口函数的使用方法。后面有注意事项。

三、BaiVop 类的构造函数说明:

    1、BaiVop();
        功能://构造函数初始化对象。
        
    2、BaiVop(QString, QString);
        功能://构造函数通过参数传入 apiKey、secretKey 获得百度语音的 token 值给私有成员, 
              //并初始化麦克风。

四、其他公用接口说明:
    
    1、QString getBaiVop_token(QString , QString);
        功能://通过参数传入 apiKey、secretKey 返回百度语音的 token 给调用者。
        注意://这个函数的调用时,不能使用 BaiVop(QString, QString) 构造函数构造对象。
        
    2、QString getBaiVop_data(QByteArray , QString );
        功能://通过参数传入 音频数据、token 返回 百度语音的识别后的数据。
        注意://这个函数的调用时,必须先调用 getBaiVop_token 函数得到 token。

    3、void Vop_start();
        功能://开始麦克风录音。
        注意://调用该函数之前,必须初始化麦克风
        
    4、QString Vop_stop();
        功能://停止录音,并且返回 语音识别后的数据。
        注意://该函数被调用之前,必须 BaiVop(QString, QString) 这个构造函数构造对象。

五、mainwindow.cpp 文件

六、运行测试结果:

说明:当按住界面的pushbutton按钮时,开始录音;当放开按钮时,结束录音,并将百度语音识别的数据 插入 textEdit 进行显示

运行前,如图所示:

运行结果如下:

 

静态库使用和下载地址:

https://download.csdn.net/download/qq_21876195/10577449

静态库的源代码下载地址:

https://download.csdn.net/download/qq_21876195/10577468

源代码下载地址:

https://download.csdn.net/download/qq_21876195/10577484

 

 

2018-12-26 22:45:35 qq_36973838 阅读数 7490
  • C语言自学--基础视频教程

    随着目前热门的云计算、物联网、移动互联网、智能家居、虚拟世界等信息技术的高速发展,C语言也发挥着越来越重要的作用。现在C语言开发人才紧俏,学好C语言,相信您会有个可以期待的美好未来。本课程适合想要自学C语言的人

    25619 人正在学习 去看看 传智

我是一名2016级电子信息工程的学生,这是第一次发博客,因为经常在这里查资料 ,自己也应该贡献一点经验吧,也可以当是记录自己学习的过程吧。

最近在自学python,然后18年9月份正好python加入计算机二级,再然后我趁这个机会就混过了。

百度了一下语音识别,有很许多厂商提供语音识别服务,比如:阿里云、百度AI平台、腾讯云、讯飞AI…

大家可以尝试一下其他的免费平台,我这里选择的是百度语音识别,当然需要注册一个百度云平台的账号,附上网址点击直达

支持的语音格式

原始 PCM 的录音参数必须符合 8k/16k 采样率、16bit 位深、单声道,支持的格式有:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)。
我这里采用的是采样率为16KHz、单声道、wav格式的录音参数。

附上录音的源代码
这里需要pyaudio和wave库
LuYin(5, ‘test.wav’)表示录音5秒,文件名为test.wav

import pyaudio
import wave
def LuYin(Time,filename):
    CHUNK = 1024              #wav文件是由若干个CHUNK组成的,CHUNK我们就理解成数据包或者数据片段。
    FORMAT = pyaudio.paInt16  #这个参数后面写的pyaudio.paInt16表示我们使用量化位数 16位来进行录音。
    CHANNELS = 1              #代表的是声道,这里使用的单声道。
    RATE = 16000              # 采样率16k
    RECORD_SECONDS = Time     #采样时间
    WAVE_OUTPUT_FILENAME = filename   #输出文件名

    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    print("* 录音开始")

    frames = []

    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)

    print("* 录音结束")

    stream.stop_stream()
    stream.close()
    p.terminate()

    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

注意事项

如果需要使用实时识别、长语音、唤醒词、语义解析等其它语音功能,请使用Android或者iOS SDK 或 Linux C++ SDK 等。

请严格按照文档里描述的参数进行开发,特别请关注原始录音参数以及语音压缩格式的建议,否则会影响识别率,进而影响到产品的用户体验。

目前系统支持的语音时长上限为60s,请不要超过这个长度,否则会返回错误。(摘自官方文档)

获取tokent

tokent(鉴权认证机制)相当于是自己的身份,有个这个合格的身份平台才会给你提供服务。
可以把tokent获取出来直接使用,不用每一次都获取,但是这个tokent隔一段时间会失效,我感觉是一个月左右/笑哭

import requests
import json
def Gettokent():
    baidu_server = "https://openapi.baidu.com/oauth/2.0/token?"
    grant_type = "client_credentials"
    #API Key
    client_id = "你的API Key"
    #Secret Key
    client_secret = "你的Secret Key"

    #拼url
    url = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(client_id, client_secret)
    #print(url)
    #获取token
    res = requests.post(url)
    #print(res.text)
    token = json.loads(res.text)["access_token"]
    print(token)

上传识别

后两项参数为非必须(摘自官方文档)
主要参数

dev_pid 参数列表(摘自官方文档)
dev_pid 参数列表

语音识别 返回数据参数详情(摘自官方文档)
在这里插入图片描述

返回样例(摘自官方文档)
在这里插入图片描述

错误码解释(摘自官方文档)
错误码解释

直接附上程序
参数为本地文件的地址
附一个示例音频文件16k.wav

import pyaudio
import wave
import requests
import json
import base64
import os
def BaiduYuYin(fileurl):
    try:
        RATE = "16000"                  #采样率16KHz
        FORMAT = "wav"                  #wav格式
        CUID = "wate_play"
        DEV_PID = "1536"                #无标点普通话
        token = '你的token'

        # 以字节格式读取文件之后进行编码
        with open(fileurl, "rb") as f:
            speech = base64.b64encode(f.read()).decode('utf8')

        size = os.path.getsize(fileurl)
        headers = {'Content-Type': 'application/json'}
        url = "https://vop.baidu.com/server_api"
        data = {
            "format": FORMAT,
            "rate": RATE,
            "dev_pid": DEV_PID,
            "speech": speech,
            "cuid": CUID,
            "len": size,
            "channel": 1,
            "token": token,
        }
        req = requests.post(url, json.dumps(data), headers)
        result = json.loads(req.text)
        return result["result"][0][:-1]
    except:
        return '识别不清'

第一次写博客,希望大家多多指正,有什么问题请留言,一定及时回复。

2018-11-19 13:28:07 qq_42917455 阅读数 2977
  • C语言自学--基础视频教程

    随着目前热门的云计算、物联网、移动互联网、智能家居、虚拟世界等信息技术的高速发展,C语言也发挥着越来越重要的作用。现在C语言开发人才紧俏,学好C语言,相信您会有个可以期待的美好未来。本课程适合想要自学C语言的人

    25619 人正在学习 去看看 传智
  1. 登录百度AI开发平台
    在这里插入图片描述

  2. 申请自己的ak
    在这里插入图片描述

  3. 开放平台上有各种语言支持的开发文档,自学能力差得人,不用担心,我为你们封装了语音合成与识别的utils,复制粘贴即可使用

    package com.czxy.TestSample;
    
    import com.baidu.aip.speech.AipSpeech;
    import com.baidu.aip.speech.TtsResponse;
    import com.baidu.aip.util.Util;
    import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;
    import org.json.JSONObject;
    
    import javax.sound.sampled.AudioFileFormat;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 百度语音工具类
     */
    public class SpeechUtils {
    
        public static final String APP_ID = "14456779";
    
        public static final String API_KEY = "swit9DZ57kxo4rFjz8sauyuR";
    
        public static final String SECRET_KEY = "CDlpqaGRLoXGHGsedE21ufI3EBU8DCct";
    
    
        /**
         * 语音合成
         * @param text 文字内容
         * @param Path 合成语音生成路径
         * @return
         */
        public static void SpeechSynthesis(String text, String Path) {
            /*
            最长的长度
             */
            int maxLength = 1024;
            if (text.getBytes().length >= maxLength) {
                return ;
            }
            // 初始化一个AipSpeech
            AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
    
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
    
            // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
    //        client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
    //        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理
    
            // 调用接口
            TtsResponse res = client.synthesis(text, "zh", 1, null);
            byte[] data = res.getData();
            //定义变量调用转换格式
            boolean a = true;
            if (data != null) {
                try {
                    Util.writeBytesToFileSystem(data, "D:\\rap\\output.mp3");
                    a=false;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (!a) {
                convertMP3ToPcm(Path,"D:\\temp\\output.pcm");
            }
    
        }
    
        /**
         * 语音识别
         * @param Path 路径
         * @param Path 语音类型
         * @return
         */
        public static String SpeechRecognition(String Path) throws IOException {
            // 初始化一个AipSpeech
            AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
    
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
    
            // 调用接口
            byte[] data = Util.readFileByBytes(Path);     //readFileByBytes仅为获取二进制数据示例
            JSONObject asrRes2 = client.asr(data, "pcm", 16000, null);
            return asrRes2.toString(2);
        }
    
    
        /**
         *  mp3转pcm
         * @param mp3path MP3文件存放路径
         * @param pcmpath pcm文件保存路径
         * @return
         */
        public static boolean convertMP3ToPcm(String mp3path, String pcmpath){
            try {
                //获取文件的音频流,pcm的格式
                AudioInputStream audioInputStream = getPcmAudioInputStream(mp3path);
                //将音频转化为  pcm的格式保存下来
                AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmpath));
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
    
        /**
         * 获得pcm文件的音频流
         * @param mp3filepath
         * @return
         */
        private static AudioInputStream getPcmAudioInputStream(String mp3filepath) {
            File mp3 = new File(mp3filepath);
            AudioInputStream audioInputStream = null;
            AudioFormat targetFormat = null;
            try {
                AudioInputStream in = null;
                MpegAudioFileReader mp = new MpegAudioFileReader();
                in = mp.getAudioInputStream(mp3);
                AudioFormat baseFormat = in.getFormat();
                targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                        baseFormat.getChannels(), baseFormat.getChannels()*2, baseFormat.getSampleRate(), false);
                audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return audioInputStream;
        }
    
    }
    
    
    

4 简单使用

    public static void main(String[] args) throws IOException {
    	//第一个参数是你输入的文字,第二个参数是你保存到本地的路径
        SpeechSynthesis("你好,我是dog", "D:\\rap\\output.mp3");
        //这个参数是刚合成的本地路径
        String s = SpeechRecognition("D:\\temp\\output.pcm");
        System.out.println(s);
    }

GMM-HMM语音识别

阅读数 470

出国翻译官

阅读数 1139

没有更多推荐了,返回首页