【项目背景】
本项目旨在将人工智能生成内容(AIGC)技术与行空板及北斗定位模块相结合,为自行车骑行者提供一种全新的体验。通过在自行车上安装GNSS北斗定位模块,我们能够实时采集骑行者的经纬度信息,这些信息将随着骑行者位置的变化而动态更新。结合讯飞星火认知大模型、高德开放平台API,我们可以将这些经纬度数据转换成具体的地理位置名称,并进一步生成关于当地的风土人情、历史故事、名胜古迹、传统美食等内容的文本描述。
在骑行过程中,随着位置的移动,系统将自动调用高德开放平台API,将实时更新的经纬度坐标转换为地理位置名称。然后,讯飞星火认知大模型将基于这些地理位置信息,生成详细的介绍文本,这些文本不仅包括当地的文化特色和历史背景,还可能涉及当地的美食推荐和名胜古迹介绍。例如,当骑行者经过河北省张家口市涿鹿县时,系统可能会介绍该地区的历史文化和自然景观,让骑行者在享受骑行乐趣的同时,也能深入了解当地的特色和故事。
最后,利用讯飞的语音合成技术,这些文本将被转换成音频,并通过与行空板连接的蓝牙音箱实时播放,为骑行者提供一种沉浸式的听觉体验。这样的设计不仅增强了骑行的趣味性,也为骑行者提供了一种新的旅行方式,让他们在旅途中能够更加深入地了解和体验当地的文化和历史。
【项目实现】
使用硬件行空板M10,利用Mind+,编写Python程序,调用高德开放平台API,将GNSS北斗定位模块采集到的经纬度转换成地理位置名称,如将经度"115.211792" 纬度 "40.375134" ,转换成“河北省张家口市涿鹿县”。再将理位置名称“河北省张家口市涿鹿县”,交给讯飞星火认知大模型Spark Max,生成介绍"涿鹿县"当地的风土人情、历史故事、名胜古迹、传统美食等的文本,再利用讯飞语音合成,生成音频,利用行空板连接的蓝牙音箱播放。
【项目硬件】
1.行空板M10
行空板是一款拥有自主知识产权的国产教学用开源硬件,采用微型计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和python环境,还预装了常用的python库,让广大师生只需两步就能开始python教学。
2.GNSS北斗定位模块
利用GNSS北斗定位模块采集当前所在位置的经度和纬度,这个模块是一款支持北斗、GPS、GLONASS等多卫星系统,可多系统联合定位的GNSS定位模块,能够为用户提供经度、纬度、时间、高度等数据。多系统联合定位相比于传统单一的GPS定位,可见和可用卫星数目大幅增加,能够极大的提高定位精度和定位速度,即使是在复杂城市环境中也能实现稳定的高精度定位。并具有I2C和UART两种数据输出类型,兼容Arduino、ESP32、树莓派等主流的主控设备。可用于车载导航、手持定位、物品追踪、气象站等室外定位场景。
【硬件组装】
【高德API经纬度转地理位置】
1.登陆高德开放平台,https://lbs.amap.com/,创建Key。
2.获取Key
3.python程序
以下程序代码,命名为:zbwb.py,与主程序上传到行空板同一目录下,实现主程序正确调用。
import requests
city=""
def get_location_by_coordinates(longitude, latitude):
global city
url = "http://restapi.amap.com/v3/geocode/regeo"
api_key = "*************************************7"
params = {
"location": f"{longitude},{latitude}",
"key": api_key
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
if data['status'] == '1' and data['regeocode']:
location=data['regeocode']['addressComponent']
city=location['city']
return location['province']+location['city']+location['district']
else:
return False
else:
return False
【项目程序】
1.加载扩展
官方库,行空板、代码生成器、OpenCV、讯飞语音
用户库,通过搜索“ext”,加载扩展:GNSS北斗定位模块、讯飞星火v3.5python模式。
2.图形化程序
3.python代码
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import sys
sys.path.append("/root/mindplus/.lib/thirdExtension/liliang-gravitygnss-thirdex")
sys.path.append("/root/mindplus/.lib/thirdExtension/ac000108-spark-thirdex")
import cv2
import time
import zbwz
import numpy as np
from Spark import Spark
from unihiker import Audio
from df_xfyun_speech import XfTts
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
from PIL import Image, ImageDraw, ImageFont
from DFRobot_GNSS import *
spark_amount=5
spark_Personality=[{"role":"system","content":"你扮演一位导游,可以根据用户给出的地理位置,介绍当地的风土人情、历史故事、名胜古迹、传统美食等,写成一段话,每次回答内容不重复。字数不要超过100字。除此不需要额外的说明"}]
# 自定义函数
def DiLiWeiZhi(JingDu, WeiDu):
longitude = JingDu
latitude = WeiDu
return zbwz.get_location_by_coordinates(longitude, latitude)
def XianShiXinXi(XinXi):
global image
image = Image.new('RGB', (240, 320), color='white')
background_image = Image.open("back.png")
image.paste(background_image, (0, 0))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype('simsun.ttc', 15)
lines = FenXing(XinXi, font, 220)
y_text = 10
for line in lines:
draw.text((10, y_text), line, font=font, fill=(0,0,255))
y_text += font.getsize(line)[1]+5
image= cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
cv2.imshow("window", image)
if cv2.waitKey(3000) & 0xff== 27:
pass
def FenXing(text, font, max_width):
lines = []
line = ''
text=text.replace('\n','')
for word in list(text):
if font.getsize(line + word)[0] <= max_width:
line += word
else:
lines.append(line)
line = word
if len(lines)>=16:
return lines
if line:
lines.append(line)
return lines
appId = "********"
apiKey ="********************************************"
apiSecret = "****************************************"
options = {}
business_args = {"aue":"raw","vcn":"aisxping","tte":"utf8","speed":50,"volume":100,"pitch":50,"bgs":0}
options["business_args"] = business_args
u_audio = Audio()
Board().begin()
tts = XfTts(appId, apiKey, apiSecret, options)
p_p21_in=Pin(Pin.P21, Pin.IN)
spark_appid="5c7a6af2"
spark_api_key="94932090baf7bb1eae2200ace714f424"
spark_api_secret="YTYwZjMwMDYwNDVjYTU0OTFhY2RmNjEx"
spark_history=[]
spark = Spark(spark_appid,spark_api_secret,spark_api_key,spark_Personality)
cv2.namedWindow("window", cv2.WINDOW_NORMAL)
cv2.setWindowProperty("window", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
img = cv2.imread("logo_xingkong.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("window", img)
if cv2.waitKey(1) & 0xff== 27:
pass
gnss = DFRobot_GNSS_I2C (bus=0, addr=0x20)
while (gnss.begin() == False):
print("Sensor initialize failed!!")
time.sleep(1)
gnss.enable_power()
gnss.set_gnss(GPS_BeiDou_GLONASS)
gnss.rgb_on()
gnss_utc = struct_utc_tim()
gnss_lat_lon = struct_lat_lon()
gnss_utc = gnss.get_date()
gnss_utc = gnss.get_utc()
gnss_lat_lon = gnss.get_lat()
gnss_lat_lon = gnss.get_lon()
gnss_alt = gnss.get_alt()
gnss_cog = gnss.get_cog()
gnss_sog = gnss.get_sog()
gnss_num = gnss.get_num_sta_used()
gnss_star = gnss.get_gnss_mode()
while not (((int(float((str(gnss_num))))) >= 3)):
time.sleep(5)
gnss_utc = gnss.get_date()
gnss_utc = gnss.get_utc()
gnss_lat_lon = gnss.get_lat()
gnss_lat_lon = gnss.get_lon()
gnss_alt = gnss.get_alt()
gnss_cog = gnss.get_cog()
gnss_sog = gnss.get_sog()
gnss_num = gnss.get_num_sta_used()
gnss_star = gnss.get_gnss_mode()
tts.synthesis("设备初始化完成", "speech.wav")
u_audio.play("speech.wav")
while True:
if (p_p21_in.read_digital()==True):
gnss_utc = gnss.get_date()
gnss_utc = gnss.get_utc()
gnss_lat_lon = gnss.get_lat()
gnss_lat_lon = gnss.get_lon()
gnss_alt = gnss.get_alt()
gnss_cog = gnss.get_cog()
gnss_sog = gnss.get_sog()
gnss_num = gnss.get_num_sta_used()
gnss_star = gnss.get_gnss_mode()
JingDu = (str(gnss_lat_lon.lonitude_degree))
WeiDu = (str(gnss_lat_lon.latitude_degree))
WeiZhiMingChen = DiLiWeiZhi(JingDu, WeiDu)
tts.synthesis((str("当前位置:") + str((str(WeiZhiMingChen) ))), "speech.wav")
u_audio.play("speech.wav")
spark_prompt = WeiZhiMingChen
spark_answer = spark.ask(spark_prompt,spark_history)
spark_history.append({"role": "user", "content": spark_prompt})
spark_history.append({"role": "assistant", "content": spark_answer})
while(spark_amount*2<len(spark_history)):
spark_history.pop(0)
XianShiXinXi(spark_answer)
print(spark_answer)
tts.synthesis(spark_answer, "speech.wav")
u_audio.play("speech.wav")
【演示视频】
rzegkly2024.11.22
很好的创意,准备做一个
影神2024.11.10
强!
DeadWalking2024.11.06
学习了~~~太硬核666