使用Python的第三方模块包 sox,pip安装即可,使用这种方法,耗时比较长。
pip install sox
import os
import sox
path = './audio_dir'
ii = 0
total_second = 0
for wav in os.listdir(path):
wav_path = os.path.join(path, wav)
if wav_path.endswith('.wav'):
ii += 1
try:
wav_info = sox.file_info.info(wav_path)
wav_duration = wav_info['duration']
total_second += wav_duration
except Exception as e:
print(e, wav_path)
print("wav nums: ", ii)
print("second: ", total_second)
print("Effective hours: ", total_second/3600)
使用Python自带的wave和contextlib模块,速度会比使用第三方模块包sox快很多
import wave
import contextlib
import os
import time
t = time.time()
wav_dir = "./audio_dir"
total_time = 0
ii = 0
with open('contextlib_duration.txt', 'w', encoding='utf-8')as log:
for file in os.listdir(wav_dir):
ii += 1
file_path = os.path.join(wav_dir, file)
with contextlib.closing(wave.open(file_path, 'r')) as f:
frames = f.getnframes() # 帧数
rate = f.getframerate() # 帧率(每秒的帧数)
duration = frames / float(rate) # 单位:秒
total_time = total_time + duration
content = file + " " + str(duration) + "\n"
log.write(content)
print("wave num", ii)
print("total_time = ",total_time)
print("Effective hours: ", total_second/3600)
print(time.time() - t)
参考网址
https://blog.csdn.net/dongzichen2015/article/details/100172384?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
使用Python sox 获取音频时长耗时很长,获取36W条音频数据的总时长,用时12H;
使用wave+contextlib.closing 获取音频时长耗时短,获取36W条音频数据的总时长,用时1H42分钟
以上两种方法都没有使用多进程,单进程执行,可以看出使用Python内置包wave的速度。
但是两种方法最终获取到的总时长有一点点差别,差距在0.011毫秒之内,用Python sox方法获取音频时长比wave(帧数/速率)方法多0.01毫秒。是有一些音频时长稍微有点不同 。主要原因可能是因为小数点位数保留不同四舍五入造成的值差异,Python sox 是6位小数 wave是7位小数,可能是使用wave更精确一些。
在Linux环境下使用sox包,看自己是在那种Linux环境下选择合适的安装方法
yum install sox
brew install sox
ls ./audio_dir/ | xargs -I {} sox ./audio_dir/{} -n stat > duration.log 2>&1
不在后面加上2>&1,可能sox执行结果不会打印到duration.log,只会在终端上显示,也可以使用nohup将输出打印到指定日志中。
# 将命令写入到文件
vim test.sh
ls ./audio_dir/ | xargs -I {} sox ./audio_dir/{} -n stat
nohup sh test.sh > duration.log
cat duration.log |grep 'Length' |cut -d':' -f 2 >time.txt
参考网址
https://www.jianshu.com/p/0fa3a8d4b979
因为这种方法与我最终想要的文本格式不太一致,需要“文件名 音频时长”格式导入日志文件,最后没有成功,有大佬知道怎么文本格式化输出也可以告知我一下下哈
其他参考网址
http://www.mamicode.com/info-detail-2098172.html
https://blog.csdn.net/yogurt0928/article/details/46625731
https://www.jianshu.com/p/f43a6f22297b
听大佬说过可以根据音频文件大小(不知道能不能根据音频文件夹大小)计算音频时长,百度查了查有一种方法可以计算,但是算出来的总时长跟估计的总时长相差很多,有大佬知道怎么计算的话,可以麻烦下在评论中告知一下下的哈
自行百度搜索用法,就是音频文件比较多的时候会比较慢且卡,计算的时长比较准确