前言:
简单描述一下自己的实现思路:
1.运行程序 ---> 2.语音输入 ---> 3.语音转文字 ---> 4.聊天回复 ---> 5.文字转语音 ---> 6.播放语音
这里的语音功能全部使用的是百度语音的API,聊天回复这里使用的是图灵机器人,Python版本使用的是Python3.6。由于我笔记本的录音效果较差,我就用了在家吃土的蓝牙音响,作为语音的输入输出设备,有点智能音响的感觉了。
准备:
百度智能云登录\注册链接:https://cloud.baidu.com/,这里进入百度语音的管理界面,创建一个新应用后,将该应用的AppID、API Key以及Secret Key记录下来,后面的Python脚本中需要用到。
这里选择创建机器人,根据引导,配置完成后,进入管理界面,记录下该机器人的Key。
代码:
以下代码中,需要自己填写自己申请的百度语音的key以及图灵机器人的Key
1 importtime2 importos3 importpygame4 importurllib.request5 importjson6 from aip importAipSpeech7 importspeech_recognition as sr8 importurllib39
10 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 忽略百度api连接时的报错信息。11
12 #Baidu Speech API
13 APP_ID = '这里填自己的ID'
14 API_KEY = '这里填自己的APIKey'
15 SECRET_KEY = '这里填自己的KEY'
16
17 client =AipSpeech(APP_ID,API_KEY,SECRET_KEY)18
19 #Turing API
20 TURING_KEY = "这里填自己的图灵机器人API"
21 API_URL = "http://openapi.tuling123.com/openapi/api/v2"
22
23 #录音
24 def rec(rate=16000):25 r =sr.Recognizer()26 with sr.Microphone(sample_rate=rate) as source:27 print("please say something")28 audio =r.listen(source)29
30 with open("recording.wav", "wb") as f:31 f.write(audio.get_wav_data())32
33 #百度语音转文字
34 deflisten():35 with open('recording.wav', 'rb') as f:36 audio_data =f.read()37
38 result = client.asr(audio_data, 'wav', 16000, {39 'dev_pid': 1536,40 })41
42 text_input = result["result"][0]43
44 print("我说:" +text_input)45 Robot_think(text_input)46
47
48 #图灵处理
49 defRobot_think(text_input):50 req ={51 "perception":52 {53 "inputText":54 {55 "text": text_input56 },57
58 "selfInfo":59 {60 "location":61 {62 "city": "东营",63 "province": "东营",64 "street": "黄河路"
65 }66 }67 },68 "userInfo":69 {70 "apiKey": TURING_KEY,71 "userId": "这里随便填"
72 }73 }74 #print(req)
75 #将字典格式的req编码为utf8
76 req = json.dumps(req).encode('utf8')77 #print(req)
78
79 http_post = urllib.request.Request(API_URL, data=req, headers={'content-type': 'application/json'})80 response =urllib.request.urlopen(http_post)81 response_str = response.read().decode('utf8')82 #print(response_str)
83 response_dic =json.loads(response_str)84 #print(response_dic)
85
86 intent_code = response_dic['intent']['code']87 results_text = response_dic['results'][0]['values']['text']88 print("AI说:" +results_text)89 du_say(results_text)90 play_mp3('robot.mp3')91 #文字转语音
92 defdu_say(results_text):93 #per 3是汉子 4是妹子,spd 是语速,vol 是音量
94 result = client.synthesis(results_text, 'zh', 1, {95 'vol': 5, 'per': 4, 'spd': 4
96 })97 #识别正确返回语音二进制 错误则返回dict 参照下面错误码
98 if notisinstance(result, dict):99 with open('robot.mp3', 'wb') as f:100 f.write(result)101
102 #播放Mp3文件
103 defplay_mp3(file):104 pygame.mixer.init()105 pygame.mixer.music.load(file)106 pygame.mixer.music.play()107 whilepygame.mixer.music.get_busy():108 time.sleep(1)109 pygame.mixer.music.stop()110 pygame.mixer.quit()111
112 if __name__ == '__main__':113 whileTrue:114 rec()115 listen()
总结:
这里只是简单的实现了自己提出的功能,还有可以完善的地方,比如语音唤醒,还有语音输入是空白的时候,自动处理,而不是程序异常结束。