2010-08-03 13:26:00 xieyan0811 阅读数 4480
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5906 人正在学习 去看看 杨波

 

 

 

1.     说明
以下例程功能为:在应用程序中使用intent来调出语言识别界面,录音并识别后将识别的字串返回给应用程序。注意:使用前需要安装语音识别程序如语音搜索。

2.     本例参考自android例程:
development/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java

3.     可从此处下载可独立运行的代码:
http://download.csdn.net/source/2591401

4.     核心代码及说明

package com.android.mystt1;

 

import android.app.Activity;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.content.pm.ResolveInfo;

import android.os.Bundle;

import android.speech.RecognizerIntent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

 

import java.util.ArrayList;

import java.util.List;

 

public class MyStt1Activity extends Activity implements OnClickListener {

       private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

       private ListView mList;          // 显示识别后字串的list控件

 

       @Override

       public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);

                Button speakButton = (Button) findViewById(R.id.btn_speak); // 识别按钮

                 mList = (ListView) findViewById(R.id.list);

                PackageManager pm = getPackageManager();

                List activities = pm.queryIntentActivities(

                          new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); //本地识别程序

//                       new Intent(RecognizerIntent.ACTION_WEB_SEARCH), 0); // 网络识别程序

                if (activities.size() != 0) {

                         speakButton.setOnClickListener(this);

                } else {                 // 若检测不到语音识别程序在本机安装,测将扭铵置灰

                         speakButton.setEnabled(false);

                         speakButton.setText("Recognizer not present");

                }

       }

 

       public void onClick(View v) {

                if (v.getId() == R.id.btn_speak) {

                         startMysttActivityActivity();

                }

       }

 

       private void startMysttActivityActivity() {          // 开始识别

                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

                                   RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

                intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");

                startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
                //
调出识别界面

    }

 

       @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

                if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {

                         // Fill the list view with the strings the recognizer thought it could have heard

                         ArrayList matches = data.getStringArrayListExtra(

                                            RecognizerIntent.EXTRA_RESULTS);

                         mList.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,

                                            matches));

                }

                // 语音识别后的回调,将识别的字串在list中显示

                super.onActivityResult(requestCode, resultCode, data);

       }

}

(转载请注明出处: http://xy0811.spaces.live.com/) 

2019-10-06 18:22:55 qq_40808154 阅读数 315
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5906 人正在学习 去看看 杨波

之前在网上看到一个题目使用语音控制你的浏览器,感觉挺有意思的,就想着实现一个简单的语音识别程序,这里我选择的是百度语音识别,还有好多不错的如科大讯飞等都可以使用。

语音识别过程分为三个部分:

1)录音

2)获取参数access token,有效期为一个月(开发文档)

3)上传录音文件

1.首先你需要一个注册一个百度账号,进行登录,可以直接使用注册过的百度网盘账号进行登录,登录的网址在此处https://login.bce.baidu.com/,选择语音识别,点击创建应用,为你的应用起一个名字:

 创建完成后,如下图所示,AppID,API Key,Secret Key这三个参数需要用到

 

 然后看百度相关的技术开发文档,必要的参数一定带全。

2.由于需要进行录音,这里使用到pyaudio库,需要先进行安装,但是直接使用pip install pyaudio进行安装会出现错误,推荐使用下面的命令进行安装:
sudo apt-get install portaudio19-dev python-all-dev python3-all-dev

pip install pyaudio

安装成功后,接下来开始第1部分录音,代码中都有详细的注释,直接上代码:

import pyaudio
import wave
import requests
import json
import base64
import os


#1.录音
#用Pyaudio录制音频(该库可以进行录音,播放,生成wav文件)
def audio_record(rec_time,filename):
    """
    :param rec_time: 音频录制时间
    :param filename: 输出音频文件名
    """
    CHUNK=1024#定义数据流块
    FORMAT=pyaudio.paInt16#16bit编码格式
    CHANNELS=1#单声道
    RATE=16000#16000采样频率
    #创建一个音频对象
    p=pyaudio.PyAudio()
    #创建音频数据流
    stream=p.open(format=FORMAT,#音频流wav格式
                  channels=CHANNELS,#单声道
                  rate=RATE,#采样率16000
                  input=True,#输入
                  frames_per_buffer=CHUNK)
    print('start recording...')
    frames=list()#空列表用于保存录制的音频流
    #录制音频数据
    for i in range(0,int(RATE/CHUNK*rec_time)):
        data=stream.read(CHUNK)
        frames.append(data)
    #录制完成
    print(frames)
    #停止数据流
    stream.stop_stream()
    stream.close()
    #关闭pyaudio
    p.terminate()
    print('recording done...')
    #保存音频文件
    with wave.open(filename,'wb') as f:
        f.setnchannels(CHANNELS)#设置音频声道数
        f.setsampwidth(p.get_sample_size(FORMAT))#以字节为单位返回样本宽度
        f.setframerate(RATE)#设置取样频率

第2部分,获取参数token

#2 使用appKey secretKey 访问 https://openapi.baidu.com 换取 token
def Get_token():
    #baidu_server='https://openapi.baidu.com/oauth/2.0/token'
    grant_type = 'client_credentials'
    # API KEY
    client_id = 'PrKnhUppGEsqrG8mVG2qIq8O'
    # SECRERT KEY
    client_secret = 'Al4cRfrlRGaMCCkz3kLsd4MXOoQP28iD'

    # 拼接url
    url = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(
            client_id, client_secret)
    # 发送Post请求 获取acess_token
    req = requests.post(url)
    data_dict = json.loads(req.text)  # 将json字符串转换为python字典
    print(req.text)
    print(data_dict['access_token'])

    return data_dict['access_token']


此段代码,可以单独运行下,打印token看是否能获取到,token指为如下所示:

返回的数据:scope中含有audio_voice_assistant_get 表示有语音识别能力, 注意语音服务的调用地址是https://openapi.baidu.com/oauth/2.0/token

第3部分,上传录音(有两种方式:第一种是Json方式,第二种方式是Raw方式,详细见开发文档)

#3.上传录音文件
def BaiduYuYin(file_url,token):
    try:
        RATE='16000'
        FORMAT='wav'
        CUID='wate_play'
        DEV_PID='1536' #普通话:支持简单的英文识别

        file_url=file_url
        token = token

        #以字节格式读取文件之后进行编码
        with open(file_url,'rb') as f:
            speech=base64.b64encode(f.read()).decode('utf-8')
        size = os.path.getsize(file_url)#语音文件的字节数
        headers={'Content-Type':'application/json'}#json格式post上传本地文件
        url='https://vop.baidu.com/server_api'
        data={
            "format":FORMAT,#格式
            "rate":RATE,#取样频率,固定值16000
            "dev_pid":DEV_PID,#语音识别类型
            "speech":speech,#本地语音文件的二进制数据,需要进行base64编码
            "cuid":CUID,#用户唯一标识,用来区分用户 建议填写能区分用户的机器MAC地址或IMEI码,长度为60字符以内。
            "len":size,#语音文件的字节数
            "channel":1,#声道数,仅支持单声道,固定值为1
            "token":token,
        }
        req=requests.post(url,json.dumps(data),headers)
        data_dict=json.loads(req.text)
        print(data_dict['result'][0])
        return data_dict['result'][0][::-1]
    except:
        return '识别不清楚'

最后写一个调度函数run(),运行程序

#4.调度
def run(rec_time,file_name):
    #1.录音
    audio_record(rec_time,file_name)

    #2.获取token
    access_token=Get_token()

    #3.上传录音
    BaiduYuYin(file_name,access_token)


if __name__ == '__main__':
    #录音时间为5秒,文件名为'record1.wav'
    run(5,'record1.wav')

若想要你的电脑可以录音,需要提前打开麦克风,运行此程序后在五秒内说出一段话(可能需要大点声),控制台会打印出来,测试过之后发现准确率还可以,

2019-07-25 10:33:50 lidongxx 阅读数 448
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5906 人正在学习 去看看 杨波
import urllib.request
import time
import urllib
import json
import hashlib
import base64
from urllib import parse

def main():
    f = open("C:/Users/Administrator/Desktop/20181210_151146.m4a", 'rb')
    file_content = f.read()
    base64_audio = base64.b64encode(file_content)
    body = parse.urlencode({'audio': base64_audio})

    url = 'http://api.xfyun.cn/v1/service/v1/iat'
    api_key = '............'
    param = {"engine_type": "sms16k", "aue": "raw"}

    x_appid = '5b98e12b'
    json_str = json.dumps(param).replace(' ', '')
    print('json_str:{}'.format(json_str))
    x_param = base64.b64encode(bytes(json_str, 'ascii'))
    x_time = int(int(round(time.time() * 1000)) / 1000)
    x_checksum_str = api_key + str(x_time) + str(x_param)[2:-1]
    print('x_checksum_str:[{}]'.format(x_checksum_str))
    x_checksum = hashlib.md5(x_checksum_str.encode(encoding='ascii')).hexdigest()
    print('x_checksum:{}'.format(x_checksum))
    x_header = {'X-Appid': x_appid,
                'X-CurTime': x_time,
                'X-Param': x_param,
                'X-CheckSum': x_checksum}

    start_time = time.time()
    req = urllib.request.Request(url, bytes(body, 'ascii'), x_header)
    result = urllib.request.urlopen(req)
    result = result.read()
    print("used time: {}s".format(round(time.time() - start_time, 2)))
    print('result:'+str(result.decode(encoding='UTF8')))
    return

if __name__ == '__main__':
    main()
2019-08-01 11:32:20 weixin_40796925 阅读数 919
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5906 人正在学习 去看看 杨波


最近自己想接触下语音识别,经过一番了解和摸索,实现了对语音识别API的简单调用,正好写文章记录下。目前搜到的帖子里,有现成的调用百度语音API来对音频文件进行识别的;也有通过谷歌语音服务来实现了实时语音识别的。由于我这谷歌语音一直调用不成功,就将二者结合,简单实现了通过百度语音API来进行实时语音识别。

语音识别

语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术,微信中将语音消息转文字,以及“Hi Siri”启用Siri时对其进行发号施令,都是语音识别的现实应用。

语音识别API

百度语音识别通过REST API的方式给开发者提供一个通用的HTTP接口。任意操作系统、任意编程语言,只要可以对百度语音服务器发起http请求,均可使用此接口来实现语音识别。调用API的流程在百度语音官方文档中有说明。

在这里插入图片描述

语音识别步骤

  1. 先注册百度云的账号,控制台中创建百度语音的应用,获取API Key和Secret Key
  2. 通过API Key 和 Secret Key获取token
  3. 将token和本地音频数据上传到API链接
  4. 根据API返回结果获取解析后的文字结果

注意上述过程中我们是使用的本地音频数据,那么我们如何将自己的语音转为相应的数据呢?只要调用麦克风记录我们的语音信息存为wav格式的文件即可。而实时语音识别,即一直保持检测麦克风,只要有声音就生成wav文件向API发送请求;当识别不到语音信息时,自动停止。

代码中我参考了调用谷歌语音的 speech_recognition 模块,因为它调用麦克风的命令特别简单,而且会根据检测麦克风结果自动结束录音。

需要通过pip install SpeechRecognition 下载 speech_recognition 模块来实现上述录音工作。

效果展示

语音识别结果如下图:
在这里插入图片描述

代码下载

语音识别代码下载

百度网盘下载:
链接:https://pan.baidu.com/s/1l8JrYKn1pR5CZPCCme17OA
提取码:rc2e

GitHub代码下载:
https://github.com/pengfexue2/yuyin.git

以上算是对语音识别的初步实现,希望后续能挖掘些更有意思的应用,欢迎继续关注哈~
最后也希望推下自己记录学习 Python、前端以及微信小程序开发的公众号 TEDxPY
在这里插入图片描述

2016-09-17 16:34:46 joyjun_1 阅读数 1998
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5906 人正在学习 去看看 杨波

Python调用微软语音识别

参加某个项目时用到了微软的语音识别,根据官方给的C#版写的,没有什么注释

调用语音识别的封装类

MSspeechAPI_class.py

# -*- coding:utf-8 -*-
import certifi
import pycurl
import requests
import os
import json
import uuid
from StringIO import StringIO


def byteify(input_data):
    # convert json to list
    if isinstance(input_data, dict):
        return {byteify(key): byteify(value) for key, value in input_data.iteritems()}
    elif isinstance(input_data, list):
        return [byteify(element) for element in input_data]
    elif isinstance(input_data, unicode):
        return input_data.encode('utf-8')
    else:
        return input_data


def read_in_chunks(file_object, chunk_size=1024):
    # post chunk encoding data
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


class Authentication:
    # get token
    def __init__(self, client_id, client_secret):
        self.AccessUrl = "https://oxford-speech.cloudapp.net/token/issueToken"
        self._clientId = client_id
        # provided by MS
        self._clientSecret = client_secret
        # provided by MS
        self.request_data = 'grant_type=client_credentials&client_id=' + self._clientId+'&client_secret='
        self.request_data += self._clientSecret + '&scope=https://speech.platform.bing.com'
        # opt must be a string object not a unicode object
        data_l = len(self.request_data)
        http_header = [
                       "Content-Type:application/x-www-form-urlencoded"
                       ]

        storage = StringIO()
        # the way to get response and print it
        c = pycurl.Curl()
        c.setopt(pycurl.CAINFO, certifi.old_where())
        c.setopt(pycurl.URL, self.AccessUrl)
        c.setopt(c.HTTPHEADER, http_header)
        c.setopt(c.POST, 1)
        c.setopt(c.POSTFIELDSIZE, data_l)
        c.setopt(c.CONNECTTIMEOUT, 30)
        c.setopt(c.TIMEOUT, 30)
        c.setopt(c.POSTFIELDS, self.request_data)
        # --------------------------------------------
        c.setopt(c.WRITEFUNCTION, storage.write)
        # --------------------------------------------
        c.perform()
        c.close()
        body = storage.getvalue()
        storage.close()
        self._token = byteify(json.loads(body.decode()))

    def getAccessToken(self):
        return self._token["access_token"]


class MsSpeechRequest:
    def __init__(self, audiofile, audioSamplerate=16000, clientid='', clientsecret='', locale='zh-CN', deviceOS='Rasbian'):
        if audiofile == None:
            print 'audio input wrong'
            return
        try:
            self._auth = Authentication(clientid, clientsecret)
        except Exception as e:
            print 'failed get access token.details:%s',e.__str__()
        self._RequestUri = "https://speech.platform.bing.com/recognize"
        self._RequestUri += "?scenarios=smd"
        self._RequestUri += "&appid="
        # input appid
        self._RequestUri += "&locale="+locale
        self._RequestUri += "&device.os="+deviceOS
        self._RequestUri += "&version=3.0"
        self._RequestUri += "&format=json"
        self._RequestUri += "&instanceid="
        # input instance id
        self._RequestUri += "&requestid="+str(uuid.uuid4())
        self._audioFile = audiofile
        self._audioSamplerate = audioSamplerate.__str__()
        self._token = self._auth.getAccessToken()
        # print self._token
        self._response = ''

    def post_request(self):
        headers = {}
        headers['Accept'] = 'application/json;text/xml'
        headers['Content-Type'] = 'audio/wav; codec=\"audio/pcm\"; samplerate='+self._audioSamplerate
        headers['Authorization'] = 'Bearer '+'%s' % self._token
        try:
            with open(self._audioFile,'rb') as f:
                r=requests.post(self._RequestUri, data=read_in_chunks(f), headers=headers, stream=True)
                print r
                self._response = byteify(r.text)
                print self._response
        except Exception as e:
            print 'failed get request response. Details:%s',e.__str__()

    def returnResult(self):
        self.post_request()
        return self._response

具体调用

# -*- coding:utf-8 -*-
from MSspeechAPI_class import MsSpeechRequest
def main():
    requset = MsSpeechRequest(audiofile=('output.wav'))
    response = requset.returnResult()
    print response

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