一种基于昆曲结构化曲谱合成伴奏的智能引擎系统
文献发布时间:2024-04-18 19:58:30
技术领域
本发明涉及一种音乐合成系统,尤其涉及一种基于昆曲结构化曲谱合成伴奏的智能引擎系统。
背景技术
昆曲是我国传统非物质文化遗传,一般采用中国特有的工尺谱方式进行音乐记谱。昆曲的演奏乐器以昆笛为主,伴随其他陪衬乐器,如琵琶、三弦、二胡甚至偶尔包括古琴、古筝等。当前,昆曲的演奏方式,一般先要通过人工,将工尺谱翻译成简谱,继而,乐队基于简谱一齐演奏。如果通过智能引擎,机器完成工尺谱到简谱(或音素)的智能翻译,继而一键合成昆曲伴奏,将极大程度促进昆曲的普及和应用。
作为生产力工具,本发明人于2021年研发了一套昆曲工尺谱智能平台、并内嵌了史上首个昆曲工尺谱到简谱的智能翻译在线引擎和史上首个昆曲智能伴奏合成引擎,可一键生成以假乱真的以昆笛为主要乐器、辅以其他乐器的昆曲伴奏。该智能引擎自上线一年多以来,受到广泛关注和多家媒体报道,已服务众多用户,生成了大量公益伴奏。此前,发明人已申请了工尺谱智能翻译为简谱的编码和翻译引擎专利,为更进一步促进智能引擎的研发和知识产权权益的保护,本专利提出一种基于昆曲结构化曲谱合成伴奏的智能引擎,保护首个昆曲结构化曲谱数据一键转成合成伴奏的方法。
发明内容
本发明的目的在于提供一种基于昆曲结构化曲谱合成伴奏的智能引擎系统,保护首个昆曲结构化曲谱数据一键转成合成伴奏的方法。
为了实现上述目的,本发明采用了如下技术方案:
一种基于昆曲结构化曲谱合成伴奏的智能引擎系统,包含音符编码规则和合成引擎子系统;编码采用json格式;采用以Python为代表的高级编程语言进行转换;音符编码规则至少包含以简谱音符为最小单位的数组形式,逐个音符包含5个编码位,分别为:简谱音高、装饰腔、上板拍式、起始位、音长;引擎流程包含:预处理模块、逐音循环处理模块和终处理模块三个流程模块加上包含多种函数的函数模块;预处理模块至少包括:全局初始化、背景乐器选择、乐器音量设置、读取乐谱文件、计算是否翻调等子模块;逐音循环处理模块至少包括:前后音符读取、翻调计算、收尾延长音变化处理、按音高和音长编码读取昆笛素材、1/4和3/4类音长处理、音头匹配、两个1拍间垫腔处理、三叠腔处理、豁腔处理、二叠腔类处理、擞腔处理、四密腔处理、两半拍组合间垫腔处理、首要弦乐叠加、锣鼓叠加、次要乐器叠加、添加音头、添加气口和延长音频等子模块;终处理模块至少包括:结尾添加空白和导出文件等子模块;函数模块至少包含:音长音位转换整数、音长音位整数编码、翻调函数和右侧垫腔函数等子模块。流程从预处理模块开始,继而进入逐音循环,每个音处理时,酌情调用函数模块中的各种函数获得输出结果,所有音循环完成后,进入终处理模块生成音频。
进一步地,所述音符编码规则中,音高采用从字母a到字母s编码音高的低音1至高音5;装饰腔采用“0”表示无装饰腔、相同音高编码叠/带/撮腔等二叠腔类、用比当前音更高的不同字母编码豁腔、采用z编码擞腔;上板拍式采用0编码散板、1编码1/4拍、2编码2/4拍和4编码4/4拍,起始位采用16位进制编码,以四分之一拍或十六分音符为最小不可分割单位,以0-9加上a-f编码0-15,共16个位置,分别代表小节头开始多少个四分之一拍或十六分音符;音长采用16位进制编码,以四分之一拍或十六分音符为最小不可分割单位,以0-9加上a-f编码0-15,共16个位置,分别代表音长达到多少个四分之一拍或十六分音符。在音符编码规则的高级拓展版本中,除包括上述5个编码位之外,还包括两个编码位,分别是当前字的四声和当前音符在当前字中的序号,用1至5分别编码阴平、阳平、上声、去声、入声,用0表示无字;以及当前音符是当前字的第几个音符,用以0或1为最小值的整数,表示当前字的音符数组中的序号。
进一步地,所述合成引擎子系统中,关键特征算法如下:
(一)全局初始化子模块包含初始化各种全局变量和设置工作路径;读取乐谱文件子模块包括读取文件、分行读取字符,背景乐器选择子模块通过0和1代表各种乐器的有无;乐器音量设置子模块通过-20到20的小数数值设定全局各种乐器的音量增量值,用于控制各种乐器组合成乐队的最终各自音量;通过调门是否为F调或G调,判断全局是否用翻调运算。
(二)函数模块中,音长音位转换整数函数,将“1”到“9”和“a”到“g”映射为1到16的16个整数,并包含“0”字符到整数0的映射;音长音位整数编码是上述拟运算,将0到16编码为“0”至“g”;翻调函数通过ASCII值的运算,在原有字符对应ASCII值加上3后,再转换为字符,获得输出的翻调编码数值;右侧垫腔函数通过前音(左音)和后音(右音)的不同组合输出垫音结果,垫音用于在前音(左音)之后使用,垫在左右音之间。
(三)逐音循环处理模块中,前后音符读取子模块读取此前的一个音符各项信息和未来三个音符各项信息;翻调计算子模块将当前音高、上一个音高和下一个音输入翻调函数并赋值输出结果;收尾延长音变化处理子模块对于全曲最后一个音符和倒数第二音符的音长赋值,对最后一个音长,不足8时赋值为8,对倒数第二个音符,当其不足4时赋值为4、在大于3小于6时赋值为6,在大于5小于8时按赋值为8;音高和音长编码读取昆笛素材子模块根据音高编码和音长编码组成指定的昆笛音素路径名并读取音频;1/4和3/4类音长处理子模块,对于音长整数不能被2整除的,读取相关更大一个整数音长的昆笛音素并删除最后的对应一个四分之一拍或十六分音符的音频区段;音头匹配子模块根据音高编码读取对应音高的昆笛音头素材音频,并通过判断当前音长整数大于3或上一个音的上板拍式为散板“0”,且上一个音装装饰腔编码为“0”,则音头赋值为读取的音头素材否则音头为空白小音频段,音头赋值好后用于后期添加音头;两个1拍间垫腔处理子模块根据是否翻调、当前音符在完整音符数组中的位置、音位整数是否被4整除、音长是否为4、当前音高、上一个音高和下一个音高等变量,输出垫腔音高,且垫腔长度均为1,读取垫腔对应乐器音频,将左侧音截断保留指定长度后以交叉淡化方式连接垫腔音频,赋值为新的左侧单位音频,而右侧音通过垫腔截取指定长度赋值右侧音的音头,用于后期添加音头;三叠腔处理子模块至少包括对第二叠腔采用通过ASCII值的运算,在原有字符对应ASCII值加上1后,再转换为字符,获得输出的更改音高的编码,并读取相应音高的乐器音素音频;豁腔处理子模块在判断豁腔条件后,通过装饰腔的豁腔对应音高读取相应音高的乐器音素音频,将当前音截断保留指定长度后以交叉淡化方式连接豁腔音频,赋值为新的当前音;二叠腔类处理子模块在判断二叠腔类条件后,将当前音分别截取不同指定长度作为左右两音,并采用音头匹配子模块算法读取音头音频再对音头进行截取指定长度,通过交叉淡化方式,采用左侧音+音头片段+右侧音方式连接三个音频片段(分别为本音片段1、本音片段2、本音片段3),更新为当前音;擞腔处理子模块采用当前音的不同片段,加上通过ASCII值的运算,在原有字符对应ASCII值加上1后,再转换为字符,获得输出的更改音高的编码,作为擞腔高音音高编码,并读取相应音高的乐器音素音频,最后通过交叉淡化方式,采用本音片段1+高音片段+本音片段2+本音片段3方式连接四个片段,更新为当前音;四密腔处理子模块,判断一拍内四密腔条件后,将第一密腔的音长改为2,读取相应乐器音素音频后截取相应片段,使音频长度约为原始四分之一拍的1.5倍,将第二密腔截取相应片段,使音频长度约为原始四分之一拍0.6倍;两半拍组合间垫腔处理子模块,根据当前音符在完整音符数组中的位置、音位整数被4除后余数为0或2、音长是否为2、装饰腔是否为“0”、当前音高、上一个音高、下一个音高、三个音高ASCII值的彼此差值关系,输出垫腔音高,且垫腔长度均为1,读取垫腔对应乐器音频,将左侧音截断保留指定长度后以交叉淡化方式连接垫腔音频,赋值为新的左侧单位音频,而右侧音通过垫腔截取指定长度赋值右侧音的音头,用于后期添加音头;首要弦乐叠加子模块,在已生成的当前音,叠加首要弦乐,即必须添加的弦乐(琵琶和三弦),以当前音长度为长度叠加弦乐后,更新当前音;锣鼓叠加子模块,根据音位编码和上板拍式,在读取锣鼓音频文件后,对锣鼓音频的开始部位进行计算并截取去除指定长度的头部,以尾部叠加当前音,并更新当前音,如当前为擞腔等特殊腔格则读取特殊腔格锣鼓叠加;次要乐器叠加子模块,读取非必须添加的用户人工选择的乐器,根据音高编码读取鼓音频文件后,以当前音长度为长度叠加当前音,更新当前音;添加音头子模块将以读取或运算赋值的音头音频,以交叉淡化方式连缀于当前音之前;添加气口子模块在判断当前音是最末尾音或开头第一音时,在音前添加空白静音时段音频,并更新当前音;延长音频子模块将生成的伴奏音频以交叉淡入方式连接附加当前音。
(四)终处理模块中,结尾添加空白子模块,在生成的音频结尾添加少量时段的空白静音;导出文件子模块将音频文件以指定的音频格式(包括但不限于wav、mp3、m4a等格式)导出至设定目录。
进一步地,所述引擎中,编程语言优选为Python,且包含音频处理库,音频处理库优选为pydub,并调用ffmpeg程序完成。
与现有技术相比,本发明提供了一种基于昆曲结构化曲谱合成伴奏的智能引擎系统,具备以下有益效果:
本发明提出一种基于昆曲结构化曲谱合成伴奏的智能引擎系统,可一键生成以假乱真的以昆笛为主要乐器、辅以其他乐器的昆曲伴奏,操作简单、便利,应用场景广泛。作为生产效率工具,对于恢复活化传统昆曲古籍,不管从效率上还是范围上,都具有重大意义。在中国,以昆曲为例,还有99%的曲子沉睡在古籍中,没有被人听过和唱过。之所以存在此现状,是由于一部传统古籍,需要资深专业人士和团队,耗费几年的功夫,才能翻译完成;然后再经过专业的录入简谱、排版、校对,最终成为人们方便阅读的简谱作品。然后,由多人组成的昆曲乐队一起演奏简谱,才可以听到;在这个基础上,才具有剧团排演的可能性。而利用本发明转化的产品,可以跳跃以上传统步骤,直接生成用于排练甚至演出用的伴奏。本发明对应的产品,在2021年初步研发完成,2022年春上线后,是全世界首个结构化工尺谱自动生成伴奏的智能引擎,受到广泛好评,服务了大量用户。
附图说明
图1为本发明提出的一种基于昆曲结构化曲谱合成伴奏的智能引擎系统的系统组成和流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
请参阅图1,本发明提出一种基于昆曲结构化曲谱合成伴奏的智能引擎系统,包括音符编码规则和合成引擎子系统;如图1所示,合成引擎子系统包含:三个流程模块和一个函数模块;三个流程模块分别为:(1)预处理模块、(2)逐音循环处理模块和(3)终处理模块;函数模块包含多种函数。合成引擎子系统的流程从预处理模块开始,继而进入逐音循环,每个音处理时,酌情调用函数模块中的各种函数获得输出结果,所有音循环完成后,进入终处理模块生成音频。预处理模块至少包括:全局初始化、背景乐器选择、乐器音量设置、读取乐谱文件、计算是否翻调等子模块;逐音循环处理模块至少包括:前后音符读取、翻调计算、收尾延长音变化处理、按音高和音长编码读取昆笛素材、1/4和3/4类音长处理、音头匹配、两个1拍间垫腔处理、三叠腔处理、豁腔处理、二叠腔类处理、擞腔处理、四密腔处理、两半拍组合间垫腔处理、首要弦乐叠加、锣鼓叠加、次要乐器叠加、添加音头、添加气口和延长音频等子模块;终处理模块至少包括:结尾添加空白和导出文件等子模块;函数模块至少包含:音长音位转换整数、音长音位整数编码、翻调函数和右侧垫腔函数等子模块。
结合上述内容,对本发明的多个优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,重点在于阐述本编码方式和翻译效果,并不用于限定本发明,具体内容如下。
实施例1:
本实施例展示通过Python实现音长音位转换整数函数的方法:
def transyinchang(yinchang):
if(yinchang=='1'):
return 1
elif(yinchang=='2'):
return 2
elif(yinchang=='3'):
return 3
elif(yinchang=='4'):
return 4
elif(yinchang=='5'):
return 5
elif(yinchang=='6'):
return 6
elif(yinchang=='7'):
return 7
elif(yinchang=='8'):
return 8
elif(yinchang=='9'):
return 9
elif(yinchang=='a'):
return 10
elif(yinchang=='b'):
return 11
elif(yinchang=='c'):
return 12
elif(yinchang=='d'):
return 13
elif(yinchang=='e'):
return 14
elif(yinchang=='f'):
return 15
elif(yinchang=='g'):
return 16
elif(yinchang=='0'):
return 0
实施例2:
本实施例展示通过Python实现音长音位整数编码函数的方法:deftransintyinchang(intyinchang):
if(intyinchang==1):
return'1'
elif(intyinchang==2):
return'2'
elif(intyinchang==3):
return'3'
elif(intyinchang==4):
return'4'
elif(intyinchang==5):
return'5'
elif(intyinchang==6):
return'6'
elif(intyinchang==7):
return'7'
elif(intyinchang==8):
return'8'
elif(intyinchang==9):
return'9'
elif(intyinchang==10):
return'a'
elif(intyinchang==11):
return'b'
elif(intyinchang==12):
return'c'
elif(intyinchang==13):
return'd'
elif(intyinchang==14):
return'e'
elif(intyinchang==15):
return'f'
elif(intyinchang==16):
return'g'
elif(intyinchang==0):
return'0'
实施例3:
本实施例展示通过Python实现翻调函数的方法:def fandiao(oriyin):
oriyinasc=ord(oriyin)
if(oriyin=="0"or oriyin=="z"):
fandiaoyinasc=oriyinasc
else:
fandiaoyinasc=oriyinasc+3
fandiaoyin=chr(fandiaoyinasc)
return fandiaoyin
实施例4:
本实施例展示通过Python实现右侧垫腔函数的方法:def dianqiang(left,right):
if(left=="b"and right=="c"):
dian="a"
elif(left=="b"and right=="e"):
dian="c"
elif(left=="c"and right=="a"):
dian="b"
elif(left=="c"and right=="b"):
dian="d"
elif(left=="c"and right=="e"):
dian="b"
elif(left=="c"and right=="f"):
dian="e"
elif(left=="d"and right=="b"):
dian="c"
elif(left=="d"and right=="c"):
dian="e"
elif(left=="d"and right=="e"):
dian="f"
elif(left=="d"and right=="f"):
dian="e"
elif(left=="e"and right=="b"):
dian="c"
elif(left=="e"and right=="c"):
dian="e"
elif(left=="e"and right=="d"):
dian="f"
elif(left=="e"and right=="f"):
dian="c"
elif(left=="e"and right=="h"):
dian="f"
elif(left=="f"and right=="c"):
dian="e"
elif(left=="f"and right=="d"):
dian="e"
elif(left=="f"and right=="e"):
dian="g"
elif(left=="f"and right=="h"):
dian="e"
elif(left=="f"and right=="i"):
dian="h"
elif(left=="g"and right=="e"):
dian="f"
elif(left=="g"and right=="f"):
dian="h"
elif(left=="g"and right=="h"):
dian="i"
elif(left=="g"and right=="i"):
dian="g"
elif(left=="h"and right=="e"):
dian="f"
elif(left=="h"and right=="f"):
dian="h"
elif(left=="h"and right=="g"):
dian="i"
elif(left=="h"and right=="i"):
dian="f"
elif(left=="h"and right=="j"):
dian="i"
elif(left=="i"and right=="f"):
dian="i"
elif(left=="i"and right=="g"):
dian="h"
elif(left=="i"and right=="h"):
dian="j"
elif(left=="i"and right=="j"):
dian="h"
elif(left=="i"and right=="k"and musicfandiao==1):
dian="h"
elif(left=="i"and right=="l"and musicfandiao!=1):
dian="j"
elif(left=="i"and right=="l"and musicfandiao==1):
dian="k"
elif(left=="j"and right=="h"):
dian="i"
elif(left=="j"and right=="i"):
dian="k"
elif(left=="j"and right=="k"):
dian="j"
elif(left=="j"and right=="l"):
dian="i"
elif(left=="j"and right=="m"):
dian="l"
elif(left=="k"and right=="l"):
dian="i"
elif(left=="k"):
dian="l"
elif(left=="l"and right=="i"):
dian="j"
elif(left=="l"and right=="j"):
dian="m"
elif(left=="l"and right=="d"):
dian="m"
elif(left=="l"and right=="m"and musicfandiao==0):
dian="j"
elif(left=="l"and right=="m"and musicfandiao==1):
dian="k"
elif(left=="l"and right=="o"):
dian="m"
elif(left=="m"and right=="j"):
dian="l"
elif(left=="m"and right=="d"):
dian="l"
elif(left=="m"and right=="l"):
dian="n"
elif(left=="m"and right=="n"):
dian="m"
elif(left=="m"and right=="o"):
dian="l"
elif(left=="m"and right=="p"):
dian="o"
elif(left=="n"and right=="l"):
dian="m"
elif(left=="n"and right=="m"):
dian="o"
elif(left=="n"and right=="o"):
dian="p"
elif(left=="n"and right=="p"):
dian="n"
elif(left=="o"and right=="l"):
dian="m"
elif(left=="o"and right=="m"):
dian="p"
elif(left=="o"and right=="n"):
dian="p"
elif(left=="o"and right=="p"):
dian="m"
elif(left=="o"and right=="q"):
dian="p"
elif(left=="p"and right=="m"):
dian="o"
elif(left=="p"and right=="n"):
dian="o"
elif(left=="p"and right=="o"):
dian="q"
elif(left=="p"and right=="q"):
dian="o"
elif(left=="p"and right=="s"):
dian="q"
elif(left=="q"and right=="o"):
dian="p"
elif(left=="q"and right=="p"):
dian="r"
elif(left=="q"and right=="s"):
dian="p"
else:
dian=chr(ord(left)+1)
return dian
实施例5:
本实施例展示通过Python实现两个1拍间垫腔处理子模块的方法:
if(i if(musicfandiao==0and yingao=="b"and nextyingao=="c"): dianyin=AudioSegment.from_file("a1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==0and yingao=="c"and nextyingao=="e"): dianyin=AudioSegment.from_file("b1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="e"and nextyingao=="h"): dianyin=AudioSegment.from_file("f1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="f"and(nextyingao=="h"or nextyingao=="g"ornextyingao=="f")): dianyin=AudioSegment.from_file("e1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="f"and nextyingao=="i"): dianyin=AudioSegment.from_file("h1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="i"and nextyingao=="h"): dianyin=AudioSegment.from_file("i1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==0 and yingao=="i"and(nextyingao=="j"ornextyingao=="i")): dianyin=AudioSegment.from_file("h1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="i"and nextyingao=="k"): dianyin=AudioSegment.from_file("h1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==0 and yingao=="j"and(nextyingao=="l"ornextyingao=="j")): dianyin=AudioSegment.from_file("i1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="m"and yingao=="o"): dianyin=AudioSegment.from_file("l1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==1 and yingao=="e"and nextyingao=="f"): dianyin=AudioSegment.from_file("d1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==1 and yingao=="f"and nextyingao=="h"): dianyin=AudioSegment.from_file("e1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(yingao=="i"and nextyingao=="k"): dianyin=AudioSegment.from_file("h1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==1 and yingao=="l"and nextyingao=="m"): dianyin=AudioSegment.from_file("k1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==0 and yingao=="m"and nextyingao=="o"): dianyin=AudioSegment.from_file("l1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) elif(musicfandiao==0 and yingao=="p"and nextyingao=="r"): dianyin=AudioSegment.from_file("o1.wav")[:200] dianyin=dianyin.apply_gain(-3) eachyin=eachyin[:800].append(dianyin,crossfade=20) if(i if(musicfandiao==0 and lastyingao=="b"and yingao=="c"): head=AudioSegment.from_file("a1.wav")[:200] elif(musicfandiao==0 and lastyingao=="c"and yingao=="e"): head=AudioSegment.from_file("b1.wav")[:200] elif(lastyingao=="e"and yingao=="h"): head=AudioSegment.from_file("f1.wav")[:200] elif(musicfandiao==0 and lastyingao=="f"and yingao=="h"): head=AudioSegment.from_file("e1.wav")[:200] elif(lastyingao=="f"and yingao=="i"): head=AudioSegment.from_file("h1.wav")[:200] elif(lastyingao=="f"and yingao=="f"): head=AudioSegment.from_file("e1.wav")[:200] elif(lastyingao=="i"and yingao=="h"): head=AudioSegment.from_file("i1.wav")[:200] elif(musicfandiao==0and lastyingao=="i"and(yingao=="j"or yingao=="i")): head=AudioSegment.from_file("h1.wav")[:200] elif(lastyingao=="i"and yingao=="h"): head=AudioSegment.from_file("h1.wav")[:200] elif(musicfandiao==0and lastyingao=="j"and yingao=="l"): head=AudioSegment.from_file("i1.wav")[:200] elif(lastyingao=="j"and yingao=="j"): head=AudioSegment.from_file("i1.wav")[:200] elif(lastyingao=="m"and yingao=="o"): head=AudioSegment.from_file("l1.wav")[:200] elif(musicfandiao==1and lastyingao=="e"and yingao=="f"): head=AudioSegment.from_file("d1.wav")[:200] elif(musicfandiao==1and lastyingao=="f"and yingao=="h"): head=AudioSegment.from_file("e1.wav")[:200] elif(musicfandiao==0and lastyingao=="i"and yingao=="k"): head=AudioSegment.from_file("h1.wav")[:200] elif(musicfandiao==1and lastyingao=="l"and yingao=="m"): head=AudioSegment.from_file("k1.wav")[:200] elif(musicfandiao==0and lastyingao=="m"and yingao=="o"): head=AudioSegment.from_file("l1.wav")[:200] elif(lastyingao=="m"and yingao=="m"): head=AudioSegment.from_file("l1.wav")[:200] elif(musicfandiao==0and lastyingao=="p"and yingao=="r"): head=AudioSegment.from_file("o1.wav")[:200] 实施例6: 本实施例展示通过Python实现擞腔处理子模块的方法: elif(yin[1]=='z'and transyinchang(yinchang)==4): shiqiangpath=yingao+'1.wav' asc1=ord(yingao) asc2=asc1+1 souhigh=chr(asc2) souhighpath=souhigh+'1.wav' shiqiang=AudioSegment.from_file(shiqiangpath) #装饰腔加弦:本音 shiqiangxianlong=AudioSegment.from_file("X"+yingao+"long.wav") shiqiangxianlong=shiqiangxianlong.apply_gain(yingxiangain) shiqiang=shiqiang.overlay(shiqiangxianlong) shiqiangxianlun=AudioSegment.from_file("X"+yingao+"lun.wav") shiqiangxianlun=shiqiangxianlun.apply_gain(lunxiangain) shiqiang=shiqiang.overlay(shiqiangxianlun) shiqiangduan=shiqiang[:200] #装饰腔加弦:高音 souhighqiang=AudioSegment.from_file(souhighpath) souhighqiangxianlong=AudioSegment.from_file("X"+souhigh+"long.wav") souhighqiangxianlong=souhighqiangxianlong.apply_gain(yingxiangain) souhighqiang=souhighqiang.overlay(souhighqiangxianlong) souhighqiangxianlun=AudioSegment.from_file("X"+souhigh+"lun.wav") souhighqiangxianlun=souhighqiangxianlun.apply_gain(lunxiangain) souhighqiang=souhighqiang.overlay(souhighqiangxianlun) eachyin=shiqiang.append(souhighqiang,crossfade=10) eachyin=eachyin.append(shiqiangduan,crossfade=10) eachyin=eachyin.append(blank100ms,crossfade=10) eachyin=eachyin.append(shiqiang,crossfade=10) 以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。
- 一种用于音乐智能伴奏的方法及系统
- 一种基于流式计算引擎的结构化风控实现方法和系统
- 一种基于深度学习算法的智能伴奏系统