暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

视频配音也社恐?文本批量转语音!

Python都知道 2022-10-07
242

最近知乎小说推文的项目很火,主要路径是:通过抖音为盐选专栏导流,赚取佣金。具体做法是在盐选专栏上选择要付费阅读的,申请关键字绑定,再把前两章文本配音,以自然风光,美食制作等解压视频为背景,制作成自己的视频,发布在抖音上,引导用户去知乎付费阅读,即可抽成,每单6元,每个月都需开通会员。看起来钱景不错,但是社恐,怕声音不好听,最关键的是懒,不想每次配音,那就用python来自动转换吧。

01 文本处理

从知乎中选取可以推广的小说节选,保存在txt中,格式统一用utf-8,文件名就用小说名称。

文本太长,肯定不想手动去划分,采用脚本每次分隔500字左右,以句号分隔,每篇文章做三段配音,配音名称也采用小说名称,多余文本暂时舍弃,后续如果想多分几段,改参数即可。

1、遍历文件夹下的txt 懒人当然不想一次次的打开脚本去跑,循环读取文件夹下准备好的小说片段。

def list_file(path, len):
    dirs = os.listdir(path)

    for file in dirs:
        if os.path.splitext(file)[1] == '.txt':
            full_file_path = os.path.join(path, file)
            file_path = os.path.join(path, os.path.splitext(file)[0])
            split_file(full_file_path,file_path, len)
            # print(os.path.splitext(file))

2、分割文本 由于REST API 仅支持最多512字(1024字节)的音频合成,文本长度超过限制会报错,合成的文件格式为mp3。如果本文长度较长,需要采用多次请求的方式。通常正常语速,500字转成语音大概是1分40秒左右。

def split_file(path,file_name,len):
    with open(path, 'r', encoding='utf-8', errors='ignore'as file:
        file_str = file.read()
        if file_str.__len__() <= 0return
        i = 0
        while i < 3:
            substr = file_str[0:len]
            index = substr.rfind('。')
            if index <= 0 : return
            substr = file_str[0:index+ 1]
            print(substr)
            tts(substr,file_name + '_' + str(i))
            print(file_name + '_' + str(i) + ' to voice success.')
            file_str = file_str[(index + 1):]
            i = i + 1
            if(file_str.__len__() < len):
                break

02 申请百度sdk

百度智能云使用前需要先实名认证,这部分提前准备好,我们从领取能力开始说明。

1、领取能力

2、创建应用 创建应用,获取密钥,随便取个应用的名称,这里取个朴素的名字“无所不能的python都知道”

3、复制api_key、secret_key

# 填写网页上申请的appkey 如 API_KEY="g8eBUMSokVB1BHGmgxxxxxx"
API_KEY = '4E1BG9lTnlSeIf1NQFlrxxxx'

# 填写网页上申请的APP SECRET 如 SECRET_KEY="94dc99566550d87f8fa8ece112xxxxx"
SECRET_KEY = '544ca4657ba8002e3dea3ac2f5fxxxxx'

4、生成token 拿到钥匙后,就可以准备去撬门了。按照官方文档,调用百度认证接口,生成token。


"""  TOKEN start """

TOKEN_URL = 'http://aip.baidubce.com/oauth/2.0/token'
SCOPE = 'audio_tts_post'  # 有此scope表示有tts能力,没有请在网页里勾选


def fetch_token():
    print("fetch token begin")
    params = {'grant_type''client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()

    print(result_str)
    result = json.loads(result_str)
    print(result)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not SCOPE in result['scope'].split(' '):
            raise DemoError('scope is not correct')
        print('SUCCESS WITH TOKEN: %s ; EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
        return result['access_token']
    else:
        raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')


"""  TOKEN end """

03 生成配音文件

拿到token后,设置常用的配置,如语速,播音员,生成音频格式等,这些做为入参,请求百度TTS接口,将文件流写入本地文件中,通常采用mp3格式,一个音频200多k。

def tts(TEXT,file_name):
    token = fetch_token()
    tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode
    # print(tex)
    params = {'tok': token, 'tex': tex, 'per': PER, 'spd': SPD, 'pit': PIT, 'vol': VOL, 'aue': AUE, 'cuid': CUID,
              'lan''zh''ctp'1}  # lan ctp 固定参数

    data = urlencode(params)
    print('test on Web Browser' + TTS_URL + '?' + data)

    req = Request(TTS_URL, data.encode('utf-8'))
    has_error = False
    try:
        f = urlopen(req)
        result_str = f.read()

        headers = dict((name.lower(), value) for name, value in f.headers.items())

        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
    except  URLError as err:
        print('asr http response http code : ' + str(err.code))
        result_str = err.read()
        has_error = True

    save_file = "error.txt" if has_error else file_name+'.' + FORMAT
    with open(save_file, 'wb'as of:
        of.write(result_str)

    if has_error:
        if (IS_PY3):
            result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)

    print("result saved as :" + save_file)

04 常用配置

基础音库中选择发音人:也就是虚拟人物,表示不同音色。基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫

度丫丫比较嗲,甜甜的,适合言情,女生小说,度逍遥比较阳刚,严肃,适合历史,玄幻小说。

至此配音文件已经全部生成,后期合并到视频素材中即可。


# 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
# 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美
PER = 4
# 语速,取值0-15,默认为5中语速
SPD = 5
# 音调,取值0-15,默认为5中语调
PIT = 5
# 音量,取值0-9,默认为5中音量
VOL = 5
# 下载的文件格式, 3:mp3(default) 4:pcm-16k 5:pcm-8k 6. wav
AUE = 3

FORMATS = {3"mp3"4"pcm"5"pcm"6"wav"}
FORMAT = FORMATS[AUE]

CUID = "123456PYTHON"

TTS_URL = 'http://tsn.baidu.com/text2audio'


04 结论

小说文本也可以通过爬虫来做,但是素材采集类的决定了有没有人看,建议人工来做,小说推文的音频就准备好了,后面再自动化配上视频和字幕。灵性的事情人工做,呆板的事机器做

PSPython都知道技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复:666,即可进入。


老规矩,道友们还记得么,右下角的 “在看” 点一下如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!



文章转载自Python都知道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论