查看: 101|回复: 0|关注: 0
打印 上一主题 下一主题

快乐扑克胆拖: [已答复] 端点检测后要怎么保存音频呢

[复制链接]

新手

5 麦片

财富积分


快乐扑克3如何跟对子 www.vqxik.tw 050


4

主题

8

帖子

0

最佳答案
跳转到指定楼层
1#
发表于 2019-11-24 20:38:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按照宋知用老师的书仿照着写了程序对语音进行端点检测,但是不知道如何把处理后的音频保存下来,请问有人知道吗?
function duandianjiance
clc;close all;
[x,fs] = audioread('E:\\1matlab\\filter.wav');
x=double(x);
x=x/max(abs(x));  %幅度归一化

%常数设置
FrameLen = 240;%帧长为240点
FrameInc = 80;%帧移为80点
amp1 = 10;%初始短时能量高门限
amp2 = 2;%初始短时能量低门限
zcr1 = 10;%初始短时过零率高门限
zcr2 = 5;%初始短时过零率低门限
maxsilence = 8; % 8*10ms = 80ms
minlen = 15; % 15*10ms = 150ms
status = 0; %初始状态为静音状态
count = 0; %初始语音段长度为0
silence = 0; %初始静音段长度为0
%计算过零率
tmp1 = enframe(x(1:end-1), FrameLen, FrameInc);
tmp2 = enframe(x(2:end) , FrameLen, FrameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr = sum(signs.*diffs, 2);
%计算短时能量
amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);
%调整能量门限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);
%开始端点检测
x1 = 0;
x2 = 0;
for n=1:length(zcr)
    goto = 0;
    switch status
        case {0,1} % 0 = 静音, 1 = 可能开始
            if amp(n) > amp1 % 确信进入语音段
                x1 = max(n-count-1,1);
                status = 2;
                silence = 0;
                count = count + 1;
            elseif amp(n) > amp2 || ... % 可能处于语音段
                    zcr(n) > zcr2
                status = 1;
                count = count + 1;
            else % 静音状态
                status = 0;
                count = 0;
            end
        case 2 % 2 = 语音段
            if amp(n) > amp2 || ... % 保持在语音段
                    zcr(n) > zcr2
                count = count + 1;
            else % 语音将结束
                silence = silence+1;
                if silence < maxsilence % 静音还不够长,尚未结束
                    count = count + 1;
                elseif count < minlen % 语音长度太短,认为是噪声
                    status = 0;
                    silence = 0;
                    count = 0;
                else % 语音结束
                    status = 3;
                end
            end
        case 3
            break;
    end
end
count = count-silence/2;
x2 = x1 + count -1;
subplot(311) %subplot(3,1,1)表示将图排成3行1列,最后的一个1表示下面要画第1幅图
plot(x)
axis([1 length(x) -1 1]) %函数中的四个参数分别表示xmin,xmax,ymin,ymax,即轴的范围
ylabel('Speech');
line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red');
line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');
subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel('Energy');
line([x1 x1], [min(amp),max(amp)], 'Color', 'red');
line([x2 x2], [min(amp),max(amp)], 'Color', 'red');
subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel('ZCR');
line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');
line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');   
end

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 快乐扑克3如何跟对子 返回列表