我目前是java開發,自己對python感興趣,利用業餘時間弄了個自動回覆微信消息的小機器人,純屬自己瞎玩,給大家介紹一下,有想自己弄着玩的可以做個參考。
以python3爲基礎語言,用到了 itchat +谷歌的語音識別+思知機器人API+pydub類庫。簡單說下:
1.itchat
他的開發者介紹說這是實現了一個僞web的微信,但不是微信官方推薦的,所以頻繁使用可能會被微信限制web端登陸,不影響手機和客戶端的登陸。基本web半微信實現的功能,itchat好像都能實現,直接上官網:https://itchat.readthedocs.io/zh/latest/
下面是我寫的python,請大家忽略命名和格式,一時之間從java那邊轉換不過來,還不習慣~,對了先下包:
我用的PyCharm,而且已經安裝了pip,所以我直接就:pip install itchat 執行命令就哦了,然後再代碼中引入就可以了:
import itchat from itchat.content import * import time
#微信熱啓動 itchat.auto_login(hotReload=True) itchat.run()
##個人聊天 #文本信息 @itchat.msg_register([itchat.content.TEXT,itchat.content.RECORDING],isFriendChat=True) def private_text_chat(private_msg): # filehelper 是文件傳輸助手,我是爲了測試用的 if private_msg['ToUserName'] == 'filehelper' : #獲取好友暱稱 nick_name = '自己' from_user_name = 'filehelper' else: nick_name = private_msg['User']['NickName'] from_user_name = private_msg['FromUserName'] msg = private_msg['Text'] print(nick_name +":"+msg) #請求機器人 replymsg = SiZhiRobot.sizhi_msg(msg) #返回消息 itchat.send(msg = replymsg, toUserName = from_user_name) 回覆羣消息和羣發的方法我就不在這裏展示了,都比較簡單,大家看看官方api就能明白。
2.思知機器人
十分的感謝開源的大佬們!!,一開始我使用的是圖靈機器人,但是那個需要真人認證,比較麻煩,而且試用版只能創建五個機器人,每個機器人每天有100次還是多少次的使用次數記不太清了。然後我同事幫我找打了思知機器人,目前來說,響應速度快,調用簡單回覆消息結構也簡單,只是有的時候回答的不是很準確,但是自己玩也可以了(畢竟我剛弄完這個機器人那陣,我同事能跟它玩一下午-_-!),申請沒那麼多要求,附上官網:https://www.ownthink.com/,上代碼:
import json import requests #思知機器人API def get_sizhi_response(msg): apiUrl = 'https://api.ownthink.com/bot' apiKey = 'xxxxxxxxxx'#這裏填寫你自己申請的機器人apiKey data = { "spoken": msg, "appid": apiKey, "userid": 'fireworks'#隨便起的 } # 必須是json headers = {'content-type': 'application/json'} try: req = requests.post(apiUrl, headers = headers, data = json.dumps(data)) return req.json() except: return #處理思知機器人返回的json消息 def sizhi_msg(msg): #設置一個默認回覆。 return_msg = '我是個笨笨的機器人,我CPU好像掛了~_~![自動回覆]' replyjson = get_sizhi_response(msg) if replyjson['message'] == 'success': return_msg = replyjson['data']['info']['text'].replace('小思','倫家~').replace('思知機器人','倫家~'); print("思知機器人自動回覆:"+return_msg) # a or b --》 如果a不爲空就返回a,否則返回b return return_msg
3.微信語音消息的保存及格式的轉變
在微信返回的消息中,語音消息的類型是43,而且保存到本地是mp3的格式(我不清楚是否可以指定保存格式,按照itchat的文檔介紹保存到本地是mp3格式);MP3的音頻文件不能直接用谷歌的語音識別去識別,可以看下這篇文章(https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/79832700)這裏面介紹了有關音頻的一些理論知識,什麼頻率赫茲啥的,包括谷歌語音識別接口的使用;所以,在識別語音之前,我們要先對保存到本地的語音消息轉化格式,這裏呢我用到了pydub的ffmpeg和ffprobe(https://ffmpeg.zeranoe.com/builds/下載完解壓,ffmpeg.exe和ffprobe.exe複製到你想放的地方,然後再代碼中引用一下就哦了),先下類庫:
pip install pydub
pip install os
再看代碼:
from pydub import AudioSegment import os from os import path # os.getcwd() 是獲取當前路徑,這裏可以寫絕對路徑 AudioSegment.ffmpeg = os.getcwd()+'\\ffmpeg.exe' AudioSegment.ffprobe = os.getcwd()+'\\ffprobe.exe' def dealMp3(filePath,fileName): sound = AudioSegment.from_mp3(filePath) #獲取原始pcm數據 data=sound._data sound_wav = AudioSegment( #指定原始pcm文件 # raw audio data (bytes) data = data, #指定採樣深度,可選值1,2,3,4 # 2 byte (16 bit) samples sample_width = 2, #指定採樣頻率 # 44.1 kHz frame rate # 16kHz frame rate frame_rate = 16000, #指定聲道數量 # stereo or mono channels = 1 ) #導出wav文件到當前目錄下 sound_wav.export(fileName,format='wav') # 判斷生成wav格式的文件成功沒 isDeal = os.path.exists(os.getcwd()+'\\'+fileName) #如果wav文件生成了就刪除mp3文件 - -這個可以不參考 if isDeal: #刪除mp3文件 os.remove(filePath) return isDeal
4.語音轉文字
將微信語音文件轉化完格式後,就可以進行語音識別了,在這先提前說下,谷歌的識別十分慢,具體原因咱也不知道,國內像百度也有語音識別的開放平臺,訊飛不清楚又沒有,如果覺得慢,也可以考慮使用國內的,不管使用哪種語音識別,這個mp3轉wav都會用到,不能直接對mp3類型的文件進行識別。下載類庫:
pip install SpeechRecognition
代碼:
import speech_recognition as sr
#語音轉文字 def voice2Text(file_name): voice_file = path.join(path.dirname(path.realpath(__file__)), file_name) # use the audio file as the audio source r = sr.Recognizer() with sr.AudioFile(voice_file) as source: audio = r.record(source) try: content = r.recognize_google(audio, language='zh-CN') # print("Google Speech Recognition:" + content) except sr.UnknownValueError: print("Google Speech Recognition could not understand audio") except sr.RequestError as e: print("Google Speech Recognition error; {0}".format(e)) return content or '無法翻譯'
這個就是轉文字的代碼,這只是其中一種方法,其他更多的demo可以去看https://github.com/Uberi/speech_recognition/blob/master/examples/audio_transcribe.py,這裏面需要注意的是,首先要設定一下content = r.recognize_google(audio, language='zh-CN')的language,因爲他默認是英語~,zh-CN將我們的音頻轉化成簡體中文;在一個就是audio這個參數,谷歌api說他的翻譯只接受SpeechRecognition類型的,所以
with sr.AudioFile(voice_file) as source:
audio = r.record(source)
這個是讀取到我們的wav音頻文件然後調用record方法將內容處理後輸出到audio這個參數中。OK了,基本上沒啥問題了,可以測試了,我的基本流程就是登錄微信,然後自己發語音給文件傳輸助手,然後python處理語音轉化成文字,再去請求機器人,回覆給我消息。
測試結果:
成功了!這個其實沒有什麼特別高的技術含量,就是整合各種第三方類庫和api,做這個純屬娛樂和興趣使然,當然了,也在裏面學到不少知識,可以搞好多有趣的東西,比如:在羣聊中怎麼判斷是不是自己發的消息?怎麼定時羣發好友或者羣?怎麼給他/她每天定時發一些膩歪的話?怎麼防止朋友撤回消息。。。等等
如果有不準確的地方,還希望大家多多指教批評!