回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

2024AIGC_骑行AI伴侣 简单

头像 云天 2024.11.06 246 3

【项目背景】

        本项目旨在将人工智能生成内容(AIGC)技术与行空板及北斗定位模块相结合,为自行车骑行者提供一种全新的体验。通过在自行车上安装GNSS北斗定位模块,我们能够实时采集骑行者的经纬度信息,这些信息将随着骑行者位置的变化而动态更新。结合讯飞星火认知大模型、高德开放平台API,我们可以将这些经纬度数据转换成具体的地理位置名称,并进一步生成关于当地的风土人情、历史故事、名胜古迹、传统美食等内容的文本描述。

        在骑行过程中,随着位置的移动,系统将自动调用高德开放平台API,将实时更新的经纬度坐标转换为地理位置名称。然后,讯飞星火认知大模型将基于这些地理位置信息,生成详细的介绍文本,这些文本不仅包括当地的文化特色和历史背景,还可能涉及当地的美食推荐和名胜古迹介绍。例如,当骑行者经过河北省张家口市涿鹿县时,系统可能会介绍该地区的历史文化和自然景观,让骑行者在享受骑行乐趣的同时,也能深入了解当地的特色和故事。

        最后,利用讯飞的语音合成技术,这些文本将被转换成音频,并通过与行空板连接的蓝牙音箱实时播放,为骑行者提供一种沉浸式的听觉体验。这样的设计不仅增强了骑行的趣味性,也为骑行者提供了一种新的旅行方式,让他们在旅途中能够更加深入地了解和体验当地的文化和历史。

【项目实现】

        使用硬件行空板M10,利用Mind+,编写Python程序,调用高德开放平台API,将GNSS北斗定位模块采集到的经纬度转换成地理位置名称,如将经度"115.211792" 纬度 "40.375134" ,转换成“河北省张家口市涿鹿县”。再将理位置名称“河北省张家口市涿鹿县”,交给讯飞星火认知大模型Spark Max,生成介绍"涿鹿县"当地的风土人情、历史故事、名胜古迹、传统美食等的文本,再利用讯飞语音合成,生成音频,利用行空板连接的蓝牙音箱播放。

【项目硬件】

1.行空板M10

productImage

        行空板是一款拥有自主知识产权的国产教学用开源硬件,采用微型计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和python环境,还预装了常用的python库,让广大师生只需两步就能开始python教学。

2.GNSS北斗定位模块

image.png

        利用GNSS北斗定位模块采集当前所在位置的经度和纬度,这个模块是一款支持北斗、GPS、GLONASS等多卫星系统,可多系统联合定位的GNSS定位模块,能够为用户提供经度、纬度、时间、高度等数据。多系统联合定位相比于传统单一的GPS定位,可见和可用卫星数目大幅增加,能够极大的提高定位精度和定位速度,即使是在复杂城市环境中也能实现稳定的高精度定位。并具有I2C和UART两种数据输出类型,兼容Arduino、ESP32、树莓派等主流的主控设备。可用于车载导航、手持定位、物品追踪、气象站等室外定位场景。

【硬件组装】

image.png
d79ba207dfd8b7355cbc68f1ef7351d.jpg
ce85dcb15065577ff5e58ff7cb85325.jpg
61459d83056a2fe7a9120fe3155b5d3.jpg
e5ba4664b6f53c7f093e30e34a70c3c.jpg

【高德API经纬度转地理位置】

1.登陆高德开放平台,https://lbs.amap.com/,创建Key。

屏幕截图 2024-11-06 103841.png

2.获取Key

image.png

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、讯飞语音

image.png

用户库,通过搜索“ext”,加载扩展:GNSS北斗定位模块、讯飞星火v3.5python模式。

image.png

2.图形化程序

screenshots-骑行AI伴侣.mp-1730863957374.png

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")

【演示视频】

评论

user-avatar
  • rzegkly

    rzegkly2024.11.22

    很好的创意,准备做一个

    0
    • 影神

      影神2024.11.10

      强!

      0
      • DeadWalking

        DeadWalking2024.11.06

        学习了~~~太硬核666

        0