matlab语音合成技术,matlab语音合成详细版

matlab语音合成技术,matlab语音合成详细版【实例简介】适用于北京大学、清华大学的matlab大作业(已知的),主要是对乐音做分析,入门的matlab写法t=|linspace(0,14-1/819214*8192);%14秒,采样率为8192,保证一秒换一次y(t<1)=sin(174.61*2*p*t1<1);%F其实就是其频率的正弦波,时长一秒,8192个点y(1<=t&t<2)=sn(196*2*p…

大家好,欢迎来到IT知识分享网。matlab语音合成技术,matlab语音合成详细版

【实例简介】

适用于北京大学、清华大学的matlab大作业(已知的),主要是对乐音做分析,入门的matlab写法

t=| linspace(0,14-1/819214*8192);%14秒,采样率为8192,保证一秒换一次

y(t<1)=sin(174.61*2*p*t1<1);%F其实就是其频率的正弦波,时长一秒,8192个点

y(1<=t&t<2)=sn(196*2*pi*(1

%G

y(2<=t&t<3)=sn(220*2*pi*t(2<=t&t<3)

A

y(3=t&t4)=sin(24694*2*pi*t(3<=t&t4)

%oB

y(4<=t&t<5)=sn(261.63*2*pi*t(4<=t&t<5)

%C

y(5<=&t<6)=sn(29366*2*pi↑t(5

y6二&t7)=sin(32963*2*pi*t(6

y(7<=t&t<8)=sn(34923*2*p*t(7

y(8=t&t9)=sn(392*2*pi*t(8<=t&t9);

YoG

y(9

y(10

y(11

y(12

y(13<=t&t<14)=sin(659.25*2*pi*t(13<=&t<14);%E

soundly

通过如上代码的编写,弄清楚了音调和节奏的原理。即采样率不同频率也会不同,譬如

如果要以&KHz的频率演奏音乐,那么采样率设为8K,此时得到的音调才会是对应的

但由于以是基波,甚为难听,高频异常刺耳,难以受,音节转换之间听到‘嗒’的声

音,分析认为是频率转换过程中造成的高频成分

用这种基波编写段《天空之城》:

使用简谱为C调,4/4拍,即4分音符为一拍,每小节有4拍,T=90,每分钟90拍,

一拍为075秒

音符长短如下图表示

首符名称

全音符

四拍

二分音符

二拍

四分音符

八分音符

甲拍

十六分音符

四分之一推

三十二分音符

八分之一抱

X·=X+X

.=X+

将简谱化为看得懂的,每个字母代表半拍(0.375秒),加A表示高音,加表示低音

7Fx137

3

化为:AB|^C~ CACBAC^ C AEAE| BBBBBBEE

6

56

5

434

化为: AAAGAAACAC| GGGGGGFE| FFFEFFACAC

共1575秒,将其实现,频率与音调的对应关系如下

E

13081

14683

164.81

174.61

196

220

246.94

C

E

4

5

6

261.63

293.66

329.63

349.23

392

440

493.88

C

F

523.25

587.33

659.25

69846

78399

880

987.77

t= clinspace(O,15.751/81921575*8192);

y(t<0.375=sn(440*2*pt(t0375);

%A13

y(0.375<=&t<0.75)=sin(49388*2*p*t(0.375<=t&t<0.75);

B14

y(0.75

%3*AC15

y(1875

%B14

y(2.25

%2*^C15

y(3<=t&t<3.75)=in(659.25*2*p*t(3

%2*AE17

y(3.75<=t&t<6)=sin(49388*2*pi*t(3.75<=t&t<6)

%6*B14

y(6

%2*E10

y675

%3*A13

y(7875

%G12

y(825

%2*A13

y(9<=t&t<975)=sin(523.,25*2*p*t(9<=t&t<975)

%2*AC15

y(9.75

%6*G12

y(12<=t&t<12.375)=sin(34923*2*pi*t(12<=t&t<12375);

%F11

y(12.375-&t1275-in(392.63*2*pit(12.375-t&t1275);%E10

y(1275

%6*F11

y(15

%2*AC15

soundly

的过渡声。

前面编写程序过于复杂繁琐,现在将其优化,由于以半拍为单位基本够用,所以考虑以

半拍为基本单位,时间构成一个向量。对于各个音调,应该将其单元化,这样用起来就方便

随意组合,初步设想将频率单元化,用大数组的方式使得不同时期得到不同的频率,具体实

现方式如下

D(2)

E(3)

F(4)

G(5)

A(6)

B(7)

13081

14683

164.81

174.61

196

220

246.94

C(8)

D(9)

E(10)

F(1)G(12)A(13)B(14)

3

5

6

261.63

293.66

329.63

34923

392

440

493.88

C(15)

D(16)

E(17)^F(18)~G(19)^A(20)

B(21)

523.25

587.33

659.25

69846

78399

880

987,77

t= linspace(021-1/8192,21*8192);

for n=1: 21

u{n}=(t>(n-1)&t

end

a=[130.81*2pi,146.83*2*pi,164.81*2“pi,174.61*2*pi196*2*pi,220*2*pi,246942*pi,

26163*2*pi,293.66*2*pi,329.63*2*pi,349.23*2“pi,392*2*pi,440*2*pi,49388*2*pi,

523.25*2*pi587.33*2*pi,65925*2*pi,69846*2*pi,783.99*2*pi,880*2*pi,987.77*2*pi]

a(22)=0;%构造一个22音调的数组,当需要不同的音调时,选不同的指针便可以

song-[123456789101112131415161718192021%使用不同的指针得到不同音调

y=0*t;

for n=1: 21

y=y+(sin(a(song (n)).t)).u(nb:

plot(y);

sound( y, 8192)

如上,便实现22个音符封装,只需改变song的序列就可以得到不同的音调排序,但发

现不好调节速度,需要更好的方式,现在将 sound的频率改为8000,通过该采样率可

以改变速度,例如1到2的中间有400点,则1到2为05秒

time_1=42;%半节拍数,以半节拍作为基本的单位

t= clinspace( O time_1-1/3000time_1*3000)%采样频率8000,半拍3000,为0.375秒,适

节拍90的曲子,天空之城钢棽曲单手版就是这个节奏

for n=1: time 1

u{n}=(t>(n-1)&t

end

a=[13081*2*pi,146.83*2*pi,164.81*2*pi,174.61*2*pi,196*2*pi,220*2*pi,246.94*2*pi,

26163*2*pi,293.66*2*pi,329.63*2*pi,349.23*2*pi,392*2*pi,440*2*pi,493.88*2*pi,

523.25*2*pi,587.33*2*p,65925*2*pi,698.46*2*pi,783.99*2*pi,880*2*pi,98777*2*pi]

a(22)=0

sang=[1314…

1515151415151717

1414141414141010

1313131213131515

1212121212121110

1111111111111515];

for n=1: time 1

y=y+(sin(0.375+a(song(n)+t)*un];%乘以半节拍的时间, point

end

sound(y, 8000)

如上所示,实现了各个音调的合成与播放,对频率有了初步的了解,其中的关键点则是

播放采样率与所设置的音调数组的采样率的关系,最后认为使用8KHz的釆样率是比较好的

方案。卜面的工作也是基于8KHz的采样率来做的

2、增加谐波分量提升音乐的厚度

即在里面加入高次谐波,例如次谐波、三次谐波、四次谐波等等,首先做一次尝试,

在上面的代码基础上稍微做一些修改既可

time1=42;%半节拍数

t=linspace(o, time_ 1-1/3000, time_1*3000)

for n=1: time 1

u{n}={t>(n-1)&t

end

a=[13081*2*pi,146.83*2*pi,16481*2*pi,174.61*2*pi,196*2*pi,220*2*pi,246.94*2*pji

26163*2*pi,293.66*2*pi,329.63*2*pi,349.23*2*pi,392*2*pi,440*2*pi,493.88*2*pi,

52325*2*pi,587.33*2*pi,659.,25*2*p69846*2*pi783.992*pi,880*2“pi,987.77*2*pi,]

a(22)=0

song=[1314

1515151415151717

1414141414141010

1313131213131515

1212121212121110

1111111111111515

y=0*t;

for n=1: time 1

y=y+(sin(0.375*a(song(n)*t)+0.4*sin(0.75*a(song(n)*t)…%一次、二次谐波

+03sin(1.125*a(song(n).*t)…

%三次谐波

+02*sin(15*a(Song(n).*t)…

%四次谐波

+0.1*sin(1875*a(song(n).*t)…

%五次谐波

+0.05*sin(225*a(ong(n).*t)

%六次谐波

+0.02*sin(2.625*a(song(n).*t).*u{n};%乘以半节拍的时间七次谐波

end

sound(y, 8000)

加上了谐波之后的声音的确厚度增加了,比前面的声首要好听不少,但是离钢琴的声首

差距还是比较人的,虽然尝试了很多种不同的谐波比例,但是始终得不到合适的比例,哲时

不追求得到钢琴声,留在后面得到钢琴的频谱再做处理

3、修正包络控制音量的变化和停顿及叠接部分的时间

经过不断调试,声音比较好听了,不过离钢琴声还有好远

先做简易的包络,每个音符没有交叠,将两边做平缓,前500个由0至1,即斜率为1/500,

后500个由1至0,斜率为-1/500

time_1=42;%半节拍数

t=linspace( 0, time_1-1/ 3000, time_1*3000)

for n=1: time 1

u{n}=(t>(n-1)&t

end

baoluo=ones(30001);%做包络之用

temp_1=[0:0.0021]

forn=1:500

baoluo(n=temp 1(n);

baoluo(3001-n =temp 1(n);

en

fun_1=eros(126000,1);

for n 0=1: time 1

forn1=1:3000

fun_1(n_0-1)*3000+n_1)= baoluo(n_1);

end

a=[13081*2*pi,14683*2*pi16481*2*pi,174.61*2*pi,196*2*pi,220*2*pi,24694*42*pi,

26163*2*p,293.66*2*pi,329.63*2*pi349.23*2*pi392*2*pi,440*2*pi,49388*2*pi,

523.25*2*p,587.33*2*pi,659.25*2*pi,69846*2*pi,783.99*2*pi,880*2*pi,

98777*2*pi]

a(22)=0;

song-[1314…

1515151415151717

1414141414141010

1313131213131515

1212121212121110.

1111111111111515};

0*t

y_1=0*t;

for n=1: time 1

y=y+(sin(0.375*a(song(n).*t)+0.4*sn(0.75*a(song(n).*t)….%一次、二次谐波

+0.3*sin(1.125*a(song(n)*t)…

%三次谐波

+0.2*sin(15*a(song(n).*t)

%四次谐波

+0.1*sin(1875*a(song(n)*t)

%五次谐波

+0.05*sin(225*a(song(n).*t)…

%六次谐波

+002*sin(2625+a(song(n)*t)*Un;%乘以半节拍的时间七次谐波

%(接下面

for n=l:time 1*3000

%(接上面)

y 1(n=yn*fun 1(n);

end

plots_ 1)

sound(y_1,8000)

整个时间序列的包络

加上包络时候的音频信号

虽然做了包络,每个音都清楚了,而且消除了“嗒”声,但是尼玛节奏感都化为一波一波的

听全拍或者两拍音时效果很差,这样完全没有了那种演奏的感觉。

认为需要将每一个音调单元化,这样调用起来就比较好办,最好是每一个音调就是完全

的,直接可以演奏的。直接写成函数

function diao = diao( x

diao summary of this function goes here

号得到不同频率的序列

t=1 Inspace(0,1-1/3C00,3000)

diaO=Sin(x×2*p立t);

⊙n

d

而对于包络,需要更好的包络,使用老师pt里演示的包络

音量

冲激菜减线消失产我减持续消失

时间

第n个乐音

逖接

第n+1个乐音

部分

自定义一下,首先每个半拍仍然保持3000点,迭接部分设为500点,一共是3500点

个音,冲击500点,袞减500点,持续1500点,消失1000点,最高为1.6,如此构造

个包络,得到如下图形

函数如下所示,实现了每个带包络的音调的单元化

【实例截图】

【核心代码】

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14427.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信