本文目錄一覽:
如何優雅的用Python玩轉語音聊天機器人
所需硬件:
樹莓派B+
人體紅外線感應模塊
內置麥克風攝像頭(實測樹莓派免驅淘寶鏈接)
申請API:
百度語音api
圖靈api
語音聊天機器人實現原理:當有人來到跟前時–》觸發聊天功能,開始以每2s檢測錄製語音–》通過百度語音api合成文字–》傳遞給圖靈api返回回答信息–》通過百度語音合成播放
【人體感應識別部分Python代碼renti.py】
123456789101112131415161718192021222324252627282930313233
#/usr/bin/python#coding:utf-8import RPi.GPIO as GPIOimport timeimport osimport signalimport atexitGPIO.setmode(GPIO.BCM) GPIO_PIR = 14 GPIO.setup(GPIO_PIR,GPIO.IN) # Echojing = 0dong = 0 sum = 0sum1 = 0oldren = 0sleep = 0def ganying(): i = 0 ok = 0 error = 0 while i 10: if GPIO.input(GPIO_PIR) == 1 : ok = ok + 1 if GPIO.input(GPIO_PIR) == 0 : error = error + 1 time.sleep(0.01) i = i + 1 ren = ok/(error+1) return ren
1
GPIO_PIR = 14
為 紅外線檢測模塊與樹莓派的針腳,腳本函數返回0表示無人,0 為有人
【Python語音識別聊天部分robot.py】
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
#/usr/bin/python# -*- coding:utf-8 -*-import sysreload(sys)sys.setdefaultencoding( “utf-8″ )import urllibimport urllib2import jsonimport uuidimport base64import osimport timefrom renti import * #獲取百度tokenappid=7647466apikey=”百度API”secretkey=”百度API” baidu_url=”h.com/oauth/2.0/token?grant_type=client_credentialsclient_id=” + apikey + “client_secret=” + secretkey; y_post=urllib2.urlopen(baidu_url)y_read=y_post.read()y_token=json.loads(y_read)[‘access_token’]#print y_read#print y_token #——————function————- def luyin(): os.system(‘arecord -D plughw:1,0 -c 1 -d 2 1.wav -r 8000 -f S16_LE 2/dev/null’) def fanyi():
#—————語音識別部分 mac_address=”haogeoyes” with open(“1.wav”,’rb’) as f: s_file = f.read() speech_base64=base64.b64encode(s_file).decode(‘utf-8’) speech_length=len(s_file) data_dict = {‘format’:’wav’, ‘rate’:8000, ‘channel’:1, ‘cuid’:mac_address, ‘token’:y_token, ‘lan’:’zh’, ‘speech’:speech_base64, ‘len’:speech_length} json_data = json.dumps(data_dict).encode(‘utf-8’) json_length = len(json_data) asr_server = ‘m/server_api’ request = urllib2.Request(url=asr_server) request.add_header(“Content-Type”, “application/json”) request.add_header(“Content-Length”, json_length) fs = urllib2.urlopen(url=request, data=json_data) result_str = fs.read().decode(‘utf-8’) json_resp = json.loads(result_str) if json_resp.has_key(‘result’): out_txt=json_resp[‘result’][0] else: out_txt=”Null” return out_txt def tuling(b): f=urllib.urlopen(“23.com/openapi/api?key=”此處為圖靈API”info=%s” % b) f=json.loads(f.read())[‘text’] return f def hecheng(text,y_token): #text=”你好我是機器人牛牛很高興能夠認識你” geturl=”u.com/text2audio?tex=”+text+”lan=zhper=1pit=9spd=6cuid=CCyo6UGf16ggKZGwGpQYL9Gxctp=1tok=”+y_token return os.system(‘omxplayer “%s” /dev/null 21 ‘%(geturl)) #return os.system(‘omxplayer “%s” /dev/null 21 ‘%(geturl)) def nowtime(): return time.strftime(‘%Y-%m-%d %H:%M:%S ‘) #—————main—————–num=0 #num用來判斷是第一次說話,還是在對話過程中first=1 #判斷是不是第一說話 當1000次沒有人動認為是第一次while True: if ganying()!=0: run=open(‘run.log’,’a’) if first==0: hecheng(“你好,我是牛牛機器人,你可以和我聊天,不過說話的時候你必須靠近話筒近一點,”,y_token) hecheng(“說點什麼吧,2秒鐘內說完哦.”,y_token) first=1 #為1一段時間就不執行 num=0 #從新計數 #print ganying() run.write(nowtime()+”說點神馬吧………..”+’\n’) print nowtime()+”說點神馬吧……….” luyin() #開始錄音 out=fanyi().encode(“utf-8”) #翻譯文字 run.write(nowtime()+”我說:”+out+’\n’) print nowtime()+”我說:”+out if out == “Null”: text=”沒有聽清楚你說什麼” os.system(‘omxplayer “shenme.wav” /dev/null 21 ‘) else: text=tuling(out) hecheng(text,y_token) print nowtime()+”牛牛:”+text run.write(nowtime()+”牛牛:”+text+’\n’) run.close() else: #print ganying() #調試查看是否為0有人沒人 #print num num=num+1 #num長時間增大說明沒有人在旁邊 if num 1000: first=0 #0表示第一次說話
萬事俱備 運行nohup python robot.py 哈哈就可以脫離屏幕開始愉快的語音聊天啦
下面看看聊天的日誌記錄吧
後續更新。。。。。。Python如何用語音優雅的控制小車
如何用c語言實現從現在到某天的倒計時
取得系統時間,用指定時間的年,月,日,時,分,秒,分別減去系統對應的位,所得時間換算成秒,然後就用秒錶的原理,每過一秒,把剩餘時間除以一年的秒數,餘數再除以一個月的秒數,以此類推,然後把它輸出到屏幕。
time_t tTime; //距1900年1月1日的秒數
char str[80];
struct tm* stTm; //時間結構,格式請見其它回答
time(timer);
stTm = localtime(tTime);
strftime(str,sizeof(str),”%Y%m%d”,stTm);//格式化時間
printf(str);//輸出
另外,格式化時間的格式說明如下,希望對你有幫助:
%a 星期幾的簡寫
%A 星期幾的全稱
%b 月分的簡寫
%B 月份的全稱
%c 標準的日期的時間串
%C 年份的後兩位數字
%d 十進制表示的每月的第幾天
%D 月/天/年
%e 在兩字符域中,十進制表示的每月的第幾天
%F 年-月-日
%g 年份的後兩位數字,使用基於周的年
%G 年分,使用基於周的年
%h 簡寫的月份名
%H 24小時制的小時
%I 12小時制的小時
%j 十進制表示的每年的第幾天
%m 十進制表示的月份
%M 十時製表示的分鐘數
%n 新行符
%p 本地的AM或PM的等價顯示
%r 12小時的時間
%R 顯示小時和分鐘:hh:mm
%S 十進制的秒數
%t 水平製表符
%T 顯示時分秒:hh:mm:ss
%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)
%U 第年的第幾周,把星期日做為第一天(值從0到53)
%V 每年的第幾周,使用基於周的年
%w 十進制表示的星期幾(值從0到6,星期天為0)
%W 每年的第幾周,把星期一做為第一天(值從0到53)
%x 標準的日期串
%X 標準的時間串
%y 不帶世紀的十進制年份(值從0到99)
%Y 帶世紀部分的十制年份
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。
%% 百分號
strftime() 和 strptime()
第一,如果有Fatal error: Call to undefined function strptime()這種報錯,那是因為你在windows環境下執行的代碼,strptime此函數未在 Windows 平台下實現;
第二,雖說strptime是解析由 strftime() 生成的日期/時間,但是返回的是數組,或者失敗時的false,返回的數組中其他的比較好理解,需要注意的是tm_year是自 1900 年起過計算的,tm_yday
表示本年自一月一日起過了多少天
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/310057.html