吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2793|回复: 15
收起左侧

[其他原创] 删删删删帖

[复制链接]
隰则有泮 发表于 2018-7-27 21:12
[ 本帖最后由 隰则有泮 于 2019-4-13 19:45 编辑 ]\n\n........................

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
wushaominkk + 3 + 1 鼓励新人贴!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 隰则有泮 发表于 2018-7-27 21:13
[ 本帖最后由 隰则有泮 于 2019-4-13 19:46 编辑 ]\n\n[ 本帖最后由 隰则有泮 于 2018-7-29 12:35 编辑 ]\n\n[md]# 三、文件/音频处理 #
1.获取单词列表  
~~~
def get_word_list(path):
    with open(path, 'r') as f:
        word_list = [each_word.strip('\n') for each_word in f.readlines()]
    word_numbwes = len(word_list)
    if float(word_numbwes / 50) != float(word_numbwes // 50):
        part_numbers = word_numbwes // 50 + 1
        final_list = [word_list[50 * i:50 * (i + 1)] for i in range(0, part_numbers - 1)]
        final_list.append(word_list[50 * (part_numbers - 1):])
    else:
        part_numbers = word_numbwes // 50
        final_list = [word_list[50 * i:50 * (i + 1)] for i in range(0, part_numbers)]
    return final_list
~~~
(1)获取文本文件中每个单词,组成一个列表。  
~~~
def get_word_list(path):
    with open(path, 'r', encoding='utf-8') as f:
        word_list = [each_word.strip('\n') for each_word in f.readlines()]
~~~
(2)考虑到如果单词很多,这个列表就变得很大,制作出来的音频文件也会很大,所以,把所有的单词一五十个为一组分离,不足50个的按50个计算。以下的代码可以实现.
~~~
word_numbwes = len(word_list)
    if float(word_numbwes / 50) != float(word_numbwes // 50):
        part_numbers = word_numbwes // 50 + 1
        final_list = [word_list[50 * i:50 * (i + 1)] for i in range(0, part_numbers - 1)]
        final_list.append(word_list[50 * (part_numbers - 1):])
    else:
        part_numbers = word_numbwes // 50
        final_list = [word_list[50 * i:50 * (i + 1)] for i in range(0, part_numbers)]
~~~

2.进行音频处理。  
(1)将准备过程中的ffmpeg包的bin文件夹下的ffmpeg.exe文件解压到和你py文件所在的同一目录下。(pydub MP3处理底层依赖ffmpeg)  
(2)编写main函数.
~~~
import time
from pydub import AudioSegment
from io import BytesIO
~~~
第一个可以计算程序所需要的时间,第二个是音频处理库。第三个可以用BytesIO实现在内存中读写bytes。
~~~
def main(path, type=1):
    srart_time = time.time()
    all_parts_list = get_word_list(path)
    print('一共有{}个部分。'.format(len(all_parts_list)))

    for each_part_index, each_part in enumerate(all_parts_list):
        all_sounds = AudioSegment.empty()
~~~
创建空AudioSegment用来循环合成长音频。
~~~
        for each_word_index, each_word in enumerate(each_part):
            mp3_sound = download_mp3(get_page(each_word), type)
~~~
获得MP3数据
~~~
            if mp3_sound:
                all_sounds += AudioSegment.from_file(BytesIO(mp3_sound), format='mp3')+ AudioSegment.silent(duration=300)
                print('第{}部分:第{}个单词,{}的音频已下载!程序已用时{}秒'.format(each_part_index + 1, each_word_index, each_word,
                                                              time.time() - srart_time))
            else:
                all_sounds += AudioSegment.from_file('bi.wav', format='wav')+ AudioSegment.silent(duration=300)
                print('第{}部分:第{}个单词,{}的音频未找到!程序已用时{}秒'.format(each_part_index + 1, each_word_index, each_word,
                                                              time.time() - srart_time))
~~~
进行判断,如果有数据直接进行拼接,如果这个数据不存在,那么使用自定义的音频文件进行拼接。我这里使用了一个消音的‘bi’声。你自己可以任意替换。如果直接拼接,速度可能太快,因此我在两个音频之间加了零点三秒的静音。  
`all_sounds.export('part_{}.mp3'.format(each_part_index + 1), format='mp3')`接着输出这部分的音频文件.  

----------
这部分的完整代码如下
~~~
'''文件/音频处理模块'''
import time
from pydub import AudioSegment
from io import BytesIO

def get_word_list(path):
    with open(path, 'r', encoding='utf-8') as f:
        word_list = [each_word.strip('\n') for each_word in f.readlines()]
    word_numbwes = len(word_list)
    if float(word_numbwes / 50) != float(word_numbwes // 50):
        part_numbers = word_numbwes // 50 + 1
        final_list = [word_list[50 * i:50 * (i + 1)] for i in range(0, part_numbers - 1)]
        final_list.append(word_list[50 * (part_numbers - 1):])
    else:
        part_numbers = word_numbwes // 50
        final_list = [word_list[50 * i:50 * (i + 1)] for i in range(0, part_numbers)]
    return final_list


def main(path, type=1):
    srart_time = time.time()
    all_parts_list = get_word_list(path)
    print('一共有{}个部分。'.format(len(all_parts_list)))

    for each_part_index, each_part in enumerate(all_parts_list):
        all_sounds = AudioSegment.empty()

        for each_word_index, each_word in enumerate(each_part):
            mp3_sound = download_mp3(get_page(each_word), type)
            if mp3_sound:
                all_sounds += AudioSegment.from_file(BytesIO(mp3_sound), format='mp3')+ AudioSegment.silent(duration=300)
                print('第{}部分:第{}个单词,{}的音频已下载!程序已用时{}秒'.format(each_part_index + 1, each_word_index, each_word,
                                                              time.time() - srart_time))
            else:
                all_sounds += AudioSegment.from_file('bi.wav', format='wav')+ AudioSegment.silent(duration=300)
                print('第{}部分:第{}个单词,{}的音频未找到!程序已用时{}秒'.format(each_part_index + 1, each_word_index, each_word,
                                                              time.time() - srart_time))
        all_sounds.export('part_{}.mp3'.format(each_part_index + 1), format='mp3')
        print('第{}部分的单词已制作好!已用时{}秒.'.format(each_part_index + 1, time.time() - srart_time))

    print('全部单词已制作好,程序共用{}秒!'.format(time.time() - srart_time))

~~~
# 四、最后的话 #
这个劣♂质的教程到这里差不多就结束了。实测一百个单词可以不用一分钟就解决。![]([img]https://i.imgur.com/uR9VRvv.png[/img])  
源码我已经打包好了。[https://pan.baidu.com/s/12fl0Vaf6481fTZYbnwzTcQ](https://pan.baidu.com/s/12fl0Vaf6481fTZYbnwzTcQ "百度网盘")  
密码: wd6j  
其中ffmpeg.exe文件我是下载的64位版。如果你的系统是32位,那请自行到官网去下载。(详情上一篇)  

参考答案.zip

208 Bytes, 下载次数: 3, 下载积分: 吾爱币 -1 CB

 楼主| 隰则有泮 发表于 2018-7-27 21:14
本帖最后由 隰则有泮 于 2018-8-2 22:35 编辑

3楼备用
紫薯补
特种兵军品 发表于 2018-7-27 21:30
ydf1098542619 发表于 2018-7-27 21:43
python py os
yifeng 发表于 2018-7-27 21:44
感觉Python越来越像外国版的易语言,干啥用模块就行了
moranyuyan 发表于 2018-7-27 22:07
谢谢分享
CJTRAND 发表于 2018-7-27 22:23
这个网址的生成很有规律
轻轻的我来了 发表于 2018-7-27 22:43
仰望一下大神
wangsm 发表于 2018-7-27 23:03
厉害哦,可以弄来学习一下。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 18:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表