自己對python感興趣,利用業餘時間弄了個自動回複微信消息的小機器人,純屬自己瞎玩,給大家介紹一下,有想自己弄着玩的可以做個參考,項目位址:https://github.com/shiyusong39/WeChatSimpleRobot
以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複制到你想放的地方,然後再代碼中引用一下就可以了,windows平台可以,不止linux是否可以)先下類庫:
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.語音轉文字
将微信語音檔案轉化完格式後,就可以進行語音識别了,在這先提前說下,谷歌的識别十分慢,具體原因咱也不知道,國内像百度、訊飛、微信也有語音識别的開放平台API,如果覺得慢,也可以考慮使用國内的,不管使用哪種語音識别,這個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,做這個純屬娛樂和興趣使然,當然了,也在裡面學到不少知識,可以搞好多有趣的東西,比如:在群聊中怎麼判斷是不是自己發的消息?怎麼定時群發好友或者群?怎麼給他/她每天定時發一些膩歪的話?怎麼防止朋友撤回消息。。。等等
如果有不準确的地方,還希望大家多多指教批評!
2020.04.29補充:
有朋友回報說不能使用了,我測試了一下,是谷歌的語音翻譯API被牆了,我挂上VPN之後可以使用的,我把這個demo簡化了一下,代碼已經更新到github上了,如果沒有vpn,大家可以使用國内的百度語音翻譯、騰訊語音翻譯以及科大訊飛語音翻譯,隻不過這些有免費次數超過之後要收費,如果有問題大家多多交流~謝謝大家的支援!