注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

麦斯·渐行渐远

人无远虑,必有近忧

 
 
 

日志

 
 

Flash中实现语音变声(上)  

2011-01-28 15:52:51|  分类: 工作 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近在做一个Flash里面变换从用户采集的语音的效果,一个月以后产品上线了,虽然比较粗糙,但是从技术尝试的角度来说,还是学习了不少东西的。这篇文章就是想和大家一起分享一下其中的一些研究和实现。

语音变声是音频信号处理的一种,将从麦克风采集的声音信号,经过处理以后回放出来,得到变化过的效果。

语音变声包含很多种形式,最简单的形式就是将音频信号的频谱整体向高频方向伸展或者低频方向收缩,回放以后就得到了和原信号音调不一样的声音。在这个基础上有很多中变化,例如针对频谱中不同频率分量作不同比例、甚至不同方向的伸缩,或者根据信号的时间,修改伸缩算法的各个参数,达到各种丰富多彩的效果。下面只考虑最简单的形式。

首先讨论原理。(对原理推导头大的童鞋可以直接跳过。。。。)

音频信号可以描述为一个自变量为时间t的函数,这个函数值就是这一时刻下的信号强度,记为F(t)。

先考虑最简单的情况,如果输入的音频信号是一个理想槌敲击一个理想音叉发出的声音(比方说是钢琴键盘上的中央C),假定这个音叉发出的声音是不会随时间衰减的,由于音叉发出的音频是一个正弦波信号,那么F(t)可以写成:

 
假如我们想把这个声音的频率改变一点,那么我们只需要修改下这个式子,变成这个样子:

  
修改过以后,只需要调整c的值,就可以得到一个不同音调的声音了,就像是由一把完全不同的音叉所发出的一样。

那么,假如输入的声音不是由音叉发出来的(绝大多数情况下便是这样),F(t)的形式就不是上面的式子能够描述出来的,那么这要如何来进行处理呢?其实,我们只需要将F(t)分解成一堆三角函数的和就可以了,因为每一个三角函数项表征了这个信号里面某一个特定频率上的强度。

这个时候就要求助于傅立叶变换了。

我们知道,对于实值函数,函数的傅立叶级数可以写成:

 
将信号的函数表达式写成这个形式以后,便可以按照上面的葫芦来画这个瓢了:

 
这样我们就得到了如何修改输入音频信号的音调的方法:只需将输入的信号展开成傅立叶级数,然后修改每一项中cos和sin函数的自变量就可以了。

上过高数的人应该都有这种印象,计算函数的各种展开,尤其是傅立叶展开可不是一件令人愉快的事情。于是这里可能已经有聪明的童鞋发现了一种可以躲过计算傅立叶级数计算的方法:既然在上面的式子里面,c只是作用在自变量上,那么其实不用管F(t)的具体形式,直接令t'=tc,然后原样带到F里面去,这样不就行了么?

起初一想,的确是这样推导的。相当于将音叉震动一个周期的时间缩小到原来的一半,那么频率自然就提高了一倍。但是这应付实际情况却是不行的,比如说将磁带播放的速度设置为录音的一倍,音调的确提高了,但是声音的长度却缩小了一半。为什么会不行呢?

因为上面的讨论只是一个简化的案例,我们假定傅立叶级数中Flash中实现语音变声(上) - vivimice -    麦斯·渐行渐远Flash中实现语音变声(上) - vivimice -    麦斯·渐行渐远是常数,在实际情况中,这两个也是和时间相关的。于是在对cos/sin的自变量进行修改的同时,也把他们的自变量给修改了。

这两个为什么会是和时间相关的呢?我们还是回到刚开始音叉的例子。

之前的例子中,音叉的发出的声音的大小是不会随时间衰减的,那么它的波形看起来就是这个样子:

Flash中实现语音变声(上) - vivimice -    麦斯·渐行渐远

但是实际上一个音叉在敲击以后,声音会逐渐衰减掉,直至消失,它的波形看起来可能会像下面这个样子:

Flash中实现语音变声(上) - vivimice -    麦斯·渐行渐远

那么在最上面的式子就应该修改成:


A(t)描述了信号包络的形状。那么这个时候,进行变声的时候,就只能乖乖的如下处理:

 
而A(t)是万万不能动的,否则声音的包络就会发生改变,从而使声音播放的速度发生变化。

按照上面的讨论,从原理上来说,如果需要对一个音频信号进行变声处理,同时要保证信号的长度不变,可以将它作傅立叶展开,然后逐项修改其sin/cos函数的形式,即可得到处理后的信号。

不过实际操作中,输入的信号不可能是一个连续的函数,不可能做足够多的傅立叶展开,那么具体应该怎样将这些原理应用到实际开发中去呢?下一篇博客中会具体讨论离散音频信号变调处理在算法上的实现。

=======

明天回家过年了~,祝大家兔年快乐,工作顺利,身体健康~
  评论这张
 
阅读(1340)| 评论(8)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018