注册及登录

网址:https://open.bigmodel.cn/
1、注册账号
2、复制API key

智谱API接入

使用模型:文生视频:CogVideoX-Flash

  1. 前端JS代码
const handleGenerate = async () => {
    // 前置校验
    if (!prompt.trim()) {
      setErrorMsg('视频描述不能为空!');
      return;
    }
    // 重置状态
    setLoading(true);
    setGeneratedVideo('');
    setIsPlaying(false);
    setErrorMsg('');

    try {
      // 1. 拼接请求参数
      const params = new URLSearchParams();
      params.append('prompt', prompt); // 视频描述
      params.append('model', selectedModel); // 选中的模型
      params.append('duration', duration); // 视频时长

      // 2. 调用后端GET接口
      const response = await fetch(
        `http://localhost:8080/large/model/textToVideo?${params.toString()}`,
        {
          method: 'GET',
          headers: {
            'Content-Type': 'application/json',
            // 若后端需要额外鉴权头,可添加
            // 'Authorization': `Bearer ${apiKey}`
          },
        }
      );

      // 3. 处理响应
      if (!response.ok) {
        throw new Error(`请求失败:${response.status} ${response.statusText}`);
      }
      const result = await response.json();

      // 4. 校验后端返回结果(假设后端返回 { code: 200, data: { videoUrl: 'xxx' }, msg: '成功' })
      if (result.code !== 200) {
        throw new Error(result.msg || '视频生成失败');
      }
      // 设置生成的视频URL
      setGeneratedVideo(result.data);

    } catch (error) {
      // 错误处理
      const err = error as Error;
      setErrorMsg(`生成失败:${err.message}`);
      console.error('Generation failed:', err);
    } finally {
      setLoading(false); // 结束加载
    }
  };
  1. 后端controller
	/**
     * 文生视频
     */
    @GetMapping("/textToVideo")
    @Anonymous
    public R<String> textToVideo(String model, String prompt, Integer duration)
    {
        return R.ok(iLargeModelIntegrationService.textToVideo(model, prompt, duration));
    }
  1. 后端service
	/**
     * 跟据提示词生成视频
     * @param model 模型
     * @param prompt 提示词
     * @param duration 持续时间
     * @return 视频URL
     */
    String textToVideo(String model, String prompt, Integer duration);
  1. 后端serviceImpl
	private static final String PREFIX_PROMPT = "将以下文字翻译成英文: ";
	//经过测试,将文字描述转化成英文,效果更好
	@Override
    public String textToVideo(String model, String prompt, Integer duration) {
        prompt = textGeneration("qwen-plus", PREFIX_PROMPT + prompt);
        return LargeModelIntegration.generationZhiPuCogVideoX(prompt, duration);
    }
  1. 后端LargeModelIntegration工具方法
	/**
     * 简化版同步生成(使用默认轮询参数)
     * @param prompt 正向提示词
     * @return 视频URL
     */
    public static String generationZhiPuCogVideoX(String prompt, Integer duration) {
        return syncZhiPuCogVideoX(prompt, duration, size, false, 50, 3000);
    }
    /**
     * CogVideoX-Flash 同步生成视频(提交任务+自动轮询,直到返回结果)
     * @param prompt 正向提示词
     * @param duration 视频时长(1-10秒)
     * @param size 分辨率(720p/1080p)
     * @param withAudio 是否添加AI音效
     * @param maxPollCount 最大轮询次数(默认30次)
     * @param pollInterval 轮询间隔(毫秒,默认3000ms)
     * @return 视频URL
     */
    public static String syncZhiPuCogVideoX(String prompt, Integer duration, String size, Boolean withAudio,
                                            int maxPollCount, long pollInterval) {
        // 1. 兜底轮询参数
        int finalMaxPollCount = maxPollCount <= 0 ? 30 : maxPollCount;
        long finalPollInterval = pollInterval <= 0 ? 3000 : pollInterval;

        // 2. 提交异步任务
        String taskId = zhiPuCogVideoXFlash(prompt, duration, size, withAudio);
        int pollCount = 0;
        String result = "";

        // 3. 轮询查询结果
        while (pollCount < finalMaxPollCount) {
            try {
                Thread.sleep(finalPollInterval);
                result = queryZhiPuCogVideoXResult(taskId);
                // 任务仍在处理中,继续轮询
                if ("PROCESSING".equals(result)) {
                    pollCount++;
                    log.info("CogVideoX-Flash轮询第{}次,任务状态:{}", pollCount, result);
                } else {
                    // 任务完成(成功/失败),退出轮询
                    break;
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.error("CogVideoX-Flash轮询中断", e);
                throw new RuntimeException("轮询中断", e);
            }
        }

        // 4. 轮询超时判断
        if (pollCount >= finalMaxPollCount) {
            throw new RuntimeException("CogVideoX-Flash轮询超时,任务仍在处理中");
        }
        return result;
    }
    /**
     * 文生视频结果查询
     * @param taskId 任务ID
     * @return 视频URL/任务状态(SUCCEEDED/FAILED/RUNNING/PENDING)
     */
    public static String queryZhiPuCogVideoXResult(String taskId) {
        // 1. 参数校验
        Assert.isTrue(StringUtils.isNotBlank(taskId), "taskId不能为空");

        // 2. 构建请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Bearer " + ZHIPU_API_KEY);
        headers.put("Content-Type", "application/json");

        // 3. 拼接查询URL
        String finalQueryUrl = String.format(COGVIDEOX_QUERY_URL, taskId);
        log.info("任务查询URL:{}", finalQueryUrl);

        try {
            // 发起查询请求
            String result = HttpUtil.get(finalQueryUrl, headers);
            log.info("查询结果:" + result);

            // 解析响应
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.containsKey("error")){
                log.info("查询失败:" + resultJson.getJSONObject("error").getString("message"));
                throw new RuntimeException("查询文生视频结果异常");
            }
            List<JSONObject> video_result = resultJson.getList("video_result", JSONObject.class);
            String taskStatus = resultJson.getString("task_status");
            log.info("任务状态:{}", taskStatus);

            // 按状态返回结果
            switch (taskStatus) {
                case "SUCCESS":
                    // 生成成功,返回视频URL
                    return video_result.get(0).getString("url");
                case "FAILED":
                    throw new RuntimeException("文生视频任务失败");
                case "PROCESSING":
                    log.info("文生视频任务处理中...状态:{}", taskStatus);
                    return taskStatus;
                default:
                    log.warn("未知任务状态:" + taskStatus);
                    return taskStatus;
            }
        } catch (Exception e) {
            log.error("查询结果异常", e);
            throw new RuntimeException("查询文生视频结果异常", e);
        }
    }
    /**
     * CogVideoX-Flash 文生视频(异步提交任务,POST请求)
     * @param prompt 正向提示词(必填,≤1000字符)
     * @param duration 视频时长(可选,1-10秒,默认8秒)
     * @param size 视频分辨率(可选,如720p/1080p,默认720p)
     * @param withAudio 是否添加AI音效(可选,默认false)
     * @return taskId 任务ID
     */
    public static String zhiPuCogVideoXFlash(String prompt, Integer duration, String size, Boolean withAudio) {
        // 1. 参数校验(与原有风格一致)
        Assert.isTrue(StringUtils.isNotBlank(prompt) && prompt.length() <= 1000, "正向提示词不能为空且长度≤1000字符");
        Assert.isTrue(duration == null || (duration >= 1 && duration <= 10), "视频时长需为1-10秒");

        // 2. 参数兜底处理
        int finalDuration = duration == null ? 5 : duration;
        String finalSize = StringUtils.isBlank(size) ? "720p" : size;
        boolean finalWithAudio = withAudio != null && withAudio;

        // 3. 构建请求头(智谱AI认证方式)
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Bearer " + ZHIPU_API_KEY);
        headers.put("Content-Type", "application/json; charset=utf-8");

        // 4. 封装请求参数(适配CogVideoX-Flash API规范)
        JSONObject param = new JSONObject();
        param.put("model", ZHIPU_COGVIDEOX_FLASH_MODEL_ID); // CogVideoX-Flash固定模型ID
        param.put("prompt", prompt); // 视频描述提示词
        param.put("duration", finalDuration); // 视频时长(秒)
        param.put("size", finalSize); // 分辨率
        param.put("with_audio", finalWithAudio); // 是否添加AI音效
        param.put("response_format", "url"); // 返回视频URL格式
        try {
            // 5. 日志打印(与原有风格一致)
            log.info("请求入参:prompt:{}", URLDecoder.decode(prompt, StandardCharsets.UTF_8));
            // 发起异步任务提交请求
            String result = HttpUtil.postJson(COGVIDEOX_CREATE_URL, headers, param.toJSONString());
            log.info("请求出参:" + result);

            // 解析响应获取taskId
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.containsKey("id")) {
                return resultJson.getString("id");
            } else {
                log.error("文生视频返回无request_id:" + result);
                throw new RuntimeException("文生视频任务提交失败,未返回request_id");
            }
        } catch (Exception e) {
            log.error("调用异常", e);
            throw new RuntimeException("调用异常", e);
        }
    }
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐