批量统计wav音频总时长的三种方法

一、使用Python-sox模块包

使用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)

二、使用wave+contextlib

使用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更精确一些。

三、使用sox包

在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

四、求教根据音频文件大小求音频时长

听大佬说过可以根据音频文件大小(不知道能不能根据音频文件夹大小)计算音频时长,百度查了查有一种方法可以计算,但是算出来的总时长跟估计的总时长相差很多,有大佬知道怎么计算的话,可以麻烦下在评论中告知一下下的哈

五、win环境使用playtime软件

自行百度搜索用法,就是音频文件比较多的时候会比较慢且卡,计算的时长比较准确

你可能感兴趣的:(python,sox)