用python3實現簡單的語音識別轉化成文字

我目前是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,做這個純屬娛樂和興趣使然,當然了,也在裏面學到不少知識,可以搞好多有趣的東西,比如:在羣聊中怎麼判斷是不是自己發的消息?怎麼定時羣發好友或者羣?怎麼給他/她每天定時發一些膩歪的話?怎麼防止朋友撤回消息。。。等等

如果有不準確的地方,還希望大家多多指教批評!

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章