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算法的關鍵在兩個問題,一是 如何判斷相關性,二是如何進行疊加。論文中判斷相關性即為計算相關系數,具體公式為:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLzMzMyADM0ADM1IDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
疊加的方法y=(1-i/L)*y+i/L *x
使用上述方法進行時長規整,音頻存在雜音,是以計算相關性和疊加的方法還有待尋找更好的實作。
五 、參考文獻
1 論文:語音變調算法研究及其在語音合成中的應用_張曉蕊
2 菜鳥教程qsort函數介紹:https://www.runoob.com/cprogramming/c-function-qsort.html