调用讯飞星火API实现图像生成

1. 作者介绍

刘来顺,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:lls2405559452@163.com

黄浩磊,男,西安工程大学电子信息学院,2023级研究生,张宏伟人工智能课题组
研究方向:智能视觉检测与工业自动化技术
电子邮件:hhl57303@163.com

2. 关于理论方面的知识介绍

图像生成技术是计算机视觉和人工智能领域中一项极具革命性的进展,尤其是在深度学习技术的推动下,我们已经能够创建出前所未有的真实和复杂的图像。

  1. 生成对抗网络(GANs)
    方法论: GANs包括两个神经网络——生成器和判别器,它们同时进行训练。生成器的任务是创造看起来真实的图像,而判别器的任务是区分训练集中的真实图像和生成器产生的假图像。通过这种竞争,生成器学习制造越来越令人信服的图像。
    优势: GANs特别擅长生成高质量和详细的图像。它们在需要创造性和视觉内容创新的任务中表现出色,例如创建艺术作品和时尚设计。
    应用: 除了艺术创作,GANs还用于照片增强、超分辨率以及生成真实人脸或改变照片中的面部表情。
  2. 变分自编码器(VAEs)
    方法论: VAEs是一种使用概率变换的自编码器。它们通过编码器将输入数据映射到具有定义概率分布的潜在空间,然后从这个空间解码以重构输入。训练过程涉及最小化原始图像与其重建之间的差异,这鼓励潜在空间的良好组织和连续性。
    优势: VAEs特别适用于需要平滑和连续图像生成的任务,如无缝地从一幅图像过渡到另一幅图像。
    应用: 常用于图像去噪、异常检测以及数据增强,通过调整潜变量来生成新图像。
  3. 扩散模型
    方法论: 扩散模型通过一个过程生成图像,该过程首先逐渐向数据样本添加噪声,直到原始内容完全被遮蔽。然后,在一个逆过程中,模型学习从噪声数据中重建原始图像,通过迭代减少噪声。
    优势: 这些模型在生成详细和逼真的图像方面表现出色,常常超过GANs在需要精细纹理细节的任务中的质量。
    应用: 最近用于创造艺术、提高照片分辨率以及以高度逼真的方式生成复杂场景。
  4. 自回归模型
    方法论: 自回归模型像PixelRNN和PixelCNN这样的模型,通过基于之前生成的像素预测新像素来逐像素或逐块生成图像。
    优势: 这些模型在生成过程中具有高度控制能力,这对于需要特定图像结构或属性的应用非常有益。
    应用: 常用于需要顺序数据生成的场景,如视频帧预测或复杂场景生成,每一个细节都很重要。
  5. 基于能量的模型(EBMs)
    方法论: EBMs为图像的每个可能状态定义一个标量能量,其中能量较低的状态更可能。训练涉及学习一个函数,为更合理的输入数据配置赋予较低的能量。
    优势: EBMs在学习不同类型的数据分布方面非常灵活,可以精细地从复杂的多模态分布中采样。
    应用: 它们用于图像恢复。

3. 关于实验过程的介绍,完整实验代码,测试结果

3.1 API获取

  1. 确保电脑正确连接网络。
  2. 浏览器搜索“讯飞开放平台”,或者输入网址:讯飞开放平台-以语音交互为核心的人工智能开放平台(xfyun.cn)
  3. 进行简单的注册、实名认证。
    ALT
  4. 打开控制台创建新应用,填写相应的“应用名称”,“应用分类”,“应用功能描述”并且提交。
    ALT
  5. 找到图片生成功能
    在这里插入图片描述
  6. 购买服务,并且选择刚才创建的应用
    在这里插入图片描述
  7. 查看API调用文档,获取相应的代码
    在这里插入图片描述
    在这里插入图片描述

3.2 代码解析与运行结果

3.2.1 完整代码

# encoding: UTF-8
import time
import requests
from datetime import datetime
from wsgiref.handlers import format_date_time
from time import mktime
import hashlib
import base64
import hmac
from urllib.parse import urlencode
import json
from PIL import Image
from io import BytesIO

class AssembleHeaderException(Exception):
    def __init__(self, msg):
        self.message = msg


class Url:
    def __init__(this, host, path, schema):
        this.host = host
        this.path = path
        this.schema = schema
        pass


# calculate sha256 and encode to base64
def sha256base64(data):
    sha256 = hashlib.sha256()
    sha256.update(data)
    digest = base64.b64encode(sha256.digest()).decode(encoding='utf-8')
    return digest


def parse_url(requset_url):
    stidx = requset_url.index("://")
    host = requset_url[stidx + 3:]
    schema = requset_url[:stidx + 3]
    edidx = host.index("/")
    if edidx <= 0:
        raise AssembleHeaderException("invalid request url:" + requset_url)
    path = host[edidx:]
    host = host[:edidx]
    u = Url(host, path, schema)
    return u


# 生成鉴权url
def assemble_ws_auth_url(requset_url, method="GET", api_key="", api_secret=""):
    u = parse_url(requset_url)
    host = u.host
    path = u.path
    now = datetime.now()
    date = format_date_time(mktime(now.timetuple()))
    # print(date)
    # date = "Thu, 12 Dec 2019 01:57:27 GMT"
    signature_origin = "host: {}\ndate: {}\n{} {} HTTP/1.1".format(host, date, method, path)
    # print(signature_origin)
    signature_sha = hmac.new(api_secret.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\"" % (
        api_key, "hmac-sha256", "host date request-line", signature_sha)
    authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
    # print(authorization_origin)
    values = {
        "host": host,
        "date": date,
        "authorization": authorization
    }
    return requset_url + "?" + urlencode(values)

# 生成请求body体
def getBody(appid,text):
    body= {
        "header": {
            "app_id": appid,
            "uid":"123456789"
        },
        "parameter": {
            "chat": {
                "domain": "general",
                "temperature":0.5,
                "max_tokens":4096
            }
        },
        "payload": {
            "message":{
                "text":[
                    {
                        "role":"user",
                        "content":text
                    }
                ]
            }
        }
    }
    return body

# 发起请求并返回结果
def main(text,appid,apikey,apisecret):
    host = 'http://spark-api.cn-huabei-1.xf-yun.com/v2.1/tti'
    url = assemble_ws_auth_url(host,method='POST',api_key=apikey,api_secret=apisecret)
    content = getBody(appid,text)
    print(time.time())
    response = requests.post(url,json=content,headers={'content-type': "application/json"}).text
    print(time.time())
    return response

#将base64 的图片数据存在本地
def base64_to_image(base64_data, save_path):
    # 解码base64数据
    img_data = base64.b64decode(base64_data)

    # 将解码后的数据转换为图片
    img = Image.open(BytesIO(img_data))

    # 保存图片到本地
    img.save(save_path)


# 解析并保存到指定位置
def parser_Message(message):
    data = json.loads(message)
    # print("data" + str(message))
    code = data['header']['code']
    if code != 0:
        print(f'请求错误: {code}, {data}')
    else:
        text = data["payload"]["choices"]["text"]
        imageContent = text[0]
        # if('image' == imageContent["content_type"]):
        imageBase = imageContent["content"]
        imageName = data['header']['sid']
        savePath = f"output/{imageName}.jpg"
        base64_to_image(imageBase,savePath)
        print("图片保存路径:" + savePath)
    return savePath



if __name__ == '__main__':
    #运行前请配置以下鉴权三要素,获取途径:https://console.xfyun.cn/services/tti
    APPID ='个人ID'
    APISecret = '你的密钥'
    APIKEY = '你的密钥'
    desc = '''生成一张图:远处有着高山,山上覆盖着冰雪,近处有着一片湛蓝的湖泊'''
    res = main(desc,appid=APPID,apikey=APIKEY,apisecret=APISecret)
    # print(res)
    #保存到指定位置
    parser_Message(res)
    # print(parser_Message(res))

3.2.2 运行结果

将获取的“APPID”、“APISecret”、“APIKEY”、填写进去。“desc”输入相应的提示词可以生成对应的图片。
在这里插入图片描述
获取的运行结果如下:
在这里插入图片描述

3.3 界面的编写(进阶)

Gradio的设计哲学是“简单且强大”。它旨在为中高级开发者提供一个高效、易用的平台,使他们能够快速展示和测试他们的机器学习模型。通过Gradio,开发者可以轻松创建出能够处理各种输入(如图像、音频、文本等)的应用,并将结果以直观的方式展示给用户。更重要的是,Gradio使得分享和部署这些交互式应用变得轻而易举,不论是在团队内部还是在全球范围内。
pip安装相应的SDK

pip install gradio

在图像生成文件中的图像生成函数中添加返回值,并且连接到界面的输出变量中,
将界面的输入变量链接到生成代码的prompt变量这里,
添加相应的生成按钮即可。

4. 问题分析

问题一: 图片生成的主要功能是什么?
答:根据用户输入的文字内容,生成符合语义描述的不同风格的图像。

问题二: 图片生成支持什么应用平台?
答:目前支持Web API应用平台。

问题三: 图片生成的默认大小为多少?
答:分辨率512*512。

5. 参考链接

Python调用腾讯API进行人像动漫化_搜索或输入网址-CSDN博客
掌握Gradio:Python中创建交互式机器学习应用的终极指南
终于等到你!Python调用讯飞星火大模型API_哔哩哔哩_bilibili

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 01:00:08       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 01:00:08       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 01:00:08       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 01:00:08       18 阅读

热门阅读

  1. Spark的序列化

    2024-06-06 01:00:08       8 阅读
  2. 就在刚刚,雷军又做了个10亿的公司

    2024-06-06 01:00:08       7 阅读
  3. 前端Ajax、Axios和Fetch的用法和区别笔记

    2024-06-06 01:00:08       9 阅读
  4. qt QGroupBox radiobutton

    2024-06-06 01:00:08       10 阅读
  5. 双向链表MyLinkList

    2024-06-06 01:00:08       8 阅读
  6. Unknown module(s) in QT: texttospeech

    2024-06-06 01:00:08       5 阅读
  7. Vue的过滤器是什么如何使用它

    2024-06-06 01:00:08       6 阅读
  8. Git配置SSH-Key

    2024-06-06 01:00:08       7 阅读
  9. rose 聊开源—1 你为什么需要一个开源项目

    2024-06-06 01:00:08       5 阅读
  10. django接入djangorestframework-simplejwt步骤

    2024-06-06 01:00:08       8 阅读