20180824 SOLA算法实现

20180824 SOLA算法实现

一、SOLA算法应用场景

实现变声算法时,通过重采样可以同时改变声音的音调和速度。如果想要实现仅变调不变速,需要在重采样的基础上进行时长规整,时长规整可以通过SOLA算法实现。

二、SOLA算法实现原理

可参考论文《语音变调算法研究及其在语音合成中的应用_张晓蕊》的2.1.2.2的讲解

三、代码实现遇到的具体问题

1 叠加系数
论文中提到的叠加公式的系数写反了,应该交换。叠加的目的是减少叠加后出现陡变(陡变会造成杂音),所以靠近y的部分y的比重更大, 靠近x的部分x的比重更大。
2 待做:SOLA算法的参数设置待调试
3 C语言中(而非c++)自带排序算法的实现qsort
c++中自带泛型的排序算法,需要包含头文件#include ,C语言则不能使用
C语言中也包含自带的快排算法qsort,需要包含头文件#include
qsort算法的基本用法可以参考菜鸟教程中的介绍
qsort基本用法
需要特别注意的qsort排序的对象的类型有很多种,如果需要改变排序对象的类型,可以修改cmpfuc函数

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

如上代码实现的是顺序,如果是逆序,可以修改为

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)b - *(int*)a);
}
如果要改变排序对象的类型:

int cmpfunc (const void * a, const void * b)
{
return ( (要修改的类型)a - (要修改的类型)b );
}

特别需要的注意的是对double型排序,需要特别修改为:

int cmpfunc(const void* a, const void* b)
{
	return *(double*)b > * (double*)a ? 1 : -1;
}

4 链接时报堆栈访问出错
编译时没有报错,链接时报堆栈访问出错,如果编程语言是c++,原因很大可能是数组访问越界

四、SOLA算法的缺陷

SOLA算法的关键在两个问题,一是 如何判断相关性,二是如何进行叠加。论文中判断相关性即为计算相关系数,具体公式为:
在这里插入图片描述

叠加的方法y=(1-i/L)*y+i/L *x
使用上述方法进行时长规整,音频存在杂音,因此计算相关性和叠加的方法还有待寻找更好的实现。

五 、参考文献

1 论文:语音变调算法研究及其在语音合成中的应用_张晓蕊
2 菜鸟教程qsort函数介绍:https://www.runoob.com/cprogramming/c-function-qsort.html

你可能感兴趣的:(编程实战)