易学库易学库

易学库(生活百科)
优质互联网资讯分享平台!!!
文章1436浏览166508本站已运行41128

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

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

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

不过目前能力,一次只能转一条图文。BAz易学库

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

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

1.一个百度账号

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

 BAz易学库

 BAz易学库

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

BAz易学库

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

2.一个百家号

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

BAz易学库

 BAz易学库

 BAz易学库

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

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

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

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

这里还要注意的一点是:BAz易学库

图文内容不要太长,文字控制在500字以内BAz易学库

原因我后面会说到。BAz易学库

3.获取access_token

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

 BAz易学库

 

 BAz易学库

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

 

BAz易学库

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

4.图文生成视频

4-1创建视频任务

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

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

我们继续。BAz易学库

关于接口的描述是这样的:BAz易学库

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

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

请求的内容还有2个,一个是请求头,一个是请求参数BAz易学库

其中请求头是固定的BAz易学库

BAz易学库

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

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

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

但是,这说明了什么呢?BAz易学库

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

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

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

BAz易学库

生成图文视频的代码如下:BAz易学库

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

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

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

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

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

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

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

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

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

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

 BAz易学库

 

 BAz易学库

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

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

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

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

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

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

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

4-3 中止视频任务

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

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

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

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

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

5-完整代码

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

输入的顺序是:BAz易学库

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

如果是0,那么需要输入以下:BAz易学库

(2)输入文章链接BAz易学库

(3)输入发音人(数字代号)BAz易学库

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

如果是2,那么需要输入任务idBAz易学库

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

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

完结,撒花~~~BAz易学库

1BAz易学库
2BAz易学库
3BAz易学库
4BAz易学库
5BAz易学库
6BAz易学库
7BAz易学库
8BAz易学库
9BAz易学库
10BAz易学库
11BAz易学库
12BAz易学库
13BAz易学库
14BAz易学库
15BAz易学库
16BAz易学库
17BAz易学库
18BAz易学库
19BAz易学库
20BAz易学库
21BAz易学库
22BAz易学库
23BAz易学库
24BAz易学库
25BAz易学库
26BAz易学库
27BAz易学库
28BAz易学库
29BAz易学库
30BAz易学库
31BAz易学库
32BAz易学库
33BAz易学库
34BAz易学库
35BAz易学库
36BAz易学库
37BAz易学库
38BAz易学库
39BAz易学库
40BAz易学库
41BAz易学库
42BAz易学库
43BAz易学库
44BAz易学库
45BAz易学库
46BAz易学库
47BAz易学库
48BAz易学库
49BAz易学库
50BAz易学库
51BAz易学库
52BAz易学库
53BAz易学库
54BAz易学库
55BAz易学库
56BAz易学库
57BAz易学库
58BAz易学库
59BAz易学库
60BAz易学库
61BAz易学库
62BAz易学库
63BAz易学库
64BAz易学库
65BAz易学库
66BAz易学库
67BAz易学库
68BAz易学库
69BAz易学库
70BAz易学库
71BAz易学库
72BAz易学库
73BAz易学库
74BAz易学库
75BAz易学库
76BAz易学库
77BAz易学库
78BAz易学库
79BAz易学库
80BAz易学库
81BAz易学库
82BAz易学库
83BAz易学库
84BAz易学库
85BAz易学库
86BAz易学库
87BAz易学库
88BAz易学库
89BAz易学库
90BAz易学库
91BAz易学库
92BAz易学库
93BAz易学库
94BAz易学库
95BAz易学库
96BAz易学库
97BAz易学库
98BAz易学库
99BAz易学库
100BAz易学库
101BAz易学库
102BAz易学库
103BAz易学库
104BAz易学库
105BAz易学库
106BAz易学库
107BAz易学库
108BAz易学库
109BAz易学库
110BAz易学库
111BAz易学库
112BAz易学库
113BAz易学库
114BAz易学库
115BAz易学库
116BAz易学库
117BAz易学库
118BAz易学库
119BAz易学库
120BAz易学库
121BAz易学库
122BAz易学库
123BAz易学库
124BAz易学库
125BAz易学库
126BAz易学库
127BAz易学库
128BAz易学库
129BAz易学库
130BAz易学库
131BAz易学库
132BAz易学库
133BAz易学库
134BAz易学库
135BAz易学库
136BAz易学库
137BAz易学库
138BAz易学库
139BAz易学库
140BAz易学库
141BAz易学库
142BAz易学库
143BAz易学库
144
import requestsBAz易学库
import jsonBAz易学库
BAz易学库
'''BAz易学库
1.视频任务创建接口BAz易学库
2.视频任务查询接口BAz易学库
3.视频任务中止接口BAz易学库
BAz易学库
其他:BAz易学库
1.每秒钟大约5个字(包含标点符号)BAz易学库
2.视频会自动包含片头片尾,总计约8秒时长BAz易学库
3.视频时长设置为:字数/(时长+8秒)BAz易学库
4.接口调用说明文档:https://ai.baidu.com/ai-doc/NLP/Zk7ylspjv#%E8%BF%94%E5%9B%9E%E8%AF%B4%E6%98%8E-1BAz易学库
5.程序基于百度AI开放平台BAz易学库
BAz易学库
'''BAz易学库
# 自然语言处理账户BAz易学库
appid = ***BAz易学库
api_key = '输入你自己的'BAz易学库
s_key = '输入你自己的'BAz易学库
BAz易学库
# 几个接口的urlBAz易学库
url = 'https://aip.baidubce.com/rest/2.0/nlp/v1/create_vidpress?access_token={}'BAz易学库
url_f = 'https://aip.baidubce.com/rest/2.0/nlp/v1/query_vidpress?access_token={}'BAz易学库
url_d = 'https://aip.baidubce.com/rest/2.0/nlp/v1/delete_vidpress?access_token={}'BAz易学库
BAz易学库
headers = {BAz易学库
    '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',BAz易学库
    'Content-Type':'application/x-www-form-urlencoded'BAz易学库
}BAz易学库
BAz易学库
BAz易学库
# 获取sccess token函数BAz易学库
def get_AccessToken():BAz易学库
    url_a = 'https://aip.baidubce.com/oauth/2.0/token'BAz易学库
    data = {BAz易学库
    'grant_type':'client_credentials',BAz易学库
    'client_id':api_key,BAz易学库
    'client_secret':s_keyBAz易学库
    }BAz易学库
    r = requests.get(url=url_a,params=data)BAz易学库
    return r.json()['access_token']BAz易学库
BAz易学库
# 获取是否创建成功函数BAz易学库
def get_video():BAz易学库
    # 百家号文章urlBAz易学库
    news_url = input('请粘贴你需要转为视频的百家号图文链接:')BAz易学库
BAz易学库
    # 发音人BAz易学库
    print('发音人【0:度小美,1:度小宇,3:度逍遥,4:度丫丫,100:度小雯,103:度米朵,106:度博文】')BAz易学库
    tts_per = int(input('请按照上述输入发音人数字:'))BAz易学库
BAz易学库
    # 目标视频时长,单位:秒,要求40 - 120秒BAz易学库
    # 40秒字数:160个字;120秒字数:560个字BAz易学库
    duration = int(input('请输入视频时长(范围是40-120),单位是秒:'))BAz易学库
BAz易学库
    # 请求参数BAz易学库
    data = {BAz易学库
    'news_url':news_url,BAz易学库
    'tts_per':tts_per,BAz易学库
    'duration':durationBAz易学库
    }BAz易学库
    r = requests.post(url = url.format(get_AccessToken()),data = data,headers=headers)BAz易学库
    info = r.json()BAz易学库
    if info['error_code'] == 0:BAz易学库
        print('视频创建成功!')BAz易学库
        job_id = info['result']['job_id']BAz易学库
        time_e = info['result']['estimate_finish_time']BAz易学库
        print('预计需结束时间为:%s' % time_e)BAz易学库
        print('视频id为:%s,请注意保存!' % job_id)BAz易学库
    else:BAz易学库
        # 查询任务BAz易学库
        print(info['error_msg'])BAz易学库
        find_task()BAz易学库
BAz易学库
BAz易学库
# 查找进行中的任务BAz易学库
def find_task():BAz易学库
    print('正在查询进行中的任务。。。')BAz易学库
    r = requests.get(url = url_f.format(get_AccessToken(),headers=headers))BAz易学库
    info = r.json()BAz易学库
    if info['error_code'] == 0:BAz易学库
        # print('进行中的任务信息为:%s' %info['result'])BAz易学库
        result = info['result']BAz易学库
        # 假如result有内容,也即创建任务成功BAz易学库
        if len(result):BAz易学库
            s = list(result.keys())[0]BAz易学库
            data = result[s]BAz易学库
            if data['status'] == '4':BAz易学库
                print('恭喜视频生成成功!')BAz易学库
                print('视频文件失效时间:%s ' % data['expire_time'])BAz易学库
                print('视频下载链接为:%s ' %data['video_addr'])BAz易学库
                print('视频封面下载链接为:%s ' % data['video_cover_addr'])BAz易学库
                print('视频时长%s 秒' % data['video_duration'])BAz易学库
                print('视频标题:%s ' % data['video_title'])BAz易学库
                print('视频摘要:%s ' % data['video_summary'])BAz易学库
                print('视频分类:%s ' % data['video_category'])BAz易学库
            elif data['status'] == '5':BAz易学库
                print('视频生成失败!')BAz易学库
                print(data['fail_reason'])BAz易学库
            elif data['status'] == '2' or data['status'] == '3':BAz易学库
                print('任务排队或者生成中。。。')BAz易学库
                print('任务信息id为%s' % data['job_id'])BAz易学库
                print('预计结束时间为:%s' %data['estimate_finish_time'])BAz易学库
            else:BAz易学库
                print('视频还在生成中,请耐心等待。。。')BAz易学库
                print('任务信息id为%s' % data['job_id'])BAz易学库
                print('预计结束时间为:%s' %data['estimate_finish_time'])BAz易学库
BAz易学库
        else:BAz易学库
            print('不知道这是什么')BAz易学库
    else:BAz易学库
        print('服务暂时不可用,可能是视频已经生成,请重试!')BAz易学库
BAz易学库
   BAz易学库
# 中止任务BAz易学库
def stop_task():BAz易学库
    print('准备中止任务。。。')BAz易学库
    job_id = int(input('请输入你要中止的任务id:'))BAz易学库
    data = {BAz易学库
    'job_id':job_idBAz易学库
    }BAz易学库
    r = requests.get(url = url_d.format(get_AccessToken(),data = data,headers=headers))BAz易学库
    info = r.json()BAz易学库
    if info['error_code'] == 0:BAz易学库
        print('中止的任务信息为:%s' %info['result'])BAz易学库
    else:BAz易学库
        print('该任务不存在,请检查输入数据后再试!')BAz易学库
BAz易学库
BAz易学库
def main():BAz易学库
    num = int(input('请输入你要进行的操作:【0:创建任务】 【1:查询任务】 【2:中止任务】'))BAz易学库
BAz易学库
    if num == 0:BAz易学库
        get_video()BAz易学库
BAz易学库
    if num == 1:BAz易学库
        find_task()BAz易学库
BAz易学库
    if num == 2:BAz易学库
        stop_task()BAz易学库
BAz易学库
if __name__ == '__main__':BAz易学库
    main()
易学库
上一篇: 帝国CMS改造https之后内容页不显示图片和Js的解决方法
下一篇: 帝国CMS批量提取新闻内容第一张图作为标题缩略图的方法

相关推荐

隐藏边栏