智能语音识别
实验目标:
调用WeNet与百度智能云进行语音识别,并且使用自定义训练集进行训练。
实验任务
调用wenet的解码器,对测试语音进行识别,输出中文语句;
调用百度智能云的api进行语音识别;
尝试构建或下载自定义语音数据集,使用wenet框架进行训练
wenet
配置相关环境
-
安装必要库
pip install wenet pip install wave
-
下载模型文件
chs
模型文件下载链接
https://github.com/wenet-e2e/wenet/releases/download/v2.0.1/chs.tar.gz
代码部分
import wave
import wenetruntime as wenet
test_wav = "test.wav" #选择语音文件
with wave.open(test_wav, 'rb') as fin:
assert fin.getnchannels() == 1
wav = fin.readframes(fin.getnframes())
#模型文件夹
model_dir = "chs"
decoder = wenet.Decoder(model_dir=model_dir, lang='chs')
# The wav is 24k, 16bits, and decode every 0.5 seconds
interval = int(0.5 * 24000) * 2
for i in range(0, len(wav), interval):
last = False if i + interval < len(wav) else True
chunk_wav = wav[i:min(i + interval, len(wav))]
ans = decoder.decode(chunk_wav, last)
print(ans)
执行结果
{
"nbest" : [{
"sentence" : "人工智能"
}],
"type" : "final_result"
}
百度API
在百度云创建语音识别应用
安装必要库
pip install sys
pip install json
pip install base64
pip install time
代码部分
注意替换其中的API Key、Secret Key
# coding=utf-8
import sys
import json
import base64
import time
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
from urllib.request import urlopen
from urllib.request import Request
from urllib.error import URLError
from urllib.parse import urlencode
timer = time.perf_counter
else:
from urllib.request import urlopen
from urllib.request import Request
from urllib.request import URLError
from urllib import urlencode
if sys.platform == "win32":
timer = time.clock
else:
# On most other platforms the best timer is time.time()
timer = time.time
API_KEY = '填入你的KEY'
SECRET_KEY = '填入你的KEY'
# 需要识别的文件
AUDIO_FILE = './audio/16k.wav' # 只支持 pcm/wav/amr 格式
# 文件格式
FORMAT = AUDIO_FILE[-3:] # 文件后缀只支持 pcm/wav/amr 格式
CUID = '123456PYTHON'
# 采样率
RATE = 16000 # 固定值
# 普通版
DEV_PID = 1537 # 1537 表示识别普通话,使用输入法模型。根据文档填写PID,选择语言及识别模型
ASR_URL = 'http://vop.baidu.com/server_api'
SCOPE = 'audio_voice_assistant_get' # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有
class DemoError(Exception):
pass
""" TOKEN start """
TOKEN_URL = 'http://aip.baidubce.com/oauth/2.0/token'
def fetch_token():
params = {'grant_type': 'client_credentials',
'client_id': API_KEY,
'client_secret': SECRET_KEY}
post_data = urlencode(params)
if (IS_PY3):
post_data = post_data.encode( 'utf-8')
req = Request(TOKEN_URL, post_data)
try:
f = urlopen(req)
result_str = f.read()
except URLError as err:
print('token http response http code : ' + str(err.code))
result_str = err.read()
if (IS_PY3):
result_str = result_str.decode()
print(result_str)
result = json.loads(result_str)
print(result)
if ('access_token' in result.keys() and 'scope' in result.keys()):
print(SCOPE)
if SCOPE and (not SCOPE in result['scope'].split(' ')): # SCOPE = False 忽略检查
raise DemoError('scope is not correct')
print('SUCCESS WITH TOKEN: %s EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
return result['access_token']
else:
raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')
""" TOKEN end """
if __name__ == '__main__':
token = fetch_token()
speech_data = []
with open(AUDIO_FILE, 'rb') as speech_file:
speech_data = speech_file.read()
length = len(speech_data)
if length == 0:
raise DemoError('file %s length read 0 bytes' % AUDIO_FILE)
speech = base64.b64encode(speech_data)
if (IS_PY3):
speech = str(speech, 'utf-8')
params = {'dev_pid': DEV_PID,
'format': FORMAT,
'rate': RATE,
'token': token,
'cuid': CUID,
'channel': 1,
'speech': speech,
'len': length
}
post_data = json.dumps(params, sort_keys=False)
# print post_data
req = Request(ASR_URL, post_data.encode('utf-8'))
req.add_header('Content-Type', 'application/json')
try:
begin = timer()
f = urlopen(req)
result_str = f.read()
print ("Request time cost %f" % (timer() - begin))
except URLError as err:
print('asr http response http code : ' + str(err.code))
result_str = err.read()
if (IS_PY3):
result_str = str(result_str, 'utf-8')
print(result_str)
with open("result.txt","w") as of:
of.write(result_str)
运行结果
{"corpus_no":"7299264180552717747","err_msg":"success.","err_no":0,"result":["北京科技馆。"],"sn":"626746583651699492376"}