[speech] 统计音频文件总时长
2017-11-21 15:16
453 查看
统计音频文件总时长
两种实现方法,调用sox工具,调用python wave库。sox
命令行中键入sox wavfile -n stat
-bash-4.2$ sox arctic_a0001.wav -n stat Samples read: 53680 Length (seconds): 3.355000 Scaled by: 2147483647.0 Maximum amplitude: 0.628510 Minimum amplitude: -0.649933 Midline amplitude: -0.010712 Mean norm: 0.069802 Mean amplitude: -0.000027 RMS amplitude: 0.114387 Maximum delta: 0.332764 Minimum delta: 0.000000 Mean delta: 0.019452 RMS delta: 0.033908 Rough frequency: 754 Volume adjustment: 1.539
其中的length就是长度,单位seconds。
Code
import os,sys import os,sys import math import subprocess import csv wavdir = 'wav' txtdir = 'txt' wavlst = os.listdir(wavdir) total = 0 def get_wav_duration(wav_id): cmd = "sox {} -n stat 2>&1".format(os.path.join(wavdir,wav_id)) tmp = os.popen(cmd) dur_line = tmp.readlines()[1].split() dur = math.floor(float(dur_line[2]) * 10)/10 #print dur global total total = total + dur return str(dur) with open('text.csv','wb') as csvfile: writer = csv.writer(csvfile) for wav_id in wavlst: utt_id = wav_id.split('.')[0] duration = get_wav_duration(wav_id) #sound_nframe = os.path.join(wavdir, utt_id) write_tmp = [utt_id, duration] writer.writerow(write_tmp) print(total)
os.popen简记
python中调用外部命令行命令,主要使用os.system(cmd)和
os.popen(cmd),两个命令的区别在于前者返回cmd退出状态码,后者能够返回脚本执行过程中的输出内容。在python的document中貌似并不推荐
os.popen,推荐使用
subprocess.popen,用法稍微复杂。
os.system
#!/bin/bash echo "hello world!" exit 3 os.system(cmd):返回16bit,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码(即高位信号有用) >>> n = os.system(test.sh) >>> n >> 8 >>> 3
os.popen
这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容),如果需要其他的内容,就需要使用重定向
2>&1【注意重定向】。
import os cmd = 'echo haha' tmp = os.popen(cmd).readlines() print(tmp)
wave lib
统计The World English Bible中语音的时长,12G的文件,两层文件夹,统计后总时长为263965.387755s(约73h)import os import wave import contextlib def get_wav_duration(fname, print_flag=0): with contextlib.closing(wave.open(fname,'r')) as f: frames = f.getnframes() rate = f.getframerate() wav_duration = frames / float(rate) if str(print_flag) != '0': print('wav time: {}'.format(wav_duration)) return wav_duration wavdirdir = 'WEB' wavdirlst = os.listdir(wavdirdir) wavlst = [] for lst in wavdirlst: wavdir = os.path.join(wavdirdir,lst) wavpath = os.listdir(wavdir) for wav in wavpath: wavlst.append(os.path.join(wavdir,wav)) total = 0 for lst in wavlst: total += get_wav_duration(lst) print(total)
Reference
http://blog.csdn.net/yogurt0928/article/details/46625731
https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/6/README.html
http://blog.csdn.net/windone0109/article/details/8895875
https://www.cnblogs.com/bluescorpio/archive/2010/05/04/1727020.html
http://blog.csdn.net/y_xianjun/article/details/73245482
相关文章推荐
- DotNetSpeech 可以生成Wave音频文件
- 统计多个wav文件的总音频时长
- linux统计文件、文件目录个数
- linux下如何统计一个目录下的文件个数以及代码总行数的命令
- Linux下统计当前文件夹下的文件个数、目录个数
- 实战4--读入文件统计
- 利用DirectShow开发C#版的音频文件播放器(三)
- Android扫描文件并统计各类文件数目
- DirectX 因素:在 Windows 8 中流式载入和处理音频文件
- Linux统计文件夹下的文件数目
- 使用Octave音频处理(三):数学技术处理音频文件
- directshow实现音频采集设备的输入音量控制和媒体文件播放音量控制
- 【C#获取音频文件的播放时间】
- Unity3D游戏场景之播放音频文件
- Linux统计目录下文件个数及代码行数
- Java统计文件夹中文件总行数
- 付费音乐的纠结——何为“正版音频文件”?
- C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组
- 单线程,多线程,线程池方法大文件指定单词数量统计
- MPEG音频文件格式(包括MP3文件格式)详解