好友
阅读权限10
听众
最后登录1970-1-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
|