[TOC]
歌聲合成原理
- 歌唱產(chǎn)生的音樂成為歌聲。歌唱更注意著重于通過橫膈膜和腹部甚至下腹部肌肉來調(diào)整呼吸旨别, 從而更好地控制音高、音色等旭斥。
- 歌唱中的顫音是指音高急劇上下波動的聲音炊苫,是由空氣有控制地通 過放松的喉部而產(chǎn)生裁厅。
- 一般包括兩個過程:樂譜的分析和聲音的產(chǎn)生。
- 樂譜分析:調(diào)侨艾、節(jié)奏执虹、旋律和語義
音樂四要素
- 音的高低:音高 (最重要):發(fā)聲體的振動頻率決定,是周期的倒數(shù)
- 人堆頻率的感知是非線性的唠梨,例如100Hz與它的2倍頻200Hz之間的距離和 200Hz與它的2倍頻400Hz間的距離對人耳來說是一致的袋励。
- 頻率大則音高,頻率小則音低当叭。
- 音樂上倍頻稱為一個八度茬故,西方的十二平均律把一個八度分為十二個半音。
- 標準音高A5((5表示該音符在第5個八度音程)蚁鳖,):中央c上的A音符發(fā)音頻率為440HZ磺芭,表示成A=440HZ,A440醉箕,<u>
國際通用標準音</u>
- 節(jié)拍
- 是音樂中規(guī)律地強拍和弱拍的反復钾腺,如果我們跟隨音樂的進 行用腳一下一下地點地徙垫,每一下就是一拍,打擊樂器在音樂中就是配合節(jié)拍演奏的垮庐。
- 在樂譜中表示節(jié)拍用小節(jié)松邪,每一個樂譜前面都有拍號,中間改變節(jié)奏會改變拍號。分子代表每一小節(jié)有多少拍子哨查,分母代表用什么音符代表一拍逗抑。
- 如2/4代表用四分音 符代表一拍,每-d,節(jié)有兩拍寒亥。
- 速度tempo決定了一段音的快慢邮府,是音樂的重要元素,影響音樂的情感和演奏難度溉奕。
- 速度一般以文字或數(shù)字標記的于樂譜的開端褂傀,習慣于每分鐘多少拍,(beats per minute加勤,BPM)作為度量單位仙辟。
- BPM的數(shù)值越大代表越快的速度。
- 音的長短:(最重要):音符的長短鳄梅,由發(fā)聲體震動的振幅決定的叠国。
- 音的強弱:表征音樂的力度(強度),力度的變化是音樂作品中表達情感的常用方式之 一
- 音色
- 連音符:是一個音節(jié)包含一個或多個音符的情況
- 音程:兩個音之間的距離戴尸,音程的單位是分貝(Cent)
語音產(chǎn)生的機理
- 語音產(chǎn)生的過程包括三部分
聲門下部分粟焊,聲門部分。聲門上部分
- >聲門下部分由氣管孙蒙,支氣管项棠,肺等呼吸氣管組成,它提供發(fā)聲的動力挎峦。
- >聲門在發(fā)聲時作有節(jié)奏的開閉動作香追,把從肺呼出的氣流調(diào)節(jié)成脈沖狀聲門 波。這種攜帶了能量的聲門波成為說話和歌唱時的基本聲源浑测。
- >聲門上部分是整個共鳴腔翅阵,包含口腔,鼻腔和咽腔迁央。聲門波經(jīng)過共鳴腔的 調(diào)節(jié)以及輻射效應掷匠,產(chǎn)生出不同的音素,并發(fā)出聲音岖圈。- 歌聲合成大致分為兩類
- 基于人耳感知機制的頻率參數(shù)模型和基于聲音產(chǎn)生原理的物理模型讹语。
歌聲合成研究現(xiàn)狀
基于波形拼接的方法
- 處理過程
- 音符標注、分割
- 缺點:過程復雜蜂科、需要人工介入顽决,需要建立大量的規(guī)則
基于統(tǒng)計模型
- 實例:基于隱馬爾科夫鏈的系統(tǒng)
- 基于源一濾波器模型對歌聲進行信號分解短条,得到基頻和頻譜 參數(shù),然后利用隱馬爾科夫模型對這些參數(shù)進行建
- 優(yōu)點:
- 通過一定數(shù)量的歌聲可以達到一個不錯的音質(zhì)
- 對歌聲進行參數(shù)分解才菠,需要存儲的的參數(shù)需要空間小
- 參數(shù)的改變和轉(zhuǎn)換非常的便捷茸时,因此改變歌聲的音質(zhì),音高赋访,時長等特征方面非常靈活
- 缺點
- 真實感差
漢語歌聲合成:歌聲轉(zhuǎn)換
基于統(tǒng)計模型的漢語歌聲 合成研究
基頻模型
- 針對歌聲基頻存在的數(shù)據(jù)稀疏問題可都,提出了參考樂譜的基頻引導方 法。該方法將樂譜中包含的基頻信息引入到歌聲基頻的生成算法中蚓耽, 避免了因數(shù)據(jù)稀疏而造成的合成音高在時間和頻譜結(jié)構(gòu)上出現(xiàn)偏差的 問題渠牲,可以合成出與樂譜相一致的具有精準音高的基頻。
- 對真實基頻和樂譜基頻之間可能存在差異的問題進行了研究步悠,提出了 在訓練中也考慮樂譜基頻因素從而準確得到兩者之間的差值的方法签杈。 利用該方法可以得到相比樂譜基頻引導方法更加準確和真實的基頻估 計媳溺。上述方法也可用于連音符的合成侣姆。
HMM
-
- HMM三個基本問題
- 1.給定一個輸出序列O和模型入,求模型輸出此序列的概率铣缠。這個問題可通 過前向后向算法求解谚咬。
- 2.給定一個輸出序列和模型踢涌,求最可能輸出此序列的狀態(tài)序列。這個問題可 通過Viterbi算法求解序宦。
- 3.給定一個輸出序列和模型結(jié)構(gòu),求模型參數(shù)使得概率最大背苦。這是模型的訓 練問題互捌,Baum.Welch算法可以用來求解。
- HMM三個基本問題
基于HMM的聲音合成框架
建模尺度
- 聲韻母作為建模單元
建模結(jié)構(gòu)
特征提取
- 從波形中提取基頻和頻譜特征行剂。
- 頻譜特征采用mel-cepstrum特征
模型訓練階段
合成階段
- 生成的聲學參數(shù)輸入到梅爾對數(shù)頻譜估計濾波器秕噪,合成出歌聲。
歌聲合成的關鍵
- 表達出正確的音樂信息厚宰,即音高和節(jié)奏要精準腌巾。這對歌聲的時長模型和基 頻模型提出了新要求,需要將音樂信息加入建模方可實現(xiàn)铲觉,
- 顫音的合成是歌聲的關鍵澈蝙。
歌聲的市場與樂譜的關系
- 唱歌的時候的開始時間相對于樂譜有一個提前量。
歌聲的基頻與樂譜的關系
- 1.歌聲的基頻需要遵循樂譜撵幽,也就是說要”在調(diào)上”灯荧。一般的朗誦語音和歌聲 的最大區(qū)別在于歌聲必須遵循樂譜的音高。同時音高是影響歌聲合成質(zhì)量 的一個關鍵影響因素盐杂。
- 2.歌聲的基頻包含有顫音逗载,顫音是音樂情緒的表達的重要組成部分哆窿,也是衡 量專業(yè)歌手的重要指標。
時間模型
- 唱歌的起點與樂譜上的時間有一個提前差厉斟,
基頻稀疏問題
- 在矩陣中挚躯,若數(shù)值為0的元素數(shù)目遠遠多于非0元素的數(shù)目,并且非0元素分布沒有規(guī)律時擦秽,則稱該矩陣為稀疏矩陣
- 由于歌聲中的基頻中含有大量的上下文码荔,比如音高、調(diào)号涯、節(jié)奏等信息目胡,
- 因此基頻通 常是稀疏的,所以在訓練數(shù)據(jù)中出現(xiàn)的很少的上下文情況將無法得到充分訓練链快, 這會導致無法合成出符合樂譜音高的基頻曲線誉己。
實際基頻與樂譜差值建模
- 對基頻與樂譜的音高曲線進行建模,位歸一化方法域蜗,這樣雖然基頻是稀疏的巨双,但是基頻與樂譜的差距在縮小。
- 數(shù)據(jù) 層次的歸一化方法在訓練前對基頻數(shù)據(jù)進行處理霉祸,然后將基頻差用于訓練筑累。 這樣做會引起一個問題,基頻在做歸一化時需要先與樂譜做對齊丝蹭,因此在后續(xù) 訓練中都得按照這個對齊的結(jié)果進行慢宗。這樣很容易出現(xiàn)問題,第一奔穿,對齊通常無 法保證準確镜沽,第二,只能使用Viterbi訓練而無法使用嵌入的EM訓練贱田,EM.訓 練通常比Viterbi訓練要好缅茉。模型層次的歸一化方法巧妙的運用了說話人適應[46]的技術,在模型層次對基頻進行歸一化男摧,解決了以上問題蔬墩。
顫音建模
- 有正確的音準和節(jié)奏。顫音也是語音和歌聲的最大區(qū)別耗拓。
-
- 顫音幅度顧名思義指的是顫音上下抖動的幅度拇颅,顫音速率指 顫音的變化速率。
- 其中bt是第t個狀態(tài)對應的基頻值帆离,轉(zhuǎn)換矩陣Bt=[1蔬蕊,bt]由樂譜唯一決定, 因此氐是唯一需要估計的參數(shù)。
- 歌聲的基頻= 語調(diào)部分 + 顫音部分
- 顫音參數(shù)提取用的最多的是基于希爾伯特變換的方法岸夯。希爾伯特變換可以計算信號瞬時速率麻献,非常適合顫音的時變特點。
歌聲合成的評價方式
- 定義了一個平均音符距離指標猜扮,它是以音符為基本單 位進行計算的勉吻,所以它能從更高的尺度上,同時也是從音樂的意義上來衡量兩 個基頻曲線間的距離旅赢。
歌聲庫的建立
曲目選擇
- 不是的
- 饒舌類歌曲
- 自由節(jié)奏曲目
- 音高不標準的歌曲齿桃,如一些民族歌曲中出現(xiàn)的非標準音。
- 選擇曲目:兒童歌曲以及傳統(tǒng)流行歌曲中得到
- 所有拼音的覆蓋
- 聲韻母分布的平衡
- 調(diào)的覆蓋和平衡
- 節(jié)奏的覆蓋和平衡
樂譜分析
- 將樂譜轉(zhuǎn)換為用于訓練與合成的上下文標注是歌聲合成系統(tǒng)的前端部分煮盼。
標準的MIDI
- MIDI(music Instrument Digital interface),中文稱為數(shù)字接口短纵,是一個工業(yè)標準的電子通信協(xié)議。
- 編號為128的MIDI消息類型為 Note On僵控,即開始演奏一個音符;編號為144的MIDI消息類型為Note Of!f香到,即停 止演奏一個音符。
- 讀入 MIDI 格式文件报破,產(chǎn)生一個 n*7 的矩陣悠就,其中矩陣的第三列表示通道標號,第四列表示音符音高充易,第五列表示按鍵的速度梗脾,然后提取代表主通道信息的子矩陣,子矩陣的每行代表樂譜中每個音符的基頻等信 息盹靴。子矩陣的第四列對應于樂譜中每個音符的頻率炸茧,利用子矩陣中第六列和第七列的數(shù) 值可求出樂譜中任一音符的時長。
- "度”就是音與音之間距離的衡量單位稿静。而音與音之間音高的距離叫做音程宇立, 半音(Semitone)是其計算的最小單位。有些音之間的距離僅差半音自赔,此時我們稱之為“半 音程”,而有些則差兩個半音柳琢, 我們則稱之為“全音程”
示例
- 保存為mid
import random
import sys
from mido import Message, MidiFile, MidiTrack, MAX_PITCHWHEEL
notes = [64, 64+7, 64+12]
outfile = MidiFile()
track = MidiTrack()
outfile.tracks.append(track)
track.append(Message('program_change', program=12))
delta = 300
ticks_per_expr = int(sys.argv[1]) if len(sys.argv) > 1 else 20
for i in range(4):
note = random.choice(notes)
track.append(Message('note_on', note=note, velocity=100, time=delta))
for j in range(delta // ticks_per_expr):
pitch = MAX_PITCHWHEEL * j * ticks_per_expr // delta
track.append(Message('pitchwheel', pitch=pitch, time=ticks_per_expr))
track.append(Message('note_off', note=note, velocity=100, time=0))
outfile.save('test.mid')
- mid2json
import sys
import json
import mido
def midifile_to_dict(mid):
tracks = []
for track in mid.tracks:
tracks.append([vars(msg).copy() for msg in track])
return {
'ticks_per_beat': mid.ticks_per_beat,
'tracks': tracks,
}
mid = mido.MidiFile(sys.argv[1])
print(json.dumps(midifile_to_dict(mid), indent=2))
print('mid',mid)
- mid 數(shù)據(jù)讀取
from mido import Message,MidiFile
msg = Message('note_on', note=60,channel=2,velocity=112)
# velocity 速度
# channel 頻道
# note 音符
print('msg',msg)
print(msg.note,msg.channel,msg.velocity,msg.time)
# 轉(zhuǎn)化為字節(jié)
print(msg.bytes())
print(msg.bin())
print(msg.hex())
# 從字節(jié)加載數(shù)據(jù)
msg1 = Message.from_bytes([0x90, 0x40, 0x60])
print(msg1)
# 打開mid 文件
mid = MidiFile('../test.mid')
# 有多少個音軌
for i, track in enumerate(mid.tracks):
print('Track {}: {}'.format(i, track.name))
for msg in track:
if msg.is_meta:
print('meta')
else:
print(msg)
# 計算速度
print(msg.bpm2tempo())
'''mid 總時間'''
print('mid.length',mid.length)
'''
type 0 (single track): all messages are saved in one track
type 1 (synchronous): all tracks start at the same time
type 2 (asynchronous): each track is independent of the others
'''
print(mid.type)
MusicXML
xml解析
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "errrolyan"
# Date: 18-10-16
# Describe = "樂譜xml文件轉(zhuǎn)化未為拼音”
import os,re,sys
import os.path
import xml.etree.ElementTree as ET
import pinyin
from collections import Counter
def coverFiles(sourceDir, targetDir):
for file in os.listdir(sourceDir):
sourceFile = os.path.join(sourceDir, file)
targetFile = os.path.join(targetDir, file)
if os.path.isfile(sourceFile):
open(targetFile, "wb").write(open(sourceFile, "rb").read())
def fileread(filepath):
pathDir = os.listdir(filepath)
for s in pathDir:
newDir = os.path.join(filepath, s)
if os.path.isfile(newDir):
if os.path.splitext(newDir)[1] == ".xml":
print(newDir)
name1 = newDir[13:39]
tree = ET.parse(newDir)
root = tree.getroot()
for text in root.iter('text'):
text.text = re.sub(u"[\s.绍妨。??柬脸!!;他去;\/_:,%^*(\"“”《》$\,']", '', text.text)
if u'\u4e00' <= text.text <= u'\u9fff':
text.text = pinyin.get(text.text, format="strip", delimiter=" ") # format="strip" "numerical"
print(text.text)
text.text = str(text.text)
text.set('updated', 'yes')
print("第" + newDir + "首歌完成5苟椤T植狻!")
tree.write(newDir,encoding="utf-8",xml_declaration='xml version="1.0" encoding="utf-8"')
def xml_to_pinyin(xml_in_dir, xml_out_dir):
coverFiles(xml_in_dir, xml_out_dir)
fileread(xml_out_dir)
if __name__=="__main__":
usage = 'Usage: xml_to_Pinyin.py xml_in_dir xml_out_dir'
if len(sys.argv) != 3:
xmlInPath = 'xml_in_dir1'
xmlOutPath = 'xml_out_dir1'
else:
xmlInPath = sys.argv[1]
xmlOutPath = sys.argv[2]
xml_to_pinyin(xmlInPath,xmlOutPath)
print("完成轉(zhuǎn)換拼音")
基線系統(tǒng)搭建
- 對歌聲數(shù)據(jù)垦巴,使用25ms的漢明窗媳搪,5ms 的幀移進行MGC參數(shù)提取铭段,MGC參數(shù)包含能量特征一共35維度∏乇基頻使 用Snack庫中的get_f0提取snack序愚,基頻的上下限我們?nèi)≈?0Hz與700Hz,對應 MIDI音高約為E2與F5等限。顫音被檢測出來并從基頻中減去爸吮。所有的特征,包含對數(shù)域基頻望门,顫音形娇,MGC都求一階及二階動態(tài)特征。HMM狀態(tài)數(shù)目為7個筹误, MGC流使用單高斯桐早,基頻和顫音流使用多空間概率分布HMM。
歌聲信號分析
- 時域分析和頻域分析都有各自的局限性:時域分析對語音信號的頻率特性沒有直觀的顯示;頻域分析中又缺乏語音信號隨時間的變化關系纫事。
時域分析
- 時域波形 圖中可以看出語音的時長勘畔、音節(jié)的起止位置;另外,通過波形是否具有周期性可以區(qū)分 清音和濁音;通過觀察不同音素的波形區(qū)別丽惶,甚至還可以大概的估計出濁音的基音周期炫七。
頻域分析
- 音頻信號的頻率、功率譜钾唬、倒頻譜万哪、頻譜包絡。
- 處理方式:短時傅里葉變換抡秆。
語譜分析
語譜分析是動態(tài)的頻譜奕巍,反應了語音頻譜隨時間的變化情況。
語譜圖是語譜分析的外在表現(xiàn)形式儒士,語譜 圖也稱頻譜分析視圖的止,采用二維平面來表示三維信息。它的橫坐標是時間着撩,縱坐標是頻 率诅福,坐標點值為語音數(shù)據(jù)能量。
語譜圖中還可以確定語音參數(shù)拖叙,如共振峰頻率氓润、基頻。與時間軸平行的橫杠帶紋反映的就是共振峰的特點薯鳍。
提取工具world
-
World 通過CheapTrick的方法獲取頻譜包絡信息咖气,音按照基頻的周期為單位進行分段,以此 保證波形和頻譜的平滑連續(xù).對于加窗以后的時域信號進行傅里葉變換獲得對應的頻譜,然后在三角窗內(nèi) 對信號進行平滑崩溪,再利用倒譜方法浅役,求取頻譜的包絡信息:
歌聲基頻生成方法
- 歌聲的基頻樂譜上音符的高低密切相關,基頻的大致走向可以 直接反映樂譜上音符的高低悯舟。一般來講担租,基頻可認為包含2部分,一部分對應 樂譜抵怎,一般成為語調(diào)曲線:另一部分為細微的顫音奋救。顫音是一種近似正弦的持續(xù) 振蕩,頻率在5—8Hz.顫音可以體現(xiàn)歌唱者的細微情感反惕。而顫音也是衡量一個 歌手專業(yè)素養(yǎng)的重要指標之一尝艘。
基于樂譜基頻引導的基頻生成方法
- 一個 音符的絕對唱名是指這個音符的真實音名(C、D姿染、E背亥、F、G悬赏、A狡汉、B等)對應的 唱名(do、re闽颇、mi盾戴、fa.、sol兵多、la尖啡、si等):而一個音符的首調(diào)唱名是規(guī)定當前歌曲的調(diào)名主音為do時,該音符的唱名剩膘,表示該音符與調(diào)名主音的音高差值衅斩,是一 個“相對”的音高。
樂譜基頻引導
DF0模型
3.實際上現(xiàn)在實際基頻與樂譜基頻已經(jīng)一一對應怠褐,因此可求得實際基頻與樂 譜基頻的差值(Dr0)畏梆。
-
建模DF0
- (A)因為已經(jīng)得到了狀態(tài)級別的對齊,因此每個DF0值都可對應到一個FO模型奈懒,所以我們可以讓DF0共享F0的決策樹具温,這里在每個葉子節(jié) 點對DF0使用單高斯進行建模。
- (B)第二種方法是筐赔,在得到DF0后,重新對DF0在HMM的框架下單獨進 行訓練揖铜。DF0有這單獨的決策樹以及時長模型茴丰。
音節(jié)層模型
離散余弦變換用于基頻參數(shù)化
- 離散余弦變換DCT已經(jīng)成功用于多種語言的基頻建模。DCT是一種線性可逆的變換,它可以將基頻曲線為一組余弦分量的加權和贿肩。
- [圖片上傳失敗...(image-96c8ae-1590825742301)]
- MGC處理:論文:CELP coding based on reel-cepstral analysis.
歌聲合成的關鍵
- 準確的音高和時長
- 顫音是歌聲情感表達的關鍵峦椰,缺乏表現(xiàn)力的主要原因是因為基頻過于平滑。
- 基頻主要分為兩個部分的曲線:形狀曲線和顫音曲線
- 形狀曲線又可以分為音高曲線和殘差曲線
- 顫音的頻率一般為4HZ-8HZ
- 將基頻曲線通過一個截止頻率為3.5HZ低通濾波器來得到低頻部分作為形狀曲線汰规,高頻部分作為顫音曲線汤功。
- 樂譜的音高曲線可以直接由公式計算到
- f=440*2^(m-69)/2
- 殘差曲線 = 形狀曲線 - 樂譜曲線
- 形狀曲線又可以分為音高曲線和殘差曲線
殘差特征
顫音特征(vibrato)
顫音的幅值和速率
- [圖片上傳失敗...(image-a791b7-1590825742301)]
具備情感表達能力的歌者轉(zhuǎn)換
- 語音轉(zhuǎn)換關鍵是韻律特征和音質(zhì)特征
- 基頻特征轉(zhuǎn)換
- 基頻特征轉(zhuǎn)換
- 歌者轉(zhuǎn)換技術使得利用己有的歌聲合成系統(tǒng)附加少量的特定 人的歌聲庫可以合成出該特定人的歌聲。由于錄制歌聲庫的工作量非常龐大溜哮, 因此歌者轉(zhuǎn)換技術非常有應用價值滔金。
- 從一個歌唱人轉(zhuǎn)換到另一個歌唱人的時候,如果有著不該變歌曲的調(diào)的要求茂嗓,那么基頻是不能改變的餐茵。
基于聲學參數(shù)修改的語音轉(zhuǎn)歌聲的算法
- 主要修改3個聲學參數(shù):基頻、語音時長和頻譜包絡
-
歌聲和語音的主要區(qū)別是基頻的差距述吸,不是頻譜特征忿族。
- 基頻代表說話人聲帶每次開啟和關閉的時間間隔,反映了聲調(diào)的變化蝌矛〉琅基頻的大小反映了聲帶的大小、厚薄入撒、松緊程度以及聲門上下之間的氣壓差的效應等隆豹。
- 目前提取基頻的有利工具是world
- 基頻分為兩個部分處理:基頻的跳變區(qū)、基頻的平穩(wěn)區(qū)衅金。
- 基頻的擬合:
- w叫是自然頻率;是阻尼系數(shù);k是系統(tǒng)的比例增益
- 歌唱聲音的頻譜包絡在3kHz附近有一個叫做“歌唱共振峰”的顯著峰值噪伊,