八股文练习对话辅助器(简易版)
一、概述
在专业面试的时候经常会有人(比如说我自己=_=)八股文(知识点)理解的很好,且在平时中也能够比较清晰的讲述出来。但是到了面试的时候,在面试官的注视下,经常会因为紧张啥的造成忘词,头脑一片空白的情况,最终导致了面试的体验不是很好。因此,基于这种问题的考虑,我就在想,能不能自己整一个虚拟的面试官来模拟面试,减少面试紧张等情况的出现。当然了,目前是有类似的公司来专门做AI面试的开发的,但是那得花钱啊,对于我们这群囊中羞涩的年轻人来说性价比确实不是太高。因此,我打算自己试试看能不能实现一个简易的辅助器,来帮助我们熟悉专业面试,提高offer获取的概率(当然了,由于本人水平有限,这个简易版本的辅助器不一定好用,也不一定适合每个人,如果各位大佬有更好的想法或实现,可以提出来,大家可以共同探讨一下,以使得更好的帮助到每个人)。
二、相关配置
代码由python语音进行编写,目前在win10下可以运行通过 具体的运行环境如下:
python 3.6.2 pyaudio 0.2.11 speechrecognition 3.8.1
整个 “八股文练习对话辅助器” 的目录文件如下: 其中, itemBank是存放的检索库,其每个子文件代表一类的知识点,比如说 ‘computer_Network’ 则代表计算机网络的知识
三、方法实现
整个 “八股文练习对话辅助器” 的实现流程如下所示:
我们可以从流程图中看到,对于整个 “八股文练习对话辅助器”,我们可以简单的将其分为三类操作:
① 用户叙述问题; ② 计算机根据用户的讲述的内容选择相应的题库,并选出题目; ③ 通过将检索到的问题题目进行语音播报。
其中,为了能够花最少的时间来实现大致的效果,我们简化了部分模块的设计。对于语音识别,我们采用了百度AI的语音识别来理解用户的问题(这一部分如果写深了算是一个比较大的部分了,由于个人水平有限,就不自己重头写了);而对于题库以及问题检索,我取了个巧,直接将题库整理到 .txt 的文件下(当然了,我因为时间不是很充裕,就没整理相关的题库了),然后随机从题库中随机抽题来对用户进行提问。
四、实现效果
Note:可能因为我是拿着手机录的屏,手机麦克风离我太近了,导致我的声音远大于电脑声音,建议各位自我调节合适的音量食用
五、可扩展性探讨
1.整体的框架可以更换下,现在的框架太简单了 2.用户讲述时语音识别的等待机制还需要优化 3.语音识别以及AI的可训练性还有优化的空间(需要的相关知识较多,不建议轻易触碰) 4.问题的检索可以改进下,或许可以加入爬虫全网检索。同时,我们也可以加入问题答案这个选项,使大家不需要再去书中或网上找问题的答案 5.系统语音的播报太刻板了,可以考虑更换下声线,使得我们在背书的时候心情愉悦 6.可以考虑设计个合适的UI界面,模拟面试官的形象轮廓,以提高身临其境的感受
六、实现代码
Github: https://github.com/DeepVegChicken/Learning-InterviewPractice_AIDS
import os
import time
import random
import winsound
import win32com.client
from aip import AipSpeech
import speech_recognition as sr
BAIDU_APP_ID = 'https://openapi.baidu.com/oauth/2.0/token?'
BAIDU_API_KEY = 'vyYLov63W6x33nIPvwVdLLsX'
BAIDU_SECRET_KEY = 'EzgQoFF9xp62SeGCXCBaD8FjWNxvl9kZ'
API_Input_Speech = AipSpeech(BAIDU_APP_ID, BAIDU_API_KEY, BAIDU_SECRET_KEY)
API_Output_Speech = win32com.client.Dispatch("SAPI.SPVOICE")
fileLoc_CN = "itemBank/computer_Network/items.txt"
fileLoc_DS = "itemBank/data_Structure/items.txt"
fileLoc_DB = "itemBank/dataBase/items.txt"
fileLoc_LI = "itemBank/language_Infrastructure/c++.txt"
fileLoc_OS = "itemBank/operating_System/items.txt"
def textToVoice(text_data):
API_Output_Speech.Speak(text_data)
winsound.PlaySound(text_data, winsound.SND_ASYNC)
def voiceToText(audio_data):
result = API_Input_Speech.asr(audio_data, 'wav', 16000, {'dev_pid': 1536})
try:
text = result['result'][0]
except Exception as e:
print(e)
text = ""
return text
def get_Message():
r = sr.Recognizer()
mic = sr.Microphone(sample_rate=16000)
print("开始")
with mic as source:
r.adjust_for_ambient_noise(source)
audio = r.listen(source)
audio_data = audio.get_wav_data()
return voiceToText(audio_data)
def language_Infrastructure():
with open(fileLoc_LI, mode='r', encoding='utf-8') as f:
itemLines = f.read().splitlines()
text = ""
textToVoice("开始")
while True:
message = get_Message()
if message == "返回主菜单":
break
elif message == "下一题":
text = random.choice(itemLines)
textToVoice(text)
elif message == "再说一遍题目":
textToVoice(text)
else:
textToVoice("听不清,请再说一遍吧")
def data_Structure():
with open(fileLoc_DS, mode='r', encoding='utf-8') as f:
itemLines = f.read().splitlines()
text = ""
textToVoice("开始")
while True:
message = get_Message()
if message == "返回主菜单":
break
elif message == "下一题":
text = random.choice(itemLines)
textToVoice(text)
elif message == "再说一遍题目":
textToVoice(text)
else:
textToVoice("听不清,请再说一遍吧")
def operating_System():
with open(fileLoc_OS, mode='r', encoding='utf-8') as f:
itemLines = f.read().splitlines()
text = ""
textToVoice("开始")
while True:
message = get_Message()
if message == "返回主菜单":
break
elif message == "下一题":
text = random.choice(itemLines)
textToVoice(text)
elif message == "再说一遍题目":
textToVoice(text)
else:
textToVoice("听不清,请再说一遍吧")
def computer_Network():
with open(fileLoc_CN, mode='r', encoding='utf-8') as f:
itemLines = f.read().splitlines()
text = ""
textToVoice("开始")
while True:
message = get_Message()
if message == "返回主菜单":
break
elif message == "下一题":
text = random.choice(itemLines)
textToVoice(text)
elif message == "再说一遍题目":
textToVoice(text)
else:
textToVoice("听不清,请再说一遍吧")
def dataBase():
with open(fileLoc_DB, mode='r', encoding='utf-8') as f:
itemLines = f.read().splitlines()
text = ""
textToVoice("开始")
while True:
message = get_Message()
if message == "返回主菜单":
break
elif message == "下一题":
text = random.choice(itemLines)
textToVoice(text)
elif message == "再说一遍题目":
textToVoice(text)
else:
textToVoice("听不清,请再说一遍吧")
def main():
while True:
textToVoice("请选择你要学习的内容")
print("\n请选择你要学习的内容")
select_itemBank = get_Message()
os.system("cls")
if select_itemBank == "关机":
break
elif select_itemBank == "语法基础":
textToVoice("已成功进入语法基础的学习")
language_Infrastructure()
elif select_itemBank == "数据结构":
textToVoice("已成功进入数据结构的学习")
data_Structure()
elif select_itemBank == "操作系统":
textToVoice("已成功进入操作系统的学习")
operating_System()
elif select_itemBank == "计算机网络":
textToVoice("已成功进入计算机网络的学习")
computer_Network()
elif select_itemBank == "数据库":
textToVoice("已成功进入数据库的学习")
dataBase()
else:
textToVoice("听不清,请再说一遍吧")
if __name__ == '__main__':
main()
textToVoice("已成功关机")
|