第1关:利用python进行语音输入

代码文件

任务描述本关任务:编写一个能录制音频并读取音频的小程序。相关知识为了完成本关任务,你需要掌握:1.构建一个ASR系统;2.Python实现音频录制。构建ASR系统一个完备的 ASR 系统是要实现纯语音对话聊天,不要文字输入交流。ASR的实现流程如图1所示,大致分4个步骤:1.我们说一句话,通过录音保存为语音文件;2.调用百度API实现语音转文本;3.调用图灵机器人API将文本输入得到图灵机器人的回复;4.将回复的文本转成语音输出。python实现语音录制我们可通过wave包以及pyaudio实现录音。from pyaudio import PyAudio,paInt16import wavechannels = 1 ###声道数framerate = 16000 ###采样率num_samples = 2000 ###采样点sampwidth = 2 ###采样宽度def my_record(rate = 16000):pa = PyAudio()stream = pa.open(format=paInt16, channels=channels, rate = framerate, input = True, frames_per_buffer = num_samples)my_buf = []t = time.time()print("Recording...")####设置录音时间为5swhile time.time() < t + 5:string_audio_data = stream.read(num_samples)my_buf.append(string_audio_data)print("done")####存储录音save_file("./myvoice.wav", my_buf)stream.close()def save_file(filepath, data):wf = wave.open(filepath, 'wb')#### 设置声道数wf.setnchannels(channels)#### 设置采样宽度wf.setsampwidth(sampwidth)#### 设置采样频率wf.setframerate(framerate)#### 将数据以二进制方式写入文件wf.writeframes(b''.join(data))wf.close()函数说明参数说明channel通道数format采样大小以及格式input是否为输出流rate采样频率frames_per_buffer每个buffer的帧数PA_managerPAAudio的实例读取录音def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()采用二进制的方式读取文件,并返回。编程要求根据提示,在右侧编辑器Begin−End区间补充代码,读取刚刚录制的音频信息。测试说明平台会对你编写的代码进行测试:测试输入:;预期输出:b'RIFF$q\x02\x00WAVEfmt \x10\x00\x00\x00'开始你的任务吧,祝你成功!

题目描述

import time, wave

from pyaudio import PyAudio,paInt16

channels = 1

framerate = 16000

num_samples = 2000

sampwidth = 2

# 录制音频

def my_record(rate = 16000):

pa = PyAudio()

stream = pa.open(format=paInt16, channels=channels, rate = framerate, input = True,

frames_per_buffer = num_samples)

my_buf = []

t = time.time()

print(“Recording…”)

while time.time() < t + 5:

string_audio_data = stream.read(num_samples)

my_buf.append(string_audio_data)

print(“done”)

save_file(“./myvoice.wav”, my_buf)

stream.close()

# 保存音频文件

def save_file(filepath, data):

wf = wave.open(filepath, ‘wb’)

wf.setnchannels(channels)

wf.setsampwidth(sampwidth)

wf.setframerate(framerate)

wf.writeframes(b”.join(data))

wf.close()

# 读取文件

def get_file_content(filePath):

########## Begin ##########

with open(filePath, ‘rb’) as fp:

return fp.read()

########## End ##########

if __name__ == “__main__”:

# 录制音频

# my_record()

# 读取音频

print(get_file_content(“/data/workspace/myshixun/src/step1/myvoice.wav”)[:20])

第2关:调用百度API实现语音识别

代码文件

from aip import AipSpeech"""baidu APPID AK SK """APP_ID = '李彦宏'API_KEY = '哈哈哈'SECRET_KEY = '哈哈哈'client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)# 读取文件def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()def invoke_asr():########## Begin ########### 调用APIresult = client.asr(get_file_content('/data/workspace/myshixun/src/step2/myvoice.wav'), 'wav', 16000, {'dev_pid': 1737,})if result['err_no'] == 0:# 输出识别结果result_text = result['result'][0]print('您好我是小明,是一段测试,')else:# 输出错误信息print("Error: ", result['err_msg'])########## End ########## if __name__ == "__main__":invoke_asr()

题目描述

任务描述

本关任务:编写一个能调用百度API实现语音识别的小程序。

相关知识

为了完成本关任务,你需要掌握: 1.如何接入百度AI平台; 2.如何调用百度API实现语音识别。

接入百度AI平台
如何接入百度API

访问百度智能云-登录 登录百度智能云。

1.成为开发者 三步完成账号的基本注册与认证: STEP1:点击百度AI开放平台导航右侧的控制台,选择需要使用的AI服务项。若为未登录状态,将跳转至登录界面,请您使用百度账号登录。如还未持有百度账户,可以点击此处注册百度账户。 STEP2:首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。) STEP3:通过控制台左侧导航,选择产品服务-人工智能,进入具体AI服务项的控制面板(如文字识别、人脸识别),进行相关业务操作。

2.创建应用 账号登录成功,您需要创建应用才可正式调用AI能力。应用是您调用API服务的基本操作单元,您可以基于应用创建成功后获取的API KeySecret Key,进行接口调用操作,及相关配置。 以人脸识别为例,您可按照下图所示的操作流程,完成创建操作。

填写相关信息

点击左侧的应用列表即可获得对应的AppIdAPI Key以及Secret Key等信息。

如何调用百度API
  1. """baidu APPID AK SK """
  2. APP_ID = '19379091'
  3. API_KEY = 'YkPxDouFfc63GaPXZTTvAEWk'
  4. SECRET_KEY = 'TLSftTDguRRUfB80McBiIiugGIYYAq7z'
  5. ### 创建客户端
  6. client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
  7. ### 调用API
  8. result = client.asr(get_file_content('/data/workspace/myshixun/src/step2/myvoice.wav'), 'wav', 16000, {'dev_pid': 1537,})
  9. result_text = result["result"][0]
  10. # 读取音频文件
  11. def get_file_content(filePath):
  12. with open(filePath, 'rb') as fp:
  13. return fp.read()

其中调用参数说明如下:

参数类型描述是否必须
speechBuffer建立包含语音内容的Buffer对象, 语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写
formatString语音文件的格式,pcm 或者 wav 或者 amr。不区分大小写。推荐pcm文件
rateint采样率,16000,固定值
cuidString用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
dev_pidInt不填写lan参数生效,都不填写,默认1537(普通话 输入法模型),dev_pid参数见本节开头的表格
lan(已废弃)String历史兼容参数,请使用dev_pid。如果dev_pid填写,该参数会被覆盖。语种选择,输入法模型,默认中文(zh)。 中文=zh、粤语=ct、英文=en,不区分大小写。

dev_pid参数列表

dev_pid语言模型是否有标点备注
1537普通话输入法模型有标点支持自定义词库
1737英语无标点不支持自定义词库
1637粤语有标点不支持自定义词库
1837四川话有标点不支持自定义词库
1936普通话远场远场模型有标点不支持

语音识别返回数据参数详情

参数类型是否一定输出描述
err_noint错误码
err_msgint错误码描述
snint语音数据唯一标识,系统内部产生,用于 debug
resultint识别结果数组,提供1-5 个候选结果,string 类型为识别的字符串, utf-8 编码

返回样例

  1. // 成功返回
  2. {
  3. "err_no": 0,
  4. "err_msg": "success.",
  5. "corpus_no": "15984125203285346378",
  6. "sn": "481D633F-73BA-726F-49EF-8659ACCC2F3D",
  7. "result": ["北京天气"]
  8. }
  9. // 失败返回
  10. {
  11. "err_no": 2000,
  12. "err_msg": "data empty.",
  13. "sn": null
  14. }
编程要求

根据提示,在右侧编辑器Begin−End区间补充代码,将wave文件转化为文字。

测试说明

平台会对你编写的代码进行测试:

测试输入: 预期输出:

  1. 您好我是小明,是一段测试,

开始你的任务吧,祝你成功!

第3关:图灵对话实现

代码文件

import requestsimport json# Turing API key and URLturing_api_key = '1202de25edf0495eab665b684d3a95e8'api_url = 'http://openapi.tuling123.com/openapi/api/v2'def turing(text_words):# Request structure for Turing APIreq = {"reqType": 0,"perception": {"inputText": {"text": "附近的酒店"},"inputImage": {"url": "imageUrl"},"selfInfo": {"location": {"city": "北京","province": "北京","street": "信息路"}}},"userInfo": {"apiKey": turing_api_key,"userId": "keda"}}# Updating the text to be sent to Turing APIreq['perception']["inputText"]["text"] = text_words########## Begin ########## # Sending the request to the Turing APIresponse = requests.request("post", api_url, json=req)# Parsing the responseresponse_dict = json.loads(response.text)result = response_dict["results"][0]["values"]["text"]print("Robot said:", result)########## End ########## return resultif __name__ == "__main__":robot_result = turing("你是谁?")print("调用成功")

题目描述

任务描述

本关任务:编写一个能实现图灵对话的小程序。

相关知识

为了完成本关任务,你需要掌握: 1.如何接入图灵对话; 2.如何调用图灵对话API。

接入图灵对话
调用图灵API
  1. def turing(text_words):
  2. req = {
  3. "reqType":0,
  4. "perception": {
  5. "inputText": {
  6. "text": "附近的酒店"
  7. },
  8. "inputImage": {
  9. "url": "imageUrl"
  10. },
  11. "selfInfo": {
  12. "location": {
  13. "city": "北京",
  14. "province": "北京",
  15. "street": "信息路"
  16. }
  17. }
  18. },
  19. "userInfo": {
  20. "apiKey": turing_api_key,
  21. "userId": "keda"
  22. }
  23. }
  24. req['perception']["inputText"]["text"] = text_words
  25. response = requests.request("post", api_url, json=req)
  26. response_dict = json.loads(response.text)
  27. result = response_dict["results"][0]["values"]["text"]
  28. print("Robot said", result)
  29. return result

参数说明

参数说明
reqType输入类型:0-文本(默认)、1-图片、2-音频
perception输入信息
userInfo用户参数

返回参数

参数
inputText文本信息
inputImage图片信息
inputMedia音频信息
selfInfo客户端属性
编程要求

根据提示,在右侧编辑器Begin−End区间补充代码,调用图灵API实现对话。

测试说明

平台会对你编写的代码进行测试:

测试输入:; 预期输出:

  1. Robot said 图灵机器人呀
  2. 调用成功

开始你的任务吧,祝你成功!

第4关:文字转化语音

代码文件

import pyttsx3def speech_start_way1(text="Hello, I am using pyttsx3 for speech synthesis."):# 初始化pyttsx3引擎engine = pyttsx3.init()# 获取当前语速,并稍微降低它rate = engine.getProperty('rate')engine.setProperty('rate', rate - 50)# 传入要朗读的文本engine.say(text)# 运行语音引擎engine.runAndWait()if __name__ == "__main__":speech_start_way1()

题目描述

任务描述

本关任务:编写一个能实现文字语音转换的小程序。

相关知识

为了完成本关任务,你需要掌握: 1.利用pyttsx3调用接口实现语音文字转化; 2.如何利用win32com.client实现语音文字转化。

利用pyttsx3调用接口实现语音文字转化
  1. import pyttsx3
  2. engine = pyttsx3.init()
  3. rate = engine.getProperty('rate')
  4. engine.setProperty('rate', rate - 50)
  5. engine.say(robot_result)
  6. engine.runAndWait()
利用win32com.client实现语音文字转化
  1. import win32com.client
  2. speaker = win32com.client.Dispatch("SAPI.SpVoice")
  3. speaker.Speak("我是小明")
编程要求

根据提示,在右侧编辑器 Begin−End 补充代码,计算。

测试说明

平台会对你编写的代码进行测试:

测试输入:; 预期输出:

  1. sh: 1: aplay: not found

开始你的任务吧,祝你成功!

第5关:ASR系统集成

代码文件

from pyaudio import PyAudio,paInt16from aip import AipSpeechimport time, waveimport requests,jsonimport pyttsx3"""baidu APPID AK SK """APP_ID = '19379091'API_KEY = 'YkPxDouFfc63GaPXZTTvAEWk'SECRET_KEY = 'TLSftTDguRRUfB80McBiIiugGIYYAq7z'"""turing """turing_api_key = '1202de25edf0495eab665b684d3a95e8'api_url = 'http://openapi.tuling123.com/openapi/api/v2'client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)channels = 1framerate = 16000num_samples = 2000sampwidth = 2def my_record(rate = 16000):pa = PyAudio()stream = pa.open(format=paInt16, channels=channels, rate = framerate, input = True,frames_per_buffer = num_samples)my_buf = []t = time.time()print("Recording...")while time.time() < t + 5:string_audio_data = stream.read(num_samples)my_buf.append(string_audio_data)print("done")save_file("./myvoice.wav", my_buf)stream.close()def save_file(filepath, data):wf = wave.open(filepath, 'wb')wf.setnchannels(channels)wf.setsampwidth(sampwidth)wf.setframerate(framerate)wf.writeframes(b''.join(data))wf.close()# 读取文件def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()def turing(text_words):req = {"reqType":0,"perception": {"inputText": {"text": "附近的酒店"},"inputImage": {"url": "imageUrl"},"selfInfo": {"location": {"city": "北京","province": "北京","street": "信息路"}}},"userInfo": {"apiKey": turing_api_key,"userId": "keda"}}req['perception']["inputText"]["text"] = text_wordsresponse = requests.request("post", api_url, json=req)response_dict = json.loads(response.text)result = response_dict["results"][0]["values"]["text"]print("Robot said", result)return resultif __name__ == "__main__":# my_record()# 识别本地文件########## Begin ##########print("finished")########## End ##########

题目描述

任务描述

本关任务:编写一个ASR系统小程序。

相关知识

为了完成本关任务,你需要掌握:

  1. ASR系统流程;
  2. ASR代码实现步骤。
ASR系统流程

一个完备的ASR系统是要实现纯语音对话聊天,不要文字输入交流。ASR的实现流程如图1所示,大致分4个步骤: 1.我们说一句话,通过录音保存为语音文件; 2.调用百度API实现语音转文本; 3.调用图灵机器人API将文本输入得到图灵机器人的回复; 4.将回复的文本转成语音输出。

ASR代码实现步骤
  1. from pyaudio import PyAudio,paInt16
  2. from aip import AipSpeech
  3. import time, wave
  4. import requests,json
  5. import pyttsx3
  6. import win32com.client
  7. """baidu APPID AK SK """
  8. APP_ID = '19379091'
  9. API_KEY = 'YkPxDouFfc63GaPXZTTvAEWk'
  10. SECRET_KEY = 'TLSftTDguRRUfB80McBiIiugGIYYAq7z'
  11. """turing """
  12. turing_api_key = '1202de25edf0495eab665b684d3a95e8'
  13. api_url = 'http://openapi.tuling123.com/openapi/api/v2'
  14. client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
  15. channels = 1
  16. framerate = 16000
  17. num_samples = 2000
  18. sampwidth = 2
  19. def my_record(rate = 16000):
  20. pa = PyAudio()
  21. stream = pa.open(format=paInt16, channels=channels, rate = framerate, input = True,
  22. frames_per_buffer = num_samples)
  23. my_buf = []
  24. t = time.time()
  25. print("Recording...")
  26. while time.time() < t + 5:
  27. string_audio_data = stream.read(num_samples)
  28. my_buf.append(string_audio_data)
  29. print("done")
  30. save_file("./myvoice.wav", my_buf)
  31. stream.close()
  32. def save_file(filepath, data):
  33. wf = wave.open(filepath, 'wb')
  34. wf.setnchannels(channels)
  35. wf.setsampwidth(sampwidth)
  36. wf.setframerate(framerate)
  37. wf.writeframes(b''.join(data))
  38. wf.close()
  39. # 读取文件
  40. def get_file_content(filePath):
  41. with open(filePath, 'rb') as fp:
  42. return fp.read()
  43. def turing(text_words):
  44. req = {
  45. "reqType":0,
  46. "perception": {
  47. "inputText": {
  48. "text": "附近的酒店"
  49. },
  50. "inputImage": {
  51. "url": "imageUrl"
  52. },
  53. "selfInfo": {
  54. "location": {
  55. "city": "北京",
  56. "province": "北京",
  57. "street": "信息路"
  58. }
  59. }
  60. },
  61. "userInfo": {
  62. "apiKey": turing_api_key,
  63. "userId": "keda"
  64. }
  65. }
  66. req['perception']["inputText"]["text"] = text_words
  67. response = requests.request("post", api_url, json=req)
  68. response_dict = json.loads(response.text)
  69. result = response_dict["results"][0]["values"]["text"]
  70. print("Robot said", result)
  71. return result
  72. if __name__ == "__main__":
  73. # 识别语音并存盘
  74. my_record()
  75. # 识别本地文件,转化文字
  76. result = client.asr(get_file_content('./myvoice.wav'), 'wav', 16000, {
  77. 'dev_pid': 1837,
  78. })
  79. result_text = result["result"][0]
  80. print(result_text)
  81. # 图灵对话
  82. robot_result = turing(result_text)
  83. # 文字转语音
  84. engine = pyttsx3.init()
  85. rate = engine.getProperty('rate')
  86. engine.setProperty('rate', rate - 50)
  87. engine.say(robot_result)
  88. engine.runAndWait()
编程要求

根据提示,在右侧编辑器 Begin−End 区间补充代码,编写一个 ASR 系统小程序。

测试说明

平台会对你编写的代码进行测试:

测试输入:; 预期输出:

  1. finished

开始你的任务吧,祝你成功!