回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

2024AIGC_行空板涂鸦智绘 简单

头像 lhiot 2024.10.17 71 1

image.png

【项目背景】

        随着人工智能技术的快速发展,AI在图像处理和生成领域取得了显著的进展。科大讯飞推出的HiDream功能,正是基于这种先进的人工智能技术,能够根据用户提供的提示词和参考图片生成新的图片。这种技术的应用前景广泛,包括但不限于艺术创作、设计辅助、教育娱乐等多个领域。

        本项目能够帮助用户快速便捷地获得与自己想法相匹配的图像。 在教育领域,尤其是儿童教育,通过AI技术辅助绘画教学,可以激发孩子们的创造力和想象力。 结合行空板这样的交互设备,用户可以直接在设备上进行涂鸦,然后利用AI技术生成更加精美的图像,提升用户体验。

【项目设计】

        本项目旨在利用科大讯飞的HiDream功能,开发一个基于行空板的涂鸦智画应用。用户可以通过行空板上的涂鸦来生成个性化的图像内容,同时,项目也将探索如何通过AI技术来理解用户的涂鸦内容,并据此生成更加准确的图像。

【图片生成】

        本项目使用的是科大讯飞的HiDream功能,它是基于国际领先且自主可控的生成式人工智能多模态大模型,能够根据提示词和参考图片生成图片。

        1.控制台中获取的 APPID 、APISecret、APIKey信息,https://console.xfyun.cn/services

image.png

        2.代码如下:

# -*- encoding:utf-8 -*-

import base64

import hashlib

import hmac

import json

import time

from datetime import datetime

from time import mktime

from urllib.parse import urlencode, urlparse

from wsgiref.handlers import format_date_time

from urllib import parse

import requests

 

appid = "*********"    #填写控制台中获取的 APPID 信息

apiSecret = "*************"   #填写控制台中获取的 APISecret 信息

apiKey ="*****************"    #填写控制台中获取的 APIKey 信息

 

imagedata = open("sc.png", 'rb').read()

image = str(base64.b64encode(imagedata), 'utf-8')

 

# 请求地址

create_host_url = "https://cn-huadong-1.xf-yun.com/v1/private/s3fd61810/create"

query_host_url = "https://cn-huadong-1.xf-yun.com/v1/private/s3fd61810/query"

 

def build_auth_request_url(request_url):

    url_result = parse.urlparse(request_url)

    date =format_date_time(mktime(datetime.now().timetuple()))

    print(date)

    method = "POST"

    signature_origin = "host: {}\ndate: {}\n{} {} HTTP/1.1".format(url_result.hostname, date, method, url_result.path)

    signature_sha = hmac.new(apiSecret.encode('utf-8'), signature_origin.encode('utf-8'),

                             digestmod=hashlib.sha256).digest()

    signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')

    authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (

        apiKey, "hmac-sha256", "host date request-line", signature_sha)

    authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')

    values = {

        "host": url_result.hostname,

        "date": date,

        "authorization": authorization

    }

    return request_url + "?" + urlencode(values)

 

def create_url(url):

    host = urlparse(url).netloc

    path = urlparse(url).path

 

    # 生成RFC1123格式的时间戳

    now = datetime.now()

    date = format_date_time(mktime(now.timetuple()))

 

    # 拼接字符串

    signature_origin = "host: " + host + "\n"

    signature_origin += "date: " + date + "\n"

    signature_origin += "POST " + path + " HTTP/1.1"

 

    # 进行hmac-sha256进行加密

    signature_sha = hmac.new(apiSecret.encode('utf-8'), signature_origin.encode('utf-8'),

                             digestmod=hashlib.sha256).digest()

 

    signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')

 

    authorization_origin = f'api_key="{apiKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'


     authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')

 

    # 将请求的鉴权参数组合为字典

    v = {

        "authorization": authorization,

        "date": date,

        "host": host

    }

    # 拼接鉴权参数,生成url

    reUrl = url + '?' + urlencode(v)

    # print(reUrl)

    # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致

    return reUrl

 

def get_headers(url):

    headers = {

        'content-type': "application/json",

        'host': urlparse(url).netloc,

        'app_id': appid

    }

    return headers

 

def gen_create_request_data(text):

    data = {

        "header": {

            "app_id": appid,

            "status": 3,

            "channel": "default",

            "callback_url": "default",

        },

        "parameter": {

            "oig": {

                "result": {

                    "encoding": "utf8",

                    "compress": "raw",

                    "format": "json"

                },

            }

        },

        "payload": {

            "oig": {

                "text": text

            },

        },

    }

    return data

 

def create_task():

    text = {

        "image": [image],  #引擎上传的原图,如果仅用图片生成能力,该字段需为空

        "prompt": "这是一个鹿的图画。请将此图片3D图片", #  该prompt 可以是要求引擎生成的描述,也可以结合上传的图片要求模型修改原图

        "aspect_ratio": "1:1",

        "negative_prompt": "",

        "img_count": 1,

        "resolution": "2k"

    }

    b_text = base64.b64encode(json.dumps(text).encode("utf-8")).decode()

    request_url = create_url(create_host_url)

    data = gen_create_request_data(b_text)

    headers = get_headers(create_host_url)

    response = requests.post(request_url, data=json.dumps(data), headers=headers)

    # print(json.dumps(data))

    # return

    print('onMessage:\n' + response.text)

    resp = json.loads(response.text)

    taskid = resp['header']['task_id']

    # print(taskid)

    return taskid

 

def query_task(taskID):

    data = {

        "header": {

            "app_id": appid,

            "task_id": taskID  # 填写创建任务时返回的task_id

        }

    }

    request_url = create_url(query_host_url)

    headers = get_headers(query_host_url)

    response = requests.post(request_url, data=json.dumps(data), headers=headers)

    res = json.loads(response.content)

    return res

 

if __name__ == '__main__':

    # 创建任务

    task_id = create_task()

 

    # 查询结果 task_status 1:待处理 2:处理中 3:处理完成 4:回调完成

    while(True):

       print(datetime.now())

       res =  query_task(task_id)

       code = res["header"]["code"]

       task_status = ''

       if code == 0:

           task_status = res["header"]["task_status"]

           if ('' == task_status):

               print("查询任务状态有误,请检查")

           elif('3' == task_status):

               print(datetime.now())

               print("任务完成")

               print(res)

               f_text = res["payload"]["result"]["text"]

               print("图片信息:\n" + str(base64.b64decode(f_text)))

               break

           else:

               print("查询任务中:......" + json.dumps(res))

               time.sleep(1)

               continue

       else:

           print(res)

评论

user-avatar
  • 竺可桢学校程老师

    竺可桢学校程老师2024.10.23

    用不了,报错是怎么回事

    0