天天看點

20180824 SOLA算法實作

20180824 SOLA算法實作

一、SOLA算法應用場景

實作變聲算法時,通過重采樣可以同時改變聲音的音調和速度。如果想要實作僅變調不變速,需要在重采樣的基礎上進行時長規整,時長規整可以通過SOLA算法實作。

二、SOLA算法實作原理

可參考論文《語音變調算法研究及其在語音合成中的應用_張曉蕊》的2.1.2.2的講解

三、代碼實作遇到的具體問題

1 疊加系數

論文中提到的疊加公式的系數寫反了,應該交換。疊加的目的是減少疊加後出現陡變(陡變會造成雜音),是以靠近y的部分y的比重更大, 靠近x的部分x的比重更大。

2 待做:SOLA算法的參數設定待調試

3 C語言中(而非c++)自帶排序算法的實作qsort

c++中自帶泛型的排序算法,需要包含頭檔案

#include<algorithm>

,C語言則不能使用

C語言中也包含自帶的快排算法qsort,需要包含頭檔案

#include<stdlib>

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算法的關鍵在兩個問題,一是 如何判斷相關性,二是如何進行疊加。論文中判斷相關性即為計算相關系數,具體公式為:

20180824 SOLA算法實作

疊加的方法y=(1-i/L)*y+i/L *x

使用上述方法進行時長規整,音頻存在雜音,是以計算相關性和疊加的方法還有待尋找更好的實作。

五 、參考文獻

1 論文:語音變調算法研究及其在語音合成中的應用_張曉蕊

2 菜鳥教程qsort函數介紹:https://www.runoob.com/cprogramming/c-function-qsort.html

繼續閱讀