1.语音识别
这里用到了百度api的语音识别,目前开源的语音识别成文字的效果都很差,百度api的语音识别效果还可以。
2.机器人对话,这里用到了青云客机器人对话,通过爬虫获取对话的内容,机器人对话效果一般,没有图灵机器人灵活,但是目前免费,这个是很好的优点。
3.文字播报
文字转成mp3格式的音频保存,然后使用pygame播放出保存的mp3格式的语音
4.完整代码呈现
from aip import AipSpeech
import pyaudio
import pygame
import ffmpy
import time
import wave
import os
import requests
import json
import pyttsx3
# BaiduAPI
APP_ID = '你的id'
API_KEY = '你的key'
SECRET_KEY = '你的SECRET_KEY'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
e = pyttsx3.init()
e.runAndWait()
while True:
# 语音识别
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2
WAVE_OUTPUT_FILENAME = "input.wav"
try:
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
except:
print("请插上录音设备!!!")
exit()
print("开始录音,请说话......")
time.sleep(1)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("AI:让我听听你在说什么.....")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
# FFmpeg调用
ff = ffmpy.FFmpeg(
executable='F:\\ffmpeg\\bin\\ffmpeg.exe', # 不同电脑路径需要修改
inputs={'input.wav': None},
outputs={'output.pcm': '-f s16le -ar 16000 -ac 1 -acodec pcm_s16le -y'}
)
ff.run()
# 创建函数 读取文件
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
# 删除.wav文件
path = 'input.wav'
if os.path.exists(path):
os.remove(path)
# 识别本地文件 语音转文字
result_dict = client.asr(get_file_content('output.pcm'), 'pcm', 16000, {
'dev_pid': 1537,
})
result_list = result_dict['result']
user_PO = result_list[0] # 转换后的字符串存入PO
print("你说: %s" % user_PO)
a = user_PO
if "再见。" in a:
e.say("再见")
e.runAndWait()
print("再见")
exit()
else:
r = requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg=' + a)
v = json.loads(r.content)
user_P1 = v['content']
print("菲菲:" + v['content'])
# AI回答转语音
# e.say(user_P1)
result = client.synthesis(user_P1, 'zh', 1, {
'vol': 5, 'per': 4
})
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
# 自定义函数,用于播放mp3音频
def play_mp3(file):
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(1)
pygame.mixer.music.stop()
pygame.mixer.quit()
play_mp3('audio.mp3')
e.runAndWait()