该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
请问大佬们如何把合成语音信号存为wav文件?
我用的语音信号是自己录的,大佬们可以自己用自己的试一试,这是我的代码,谢谢大家
clear all;
clc;
close all;
filedir=('C:\Users\ASUS\Desktop\newvoice\test4\xiandianzikejidaxue.wav');
filename='xiandianzikejidaxue.wav'; % 设置文件名
fle=[filedir filename]; % 构成完整的路径和文件名
[y,Fs] = audioread('C:\Users\ASUS\Desktop\newvoice\test4\xiandianzikejidaxue .wav');
y=y-mean(y); % 消除直流分量
y=y/max(abs(y)); % 幅值归一
xl=length(y); % 获取声音长度
time=(0:xl-1)/Fs; % 计算出时间刻度
p=12; % LPC的阶数为12
wlen=200; inc=50; % 帧长和帧移
msoverlap = wlen - inc; % 每帧重叠部分的长度
y=enframe(y,wlen,inc)'; % 分帧
fn=size(y,2); % 取帧数
% 语音分析:求每一帧的LPC系数和预测误差
for i=1 : fn
u=y(:,i); % 取来一帧
A=lpc(u,p); % LPC求得系数
aCoeff(:,i)=A; % 存放在aCoeff数组中
errSig = filter(A,1,u); % 计算预测误差序列
resid(:,i) = errSig; % 存放在resid数组中
end
% 语音合成:求每一帧的合成语音叠接成连续语音信号
for i=1:fn
A = aCoeff(:,i); % 取得该帧的预测系数
residFrame = resid(:,i); % 取得该帧的预测误差
synFrame = filter(1, A', residFrame); % 预测误差激励,合成语音
outspeech((i-1)*inc+1:i*inc)=synFrame(1:inc); % 重叠存储法存放数据
% 如果是最后一帧,把inc后的数据补上
if i==fn
outspeech(fn*inc+1:(fn-1)*inc+wlen)=synFrame(inc+1:wlen);
end
end;
ol=length(outspeech);
if ol
outspeech=[outspeech zeros(1,xl-ol)];
end
% 发声
[y,Fs]=audioread('C:\Users\ASUS\Desktop\newvoice\test4\xiandianzikejidaxue .wav');
sound(y,Fs);
pause(2)
sound(outspeech,Fs);
% %存发音文件
% save('test.mat','outspeech')
% load('test.mat');
%y=outspeech
filename='outspeech.wav';
audiowrite(filename,y,Fs);