今日新鲜事 - 发现热搜榜和排行榜

不再错过短视频风口,用python一键生成短视频,就是这么简单!

今日新鲜事 码农家园 2023-11-25 15:40

 

最近在网上查资料,正好看到百度开放平台又解锁一项能力【图文生成视频】。

利用这个api接口,可以可以把你的图文自动生成一个视频,完全不需要再借助其他任何的软件。

不过目前能力,一次只能转一条图文。

对于目前做短视频的人来说,我觉得还是非常方便的,所以就花点时间捣鼓了下,把代码写了出来。

在使用之前,我们先需要做做前期的准备。

1.一个百度账号

要使用百度API的接口,我们需要有一个百度开放平台的账号(生成视频需要),可以直接使用百度账号登陆。

 

 

我们需要的是该应用下的AppID、API Key、Secret Key。

这块有不懂的可以百度,或者私信我,这里不细讲。

2.一个百家号

这个接口的麻烦之处在于,提供的图文链接必须是百度官方的百家号文章,其他的一概不行

 

 

这个,说实话确实有点麻烦,因为要注册百家号,其实还是有一些麻烦的,很多同学不一定会弄。

如果确实有需要的同学可以注册一个,也可以当做自媒体玩玩。

如果只是想用接口,不想这么麻烦的,我正好有一个闲置的百家号,每天可以发5篇文章。

那么可以私信我,我帮你把内容发出去,然后把链接发回给你。(不收费)

这里还要注意的一点是:

图文内容不要太长,文字控制在500字以内

原因我后面会说到。

3.获取access_token

关于url,文档里面有一个参数access_token,这个是必须要的,也是我之前让注册百度账号的缘故。

 

 

 

在对url发送请求前,我们先要去获取access_token,代码已经帮大家写好了。

 

1
2
3
4
5
6
7
8
9
10
# 获取sccess token函数
def get_AccessToken():
    url_a = 'https://aip.baidubce.com/oauth/2.0/token'
    data = {
    'grant_type':'client_credentials',
    'client_id':api_key,
    'client_secret':s_key
    }
    r = requests.get(url=url_a,params=data)
    return r.json()['access_token']

4.图文生成视频

4-1创建视频任务

前期准备完成了,我们可以开始看API文档,看视频怎么生成。

当然,只想使用这个功能,而不想那么多细节的同学,可以拉到最后,我会把整个代码贴出来。

我们继续。

关于接口的描述是这样的:

创建图文生成视频任务,提供新闻链接和必要的参数,即可创建一个视频任务,得到任务id,用于后续的查询或中止操作。 目前同一用户仅能创建一个视频任务。

图文链接和access_token有了,可以开始对url发送请求。

请求的内容还有2个,一个是请求头,一个是请求参数

其中请求头是固定的

而请求参数有几个,图文链接我们有了,发音人有7种声音可以选择。

我只试了度小美的,大家可以试试其他的声音,看看是不是你想要的。

特别要注意的是这个duration参数,视频的时长它有一个时间范围,嗯,就是只能创建40-120s内的视频,短视频最符合了。

但是,这说明了什么呢?

说明我们的图文内容中,文字的数量要控制在一定范围内。

其中生成的视频会自动包含片头片尾,时间约8秒。

我大概测试了一下,每秒钟大约4-5个字(包含标点符号),所以视频时长设置可以参考:字数/(时长+8秒)

生成图文视频的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 获取是否创建成功函数
def get_video():
    data = {
    'news_url':news_url,
    'tts_per':tts_per,
    'duration':duration
    }
    r = requests.post(url = url.format(get_AccessToken()),data = data,headers=headers)
    info = r.json()
    if info['error_code'] == 0:
        print('视频创建成功!')
        job_id = info['result']['job_id']
        time_e = info['result']['estimate_finish_time']
        print('预计需结束时间为:%s' % time_e)
        print('视频id为:%s,请注意保存!' % job_id)
    else:
        # 查询任务
        print(info['error_msg'])

以上只是我们把图文转视频的任务创建成功。

成功之后,后台就会开始生成视频,这肯定是需要花费一点时间(1分钟的视频大概两三分钟就可以完成)。

那么中间的这段时间干嘛呢?一是查一下创建的视频情况,如果完成了,我们要把视频下载下来;

二是假如我突然不需要这条,要转其他的图文,那怎么办?这个我待会儿说,先说第一条。

4-2 查询视频任务+下载视频

查询任务API提供的是另外一个url,不过我代码里面已经帮大家写好了,无需担心。

发起查询请求后,会返回这样几个任务状态码(status)

1:已创建,2:排队中,3:生成中,4:生成成功,5:生成失败

我们可以用if条件判断语句,根据返回的状态码不同,得到不同的结果。

 

 

 

如果视频已经生成了,那么要输出视频相关的一些信息。

比如视频下载链接,封面下载链接,链接失效时间,它还会自动帮我们把视频进行分类。(我这个属于娱乐类)

把下载链接复制粘贴到浏览器中,就可以自动播放,也可以直接下载使用。

假如出现错误可以再次查询,应该是接口本身有点问题。

如果还在生成中,那么会返回视频完成的一个大概时间点。

以及还会返回一个视频的任务ID,用于视频任务的中止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def find_task():
    print('正在查询进行中的任务。。。')
    r = requests.get(url = url_f.format(get_AccessToken(),headers=headers))
    info = r.json()
    if info['error_code'] == 0:
        # print('进行中的任务信息为:%s' %info['result'])
        result = info['result']
        # 假如result有内容,也即创建任务成功
        if len(result):
            s = list(result.keys())[0]
            data = result[s]
            if data['status'] == '4':
                print('恭喜视频生成成功!')
                print('视频文件失效时间:%s ' % data['expire_time'])
                print('视频下载链接为:%s ' %data['video_addr'])
                print('视频封面下载链接为:%s ' % data['video_cover_addr'])
                print('视频时长%s 秒' % data['video_duration'])
                print('视频标题:%s ' % data['video_title'])
                print('视频摘要:%s ' % data['video_summary'])
                print('视频分类:%s ' % data['video_category'])
            elif data['status'] == '5':
                print('视频生成失败!')
                print(data['fail_reason'])
            elif data['status'] == '2' or data['status'] == '3':
                print('任务排队或者生成中。。。')
                print('任务信息id为%s' % data['job_id'])
                print('预计结束时间为:%s' %data['estimate_finish_time'])
            else:
                print('视频还在生成中,请耐心等待。。。')
                print('任务信息id为%s' % data['job_id'])
                print('预计结束时间为:%s' %data['estimate_finish_time'])

        else:
            print('不知道这是什么')
    else:
        print('服务暂时不可用,可能是视频已经生成,请重试!')

4-3 中止视频任务

API接口还提供了中止功能,就是我上面讲到的。

中止任务是需要提供任务id的,可以在第二步查询获得。

这一步其实比较简单,就不在重复那么多。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 中止任务
def stop_task():
    print('准备中止任务。。。')
    job_id = int(input('请输入你要中止的任务id:'))
    data = {
    'job_id':job_id
    }
    r = requests.get(url = url_d.format(get_AccessToken(),data = data,headers=headers))
    info = r.json()
    if info['error_code'] == 0:
        print('中止的任务信息为:%s' %info['result'])
    else:
        print('该任务不存在,请检查输入数据后再试!')

关于API的详细说明,感兴趣的同学也可以去参考官方文档:https://ai.baidu.com/ai-doc/NLP/Zk7ylspjv

5-完整代码

最后的代码我把一些需要手动输入的参数重新添加了进去,不过没有对输入的内容进行判断,不然代码写起来也太长了…

输入的顺序是:

(1)输入要进行的操作:【0:创建任务】 【1:查询任务】 【2:中止任务】

如果是0,那么需要输入以下:

(2)输入文章链接

(3)输入发音人(数字代号)

(4)输入视频时长(40-120),单位是秒

如果是2,那么需要输入任务id

(5)请输入要中止的任务ID(不知道可以通过1查询获得)

完整代码,我把账户的几个key都删除了,需要用的记得填好后再用,不然会报错的…

完结,撒花~~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import requests
import json

'''
1.视频任务创建接口
2.视频任务查询接口
3.视频任务中止接口

其他:
1.每秒钟大约5个字(包含标点符号)
2.视频会自动包含片头片尾,总计约8秒时长
3.视频时长设置为:字数/(时长+8秒)
4.接口调用说明文档:https://ai.baidu.com/ai-doc/NLP/Zk7ylspjv#%E8%BF%94%E5%9B%9E%E8%AF%B4%E6%98%8E-1
5.程序基于百度AI开放平台

'''
# 自然语言处理账户
appid = ***
api_key = '输入你自己的'
s_key = '输入你自己的'

# 几个接口的url
url = 'https://aip.baidubce.com/rest/2.0/nlp/v1/create_vidpress?access_token={}'
url_f = 'https://aip.baidubce.com/rest/2.0/nlp/v1/query_vidpress?access_token={}'
url_d = 'https://aip.baidubce.com/rest/2.0/nlp/v1/delete_vidpress?access_token={}'

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400',
    'Content-Type':'application/x-www-form-urlencoded'
}


# 获取sccess token函数
def get_AccessToken():
    url_a = 'https://aip.baidubce.com/oauth/2.0/token'
    data = {
    'grant_type':'client_credentials',
    'client_id':api_key,
    'client_secret':s_key
    }
    r = requests.get(url=url_a,params=data)
    return r.json()['access_token']

# 获取是否创建成功函数
def get_video():
    # 百家号文章url
    news_url = input('请粘贴你需要转为视频的百家号图文链接:')

    # 发音人
    print('发音人【0:度小美,1:度小宇,3:度逍遥,4:度丫丫,100:度小雯,103:度米朵,106:度博文】')
    tts_per = int(input('请按照上述输入发音人数字:'))

    # 目标视频时长,单位:秒,要求40 - 120秒
    # 40秒字数:160个字;120秒字数:560个字
    duration = int(input('请输入视频时长(范围是40-120),单位是秒:'))

    # 请求参数
    data = {
    'news_url':news_url,
    'tts_per':tts_per,
    'duration':duration
    }
    r = requests.post(url = url.format(get_AccessToken()),data = data,headers=headers)
    info = r.json()
    if info['error_code'] == 0:
        print('视频创建成功!')
        job_id = info['result']['job_id']
        time_e = info['result']['estimate_finish_time']
        print('预计需结束时间为:%s' % time_e)
        print('视频id为:%s,请注意保存!' % job_id)
    else:
        # 查询任务
        print(info['error_msg'])
        find_task()


# 查找进行中的任务
def find_task():
    print('正在查询进行中的任务。。。')
    r = requests.get(url = url_f.format(get_AccessToken(),headers=headers))
    info = r.json()
    if info['error_code'] == 0:
        # print('进行中的任务信息为:%s' %info['result'])
        result = info['result']
        # 假如result有内容,也即创建任务成功
        if len(result):
            s = list(result.keys())[0]
            data = result[s]
            if data['status'] == '4':
                print('恭喜视频生成成功!')
                print('视频文件失效时间:%s ' % data['expire_time'])
                print('视频下载链接为:%s ' %data['video_addr'])
                print('视频封面下载链接为:%s ' % data['video_cover_addr'])
                print('视频时长%s 秒' % data['video_duration'])
                print('视频标题:%s ' % data['video_title'])
                print('视频摘要:%s ' % data['video_summary'])
                print('视频分类:%s ' % data['video_category'])
            elif data['status'] == '5':
                print('视频生成失败!')
                print(data['fail_reason'])
            elif data['status'] == '2' or data['status'] == '3':
                print('任务排队或者生成中。。。')
                print('任务信息id为%s' % data['job_id'])
                print('预计结束时间为:%s' %data['estimate_finish_time'])
            else:
                print('视频还在生成中,请耐心等待。。。')
                print('任务信息id为%s' % data['job_id'])
                print('预计结束时间为:%s' %data['estimate_finish_time'])

        else:
            print('不知道这是什么')
    else:
        print('服务暂时不可用,可能是视频已经生成,请重试!')

   
# 中止任务
def stop_task():
    print('准备中止任务。。。')
    job_id = int(input('请输入你要中止的任务id:'))
    data = {
    'job_id':job_id
    }
    r = requests.get(url = url_d.format(get_AccessToken(),data = data,headers=headers))
    info = r.json()
    if info['error_code'] == 0:
        print('中止的任务信息为:%s' %info['result'])
    else:
        print('该任务不存在,请检查输入数据后再试!')


def main():
    num = int(input('请输入你要进行的操作:【0:创建任务】 【1:查询任务】 【2:中止任务】'))

    if num == 0:
        get_video()

    if num == 1:
        find_task()

    if num == 2:
        stop_task()

if __name__ == '__main__':
    main()

 

声明:本文图片、文字、视频等内容来源于互联网,本站无法甄别其准确性,建议谨慎参考,本站不对您因参考本文所带来的任何后果负责!本站尊重并保护知识产权,本文版权归原作者所有,根据《信息网络传播权保护条例》,如果我们转载内容侵犯了您的权利,请及时与我们联系,我们会做删除处理,谢谢。

 

相关内容