智能产品综合开发 - 智能家居(智能语音机器人)
1 实训选题目的
本次实训选择的题目是“智能家居”,旨在为人们提供高效,便利的居住环境,摆脱以往必须手动操作的麻烦,通过语音就能达到控制相关设备的目的,智能语音对话:通过语音和机器人对话,询问想要知道的相关信息,节省自己手动搜索的时通过本项目,我们将能够将所学的人工智能专业知识进行综合应用,包括但不限于Linux操作系统、Python程序设计、人工智能数据处理、机器学习技术及应用、计算机视觉技术、响应式网页设计、创新创业教育、数据库基础、软件工程和人工智能产品开发等。本项目要求小组成员能够灵活运用这些知识,开发出具有一定创新性和实用价值的人工智能产品,以解决实际生活中的温湿度监测需求,提高生活质量和环境舒适度。
2 实训任务目的
通过本次“智能家居”的实训任务,目的是使团队成员掌握树莓派硬件的基本组成,并能够完成树莓派硬件的搭建、新版64位桌面版系统的烧录安装以及SSH、VNC、用户密码等基础配置。这些步骤将为团队成员提供远程控制树莓派的能力,为后续的温湿度检测系统开发打下坚实的基础。此外,本任务还将帮助团队成员熟悉树莓派的操作系统环境,确保在后续的开发过程中能够有效地进行编程和调试,实现智能家居的各项功能,包括数据采集、处理、存储和可视化展示。通过本实训,学生将学会如何将理论知识应用于实际问题,提高解决实际问题的能力,并增强团队合作和项目管理的技能。
3 实训介绍
(一)必备功能说明:
1.树莓派主板作为系统的控制中心:
树莓派负责接收来自传感器和麦克风的输入信号,处理后输出合成语音、报警信号或设备控制指令,是整个智能家居系统的核心。
2.温湿度检测功能:
温湿度传感器实时检测环境的温度和湿度,并通过数字接口传输数据。树莓派接收到数据后处理并分析,为后续设备联动提供支持。
3.天气播报功能:
用户通过语音指令查询天气(如“今天的天气怎么样”)。树莓派调用高德天气API获取实时天气信息,并通过百度AI语音合成API生成语音播报内容,例如:“今天晴,气温25到30摄氏度,空气质量优良。”
4.音乐播放功能:
用户可通过语音指令(如“播放音乐”或“播放指定歌曲”)控制音乐播放。树莓派解析语音指令后,从本地音乐库或在线音乐平台匹配对应的歌曲,通过扬声器输出音频。
5.语音聊天功能:
系统通过麦克风接收用户语音输入,将其转换为文本后传递至百度聊天AI接口,解析用户输入并生成相应回复。回复内容通过百度AI语音合成模块转化为语音播报,实现自然人机对话。
6.拍照功能:
用户通过语音指令(如“拍照”)触发系统操作,树莓派控制摄像头进行拍照,并将捕捉到的图像保存至本地或上传至指定设备。
7.智能灯光控制功能:
用户通过语音指令控制灯光(如“开灯”或“关灯”)。树莓派通过GPIO接口发送信号控制智能灯的开关,实现灯光自动化管理。
8.湿度播报功能:
系统根据温湿度传感器数据实时播报湿度信息。树莓派将传感器数据处理后,通过百度AI语音合成模块生成语音播报内容(如“当前湿度为60%,请注意通风”)。
通过本次实训,我们的目标是开发一个功能齐全、用户友好且具有一定智能的智能家居系统,以提高用户对环境舒适度的控制能力,并为环境监测提供科学依据。
4 实训组件
- 树莓派主板1块
- 树莓派电源适配器1个
- 40P软排线1根
- 温湿度传感器1个
- 面包板1个
- 跳线若干
- 电阻若干(用于温湿度传感器电流限制)
- 杜邦线若干(用于连接面包板上的组件)
- 显示器1个
- SD卡1张
- 网络线1根
- 外壳和保护套1个
- 麦克风
- 扬声器
5 实训原理
以下是智能家居的核心工作原理:
- 树莓派主板作为系统的控制中心:
树莓派负责处理来自传感器的输入信号和麦克风的语音信号,并输出合成语音、报警信号或设备控制指令,构建智能家居系统的核心逻辑。 - 温湿度传感器检测功能:
温湿度传感器用于实时检测周围环境的温度和湿度,通过数字接口将数据发送给树莓派,供后续计算和设备联动使用。 - 天气播报功能:
用户通过语音指令(如“今天天气怎么样”)查询天气,树莓派调用高德地图API获取实时天气数据,包括气温、湿度、风速等信息。随后,系统利用百度AI语音合成API将天气信息生成自然流畅的语音,通过扬声器向用户播报。例如:“今天晴,气温25到30摄氏度,空气质量良好。” - 音乐播放功能:
用户通过麦克风输入语音指令(如“播放音乐”或“播放周杰伦的歌”),树莓派调用百度AI语音识别API将语音转换为文本,并解析用户意图。接着,系统匹配本地或在线音乐库的音乐资源,通过扬声器播放对应歌曲。 - 语音聊天功能:
用户通过麦克风输入语音内容,树莓派调用百度AI语音识别API将语音转换为文本,并通过百度聊天AI接口生成相应的回复文本。随后,系统调用百度AI语音合成API将回复内容转换为语音,通过扬声器实现自然语音交互。 - 拍照功能:
用户通过语音指令(如“拍照”)触发拍照功能,树莓派控制摄像头拍摄图像,并将拍摄的图片保存至本地存储或上传至用户指定设备。 - 灯光控制功能:
用户通过语音指令(如“开灯”或“关灯”),树莓派解析指令后,通过GPIO接口控制灯光设备的开关状态,实现灯光的智能化管理。 - 湿度播报功能:
系统根据温湿度传感器的数据实时分析环境湿度,并调用百度AI语音合成API将湿度信息生成语音播报内容,例如:“当前湿度为60%,建议开启加湿器。”
6 最终代码展示
dht_speak.py:
import RPi.GPIO as GPIO
import time
from aip import AipSpeech
import my_baidu_voice as myVoice
import requests
import os
import sys
def init():
GPIO.setmode(GPIO.BOARD)
time.sleep(1)
def get_readings(ch):
data=[]
j = 0
b = True
out =ch
dataArr =[]
GPIO.setup(out, GPIO.OUT)
GPIO.output(out,GPIO.HIGH)
GPIO.output(out,GPIO.LOW)
time.sleep(0.019)
print('test2')
GPIO.output(out,GPIO.HIGH)
GPIO.setup(out,GPIO.IN,pull_up_down=GPIO.PUD_UP)
for i in range(0,10000):
info = GPIO.input(11)
dataArr.append(info)
print(dataArr)
signArr = []
countArr = []
nowItem = 0
nextItem = 0
dataArrlen = len(dataArr)
count = 0
for i in range(dataArrlen):
nextIndex = i+1
if i < dataArrlen and nextIndex < dataArrlen :
nowItem = dataArr[i]
nextItem = dataArr[i+1]
if nowItem == nextItem:
count += 1
else:
if nowItem == 1:
signArr.append(nowItem)
countArr.append(count)
count =0
print(signArr)
print(countArr)
for index in range(len(countArr)):
item = countArr[index]
if index >0:
if item < 50:
data.append(0)
else:
data.append(1)
index += 1
#print(data)
return data
def data_check(data):
#print(data)
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7-i)
humidity_point += humidity_point_bit[i] * 2 ** (7-i)
temperature += temperature_bit[i] * 2 ** (7-i)
temperature_point += temperature_point_bit[i] * 2 **(7-i)
check += check_bit[i]* 2 ** (7-i)
return [humidity , humidity_point , temperature , temperature_point,check]
def loopDHT():
init()
while True:
data = get_readings(11)
humidity,humidity_point,temperature,temperature_point,check = data_check(data)
sumData = humidity + humidity_point + temperature + temperature_point
if check == sumData:
T_value = str(temperature) + "." + str(temperature_point)
H_value = str(humidity) + "." + str(humidity_point)
print("temperature:",T_value,"*C, humidity:", H_value,"%")
string = "今天是2023年10月29日,我是Bowen,为你播报当前的温湿度。当前温度是:" + T_value + "度, 湿度是百分之:" + H_value + "。下课的时候,记得还原多媒体教室,鼠标,键盘,显示器,显示器连接线要插好"
print(string)
myVoice.reply(string)
break
if __name__ == "__main__":
init()
while True:
data = get_readings(11)
humidity,humidity_point,temperature,temperature_point,check = data_check(data)
sumData = humidity + humidity_point + temperature + temperature_point
if check == sumData:
T_value = str(temperature) + "." + str(temperature_point)
H_value = str(humidity) + "." + str(humidity_point)
print("temperature:",T_value,"*C, humidity:", H_value,"%")
string = "今天是2023年10月29日,我是Bowen,为你播报当前的温湿度。当前温度是:" + T_value + "度, 湿度是百分之:" + H_value + "。下课的时候,记得还原多媒体教室,鼠标,键盘,显示器,显示器连接线要插好"
print(string)
myVoice.reply(string)
break
light.py:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(11,GPIO.OUT)
# TEST
def ligtNo(pin):
GPIO.output(pin,1)
def ligtOFF(pin):
GPIO.output(pin,0)
if __name__=="__main__":
ligtOFF(11)
musicPlayer.py:
import os,sys,time
import requests,json
import my_baidu_voice as myVoice
def playmusic():
myVoice.reply('主人,您想听哪首歌曲')
myVoice.toPCM()
song_name=myVoice.getVoice()[:-1]
url = 'http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s='+song_name+'&type=1&offset=0&total=true&limit=10' #%song_name
print(url)
res = requests.get(url)
music_json = json.loads(res.text)
if(music_json["result"]["songCount"]!=0):
songid = music_json["result"]["songs"][0]["id"]
#
url ='http://music.163.com/song/media/outer/url?id=%s.mp3'%songid
myVoice.reply('马上播放歌曲%s'%song_name)
os.system('mplayer %s'%url)
else:
print("没有找到你想听的歌曲,将为您播放本地音乐")
localmusic()
if __name__ =="__main__":
playmusic()
my_baidu_voice.py:
import os,sys,time
from aip import AipSpeech
# ******baidu voice
APP_ID = "41177555"
API_KEY = "TgtSMBTeatDnfqP88f1eIrd0"
SECRET_KEY = "72lRjlCFQ9rWzLR7WDL9Qz2MhEjpI2CM"
client = AipSpeech(APP_ID,API_KEY,SECRET_KEY)
def toPCM():
print('toPCM--------')
# record 3s voice 16K
os.system('arecord -d 3 -r 16000 -c 1 -t wav -f S16_LE audio.wav')
# change wav to pcm
os.system('ffmpeg -y -i audio.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 audio.pcm')
# get local voice file
def get_file_content(filePath):
with open(filePath,'rb') as fp:
return fp.read()
def reply(body):
result = client.synthesis(body,'zh','1',{'vol':10,'spd':5})
if not isinstance(result,dict):
with open('replay.mp3','wb') as f:
f.write(result)
os.system('mplayer replay.mp3')
# get voice to txt
def getVoice():
if os.path.exists('audio.pcm'):
# upload audio.pcm
results =client.asr(get_file_content('audio.pcm'),'pcm',16000,{
'dev_pid':1537,
})
voice = results['result'][0]
print(voice)
return voice
myCamera.py:
import os,sys,time
import cv2
import requests,json
import my_baidu_voice as myVoice
def camera():
count_down =3
#path = os.path.expanduser('~/pictures')
#curtime = time.strftime('%Y-%m-%d-%H:%M:%S',time.localtime(time.time()))
#file = os.path.join(path,"%s.jpg"% curtime)
file = "nowPic.jpg"
say = "收到,%d 秒后启动拍照"%count_down
myVoice.reply(say)
txt = 'raspistill '+'-o '+file +' -t '+str(count_down * 1000) + ' -w 640 -h 480'
os.system(txt)
nowPic= cv2.imread("nowPic.jpg")
cv2.imshow('nowPic',nowPic)
k = cv2.waitKey(0)
if k==27:
cv2.destroyAllWindows()
if __name__=="__main__":
camera()
robotchat.py:
import os,sys,time
import requests,json
import my_baidu_voice as myVoice
def robotchat():
myVoice.reply('主人,您想聊点什么...')
while True:
myVoice.toPCM()
msg = myVoice.getVoice()[:-1]
url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg='+msg
html=requests.get(url)
content = html.json()["content"].replace('{br}','')
myVoice.reply(content)
if(msg == '不聊了'):
break
if __name__ =="__main__":
robotchat()
smart-home.py:
import os,sys,time
import speech_recognition as sr
import my_baidu_voice as myVoice
import musicPlayer as myMusicPlayer
import voice_weather_simple as myWeather
import robotchat as myRobotChat
import myCamera as myCamera
import dht_speak as myDht
import light as mylight
def recognize(rate=16000,lang="en-US"):
r= sr.Recognizer()
mic = sr.Microphone(sample_rate=rate)
while True:
with mic as source:
print(" waiting for calling")
audio = r.listen(source)
keyword = r.recognize_sphinx(audio,language=lang)
print(keyword)
if(keyword == "小溪"):
myVoice.reply("你好,我在...你要我做什么,请说")
xiaoxi()
time.sleep(0.3)
def xiaoxi():
myVoice.toPCM()
command = myVoice.getVoice()
print('---command',command)
if command.find('天气') !=-1:
myWeather.getweather()
if command.find('音乐') !=-1:
myMusicPlayer.playmusic()
if command.find('聊天') !=-1:
myRobotChat.robotchat()
if command.find('拍照') !=-1:
myCamera.camera()
if command.find('开灯') !=-1:
mylight.ligtNo(11)
myVoice.reply('ok')
if command.find('关灯') !=-1:
mylight.ligtOFF(11)
myVoice.reply('ok ')
if command.find('温湿度') !=-1:
myDht.loopDHT()
elif command ==u'再见':
myVoice.reply('再见,时刻等待你的召唤')
if __name__ == "__main__":
recognize()
#myCamera.camera()
smart-home2.py:
import requests,json
import my_baidu_voice as myVoice
def getweather():
myVoice.reply('主人,你是想查今天的天气,还是明天的天气,还是后天的天气?')
myVoice.toPCM()
reponseTime = myVoice.getVoice()
if (reponseTime.find('今天') !=-1):
url = 'https://restapi.amap.com/v3/weather/weatherInfo?city=500000&key=cceb4902d8051cab2943778e7fc3ba5f'
response = requests.get(url)
weather_dict = response.json()['lives'][0]
print(weather_dict)
weatherText = weather_dict['city']+weather_dict['weather']+ '今天,风向:'+weather_dict["winddirection"]+',风力:'+weather_dict["windpower"]+',温度:'+weather_dict["temperature_float"]+',湿度:'+weather_dict["humidity_float"]
myVoice.reply(weatherText)
if (reponseTime.find('明天') !=-1):
url = 'https://restapi.amap.com/v3/weather/weatherInfo?city=500000&key=cceb4902d8051cab2943778e7fc3ba5f&extensions=all'
response = requests.get(url)
weather_dict = response.json()['forecasts'][0]
casts_dict = weather_dict['casts'][1]
weatherText = weather_dict['city'] +'明天,'+ casts_dict['date']+',' +casts_dict['dayweather']+ ',风向:' +casts_dict["daywind"]+',风力:'+casts_dict["daypower"]+',温度:'+casts_dict["daytemp"]+'.'
myVoice.reply(weatherText)
if (reponseTime.find('后天') !=-1):
url = 'https://restapi.amap.com/v3/weather/weatherInfo?city=500000&key=cceb4902d8051cab2943778e7fc3ba5f&extensions=all'
response = requests.get(url)
weather_dict = response.json()['forecasts'][0]
casts_dict = weather_dict['casts'][2]
weatherText = weather_dict['city'] +'后天,'+ casts_dict['date']+',' +casts_dict['dayweather']+ ',风向:' +casts_dict["daywind"]+',风力:'+casts_dict["daypower"]+',温度:'+casts_dict["daytemp"]+'.'
myVoice.reply(weatherText)
if __name__ =="__main__":
getweather()
7 参考文献
[1] 戴礼荣,张仕良.深度语音信号与信息处理:研究进展与展望 [J].数据采集与处理,2014,29(02):171-179.
[2] 林枫亭,罗艺,孔凡立,等.一种基于云平台的智能机器人语音 交互系统设计[J].电子测试,2018(Z1):40-42.
[3] 杨国庆,黄锐,李健,等.智能服务机器人语音交互的设计与实 现[J].科技视界,2020(09):129-131.
[4] 秦伟.基于语音的人机交互平台的设计与实现[D].武汉:华中 科技大学,2019.
[5] Shenzhen Aukey Smart Information Technology Co., Ltd.. "AI Voice Interaction Method, Device And System" in Patent Application Approval Process (USPTO 20200105268)[J]. Telecommunications Weekly, 2020.
[6] YAO D, KATIE S T. Bridging the gap in mobile interaction design for children with disabilities: Perspectives from a pediatric speech language pathologist[J]. International Journal of Child Computer Interaction, 2020:23-24.
[7] 杨加平.面向指控系统的嵌入式语音交互技术设计与实现[J]. 机械与电子,2015(04):72-74.
[8] 廖彬全,罗佩,马远佳.基于智能语音交互系统的翻译机器人[J]. 信息与电脑(理论版),2019,31(17):110-112.
[9] 陈鑫源.智能语音交互技术及其标准化[J].电声技术,2018, 42(05):78-80.
[10] 郝欧亚,吴璇,刘荣凯.智能语音识别技术的发展现状与应用 前景[J].电声技术,2020,44(03):24-26
原文地址:https://blog.csdn.net/m0_64545019/article/details/144119678
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!