英语听力自动断句程序

自动断句程序

本程序的最初设计目的是为了实现:

输入一个英语听力对话文件,开始播放,每说一句自动暂停,然后选择下一句还是重复该句,直到播放结束。

源代码如下:

import wave
import numpy
import pylab as pl
from numpy import *
# 打开wav文件
f = wave.open(r"test1.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# print(nchannels, sampwidth, framerate, nframes)
str_data = f.readframes(nframes)
f.close()

# 将波形数据转换成数组
# 需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
wave_data.shape = -1,2
wave_data2=wave_data.T[0]  #此数据即0通道为能量数据
l=len(wave_data2)
# sec = 0.05  #定义单位时间,也是预计停顿间隔时间
# emax= 100   #定义判定能量

def point(sec,emax):
    intl=l%int(sec*44100)
    wave_data1=delete(wave_data2,arange(l-intl,l+1),0)     #删除掉后面的数据
    wave_data1.shape = -1,int(sec*44100)                   #形成数据矩阵,列数即每个时间间隔内的数据
    wave_data1=abs(wave_data1)
    # times = numpy.arange(0, nframes) * (1.0 / framerate)
    enemax = amax(wave_data1, axis=1)                       #寻找到每个时间间隔内最大的能量值
    eneave=sum(wave_data1,axis=1)/len(wave_data1)           #计算每个时间间隔内平均的能量值
    idx=list(where(enemax-eneave<emax)[0])
    i=1
    wr=[[0]]
    j=0
    for i in range(len(idx)):                              #如果实际停顿时间远大于预估停顿时间则进行筛选
        if (int(idx[i])-int(idx[i-1]))<1.5/sec:                  #相邻
            wr[j].extend([idx[i]])
        else:
            wr.append([idx[i]])
            j=j+1
    idx=[]
    for i in range(len(wr)):
        idx.append(wr[i][int(len(wr[i])/2)])

    dataload=array(idx)*sec
    dataload=dataload[dataload>33]
    return dataload

这个函数就是为了解析音频文件,最终输出每个断句的时间点。但会根据输入不同的停顿时间,和停顿时最小能量判定值,会输出不同的结果,故需要进行优化。

判断是否需要断句的条件就是在某个单位时间区间内,声音能量的最大值是否小于某值

a=0.01
pl.subplot(111)
for emax in range(300,1100,100):
    lll=[]
    num=[]
    for seca in range(1,20):
        datamax=point(float(seca*a),int(emax))
        lll.append(len(datamax))
        num.append(len(where(datamax<80)[0]))
    secv=arange(1,20)*a
    print(emax)
    pl.plot(secv,lll,label=str(emax))
pl.legend(loc='upper left')
pl.grid()
pl.show()

这个就根据不同的输入能量判定值和预计时间间隔,画图,找到最合适的停顿点。(尽可能将停顿点稍多一点并均匀)

from numpy import *
import pygame
import time

# file=input("请输入分句记录点文件放入本程序目录,并输入文件名\n")
file=r'data1.txt'
f=open(file)
times=list()
for line in f.readlines():
    inearr = line.strip()
    times.append(inearr)
file=r'test1.mp3'

i=0
print()
while i != len(times)-1:
    print('这是第 %s 段音频,共 %s 段音频。' %((i+1),(len(times)-1)))
    pygame.mixer.init()
    track = pygame.mixer.music.load(file)
    pygame.mixer.music.play(0,float(times[i]))
    time.sleep(float(times[i+1])-float(times[i]))
    pygame.mixer.music.stop()
    str=input('键入1进行下一句,其它则重复本句\n')
    if str == '1' :
        print('读取下一句')
        i += 1
    else: i = i
print('播放结束')

最后就是播放音频的主函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值