一、录制每个需要的葫芦丝音节

二、按照一定规则输入乐谱

三、根据乐谱把音节组合成完整的曲子并以mp3格式输出

四、运行代码的准备工作

1.需要安装配置python

2.安装python的ffmpeg库、pydub库

3.安装并配置FFmpeg:

FFmpeg下载地址:https://www.videohelp.com/software/ffmpeg/old-versions

解压后将bin文件夹的路径添加到用户环境变量的路径变量中即可。

五、python源代码

from pydub import AudioSegment
if __name__ == '__main__':print("请输入乐谱,0表示暂停,*表示重复上一个音符的音,去掉音节开头")print("可选范围:-3,-5,-6,-7,1,2,3,4,5,6,0,*,两个音节之间不要有其它符号")#-0.7表示没有开头的深7,7表示有开头的7,-7表示有开头的深7yuepu=str(input())#输入乐谱islow=0newyuepu=[]repeat=0#将字符串格式的乐谱转化为列表for i in range(len(yuepu)):if (yuepu[i]=='-'):islow=1continueif islow==1 :newyuepu.append(-int(yuepu[i]))repeat=-int(yuepu[i])islow=0else :if yuepu[i]!='*':repeat=int(yuepu[i])newyuepu.append(yuepu[i])else :newyuepu.append(repeat/10)#创建一个空的音频对象result=AudioSegment.empty()isreversed = 0happen=2#根据乐谱来组合音节,形成完整的乐曲for j in range(len(newyuepu)):print(1)path='E:/pycharm_project/hulusi/'+str(newyuepu[j])+'.mp3'print(path)newmusic=AudioSegment.from_file(path)#让相邻的相同音来回倒转,减少不适感if (int(newyuepu[j])>1) or int(newyuepu[j])<-1:isreversed=0if (int(newyuepu[j])<1 and int(newyuepu[j])>-1 and isreversed==0):newmusic=newmusic.reverse()isreversed=1happen=1if (int(newyuepu[j]) < 1 and int(newyuepu[j]) > -1 and isreversed == 1 and happen==0):isreversed = 0happen=0result = result + newmusic#输出乐曲result.export("E:/pycharm_project/hulusi/ooo.mp3", format="mp3")print(newyuepu)

六、代码改进方向

1.可以通过读取每个音节的时长从而调整倍速

2.可以用多个不同调的葫芦丝录制音节从而丰富音调数量

3.可以利用图形界面增加使用体验

4.可以读取每个音节的时长,剪裁部分时长达到倍速效果

5.可以用一堆if....else或者机器学习来添加波音,调整音量等,使输出音频更加悦耳

6..........................................

七、改进版本

1.增加了全局倍速功能

2.增加了判断输出文件名是否重复功能

3.增加了“多波音”,“适量波音”,“无波音”三种模式

4.增加了局部倍速功能,方便微调

5.优化了音节之间的衔接效果,听起来更自然了

from pydub import AudioSegment
import os
if __name__ == '__main__':type=str(input("请输入音节特点,1:多波音,2:适量波音,3:无波音"))print("请输入乐谱,0表示暂停,*表示重复上一个音符的音,去掉音节开头")print("可选范围:-3,-5,-6,-7,1,2,3,4,5,6,0,*,两个音节之间不要有其它符号")#-0.7表示没有开头的深7,7表示有开头的7,-7表示有开头的深7yuepu=str(input())#输入乐谱speed=float(input('请输入倍速'))name = ''#判断文件名是否可用while 1:name = str(input('请输入输出的文件名'))name1 = name + '.mp3'a = []for files in os.walk('E:/pycharm_project/hulusi/type/' + '1' + '/' + 'result'):a = files[2]if name1 in a:print('文件名重复,请重新输入')continueelse:print('文件名', name1, '可用')breakislow=0newyuepu=[]repeat=0count=-1#检测是否需要局部倍速is_continue=0#需要跳过的字符数count_and_u_speed={}#将字符串格式的乐谱转化为列表for i in range(len(yuepu)):if is_continue>0:is_continue-=1continueif (yuepu[i]=='+'):j=i+1while yuepu[j]!='/':j=j+1u_speed=float(yuepu[i+1:j])is_continue=j-icount_and_u_speed[count]=u_speedcontinueif (yuepu[i]=='-'):islow=1continueif islow==1 :newyuepu.append(-int(yuepu[i]))count+=1repeat=-int(yuepu[i])islow=0else :if yuepu[i]!='*':repeat=int(yuepu[i])newyuepu.append(yuepu[i])count+=1if yuepu[i]=='*' :newyuepu.append(repeat/10)count+=1#创建一个空的音频对象result=AudioSegment.empty()isreversed = 0happen=2is_tiaoguo=0last=AudioSegment.empty()#根据乐谱来组合音节,形成完整的乐曲print(len(newyuepu))for j in range(len(newyuepu)):if is_tiaoguo>0:is_tiaoguo-=1continuetimes=0path='E:/pycharm_project/hulusi/type/'+type+'/'+str(newyuepu[j])+'.mp3'k=jif float(newyuepu[j+1])>0.98 or float(newyuepu[j+1])<-0.98:newmusic = AudioSegment.from_file(path)print(path)else:is_tiaoguo=0next = AudioSegment.from_file('E:/pycharm_project/hulusi/type/' + type + '/' + str(newyuepu[j+1]) + '.mp3')h=j+1while (float(newyuepu[h])<1 and float(newyuepu[h])>-1):times+=1is_tiaoguo+=1h=h+1if h==len(newyuepu):breaklast=AudioSegment.from_file('E:/pycharm_project/hulusi/type/' + type + '/' + str(newyuepu[j]) + '.mp3')shichang=last.duration_seconds*1000*(times+1)newmusic=next[:shichang]print('E:/pycharm_project/hulusi/type/' + type + '/' + str(newyuepu[j+1]) + '.mp3',j)#先实现整体倍速long=newmusic.duration_seconds*1000start=int(long/speed)if speed>=1:newmusic=newmusic[:start]else:newmusic=newmusic*2newmusic=newmusic[:long]+newmusic[long+60:]newmusic=newmusic[:start]#再实现局部倍速if count_and_u_speed.__contains__(j):aaa=count_and_u_speed[j]print('第',j,'个音是:',newyuepu[j],'    这个音的倍速为:',aaa)print(path)long1=newmusic.duration_seconds * 1000start1 = int(long1 / aaa)if aaa>=1:newmusic=newmusic[:start1]else:newmusic = newmusic * 2newmusic = newmusic[:long1] + newmusic[long1 + 50:]newmusic = newmusic[:start1]else:print('第',j,'个音是',newyuepu[j])print(path)#让相邻的相同音来回倒转,减少不适感'''if (int(newyuepu[j])>1) or int(newyuepu[j])<-1:isreversed=0if (int(newyuepu[j])<1 and int(newyuepu[j])>-1 and isreversed==0):newmusic=newmusic.reverse()isreversed=1happen=1if (int(newyuepu[j]) < 1 and int(newyuepu[j]) > -1 and isreversed == 1 and happen==0):isreversed = 0happen=0'''end=result.duration_seconds*1000result = result + newmusicresult=result[:end]+result[end+60:]#输出乐曲result.export('E:/pycharm_project/hulusi/type/'+type+'/'+'result/'+name+'.mp3', format="mp3")print('乐谱:')print(newyuepu)print('mp3路径为:','E:/pycharm_project/hulusi/type/'+type+'/'+'result/'+name+'.mp3')

python---用单个葫芦丝音节合成完整的曲目相关推荐

  1. 优美动听的葫芦丝名曲

    滇南古韵葫芦丝 http://blog.sina.com.cn/51hulusi 优美动听的葫芦丝名曲 http://www.360doc.com/content/12/1113/08/1029565 ...

  2. [Python] 用python做一个游戏辅助脚本,完整思路

    [Python] 用python做一个游戏辅助脚本,完整思路 一.说明 简述:本文将以4399小游戏<宠物连连看经典版2>作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对.对于有兴 ...

  3. 零基础编程入门python视频-Python编程零基础小白快速入门完整全系列精品课

    1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...

  4. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

  5. Python实现恩尼格玛加密算法——附完整源码

    Python实现恩尼格玛加密算法--附完整源码 恩尼格玛是第二次世界大战中德国所使用的复杂电机械式密码机.它被认为是世界上最复杂的加密设备之一.在这个项目中,我们将使用Python模拟实现恩尼格玛加密 ...

  6. 用Python代码画一个足球(附完整代码)

    用Python代码画一个足球(附完整代码) C站举办了世界杯征文活动,本文用Python代码画一个足球. 实现方法介绍 本文的绘图工具使用Python的标准库turtle库,无需安装,导入即可使用. ...

  7. Python实现修改图片分辨率(含完整源码)

    Python实现修改图片分辨率(含完整源码) 在我们日常的工作和学习中,经常需要处理图片.有时候,我们可能需要修改图片的分辨率,以适应不同的需求.本文将介绍如何使用Python来实现修改图片的分辨率, ...

  8. 标题python之单个小写字母转为大写字母(洛谷P5704)

    标题python之单个小写字母转为大写字母(洛谷P5704) 字母转换 展开 题目描述 输入一个小写字母,输出其对应的大写字母.例如输入 q[回车] 时,会输出 Q. 输入格式 无 输出格式 无 in ...

  9. 用Python爬取最新股票数据含完整源代码

    用Python爬取最新股票数据含完整源代码 抓取目标: url:http://webapi.cninfo.com.cn/#/marketDataDate 数据目标: 获取 证券代码 证券简称 交易日期 ...

最新文章

  1. Java 9 - 17 特性解读:Java 11
  2. 关于RF中类似于异常(TRY语句)情况的处理
  3. 汽车新零售转型之路怎么走?你需要知道这些
  4. 渗透测试之信息收集篇
  5. kdbg调试linux汇编,Ubuntu 16.04安装Kdbg替代Insight实现汇编的调试
  6. Azure App Service 如何在第一时间用上最新版 .NET Core
  7. C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
  8. php 特有,PHP单一入口的特有作用
  9. elementUI 分页组件的使用 - 踩坑篇
  10. web多线程之webworkers
  11. 错误未找到引用源_你好,C++(77)12.1 用右值引用榨干C++的性能
  12. Sql Server trace flags
  13. Python 类与对象
  14. access实验报告体会_Access2010实验报告
  15. mysql8中文手册_mysql8 参考手册--mysql8 官方介绍
  16. voip和rtc_VOIP的发展进化史
  17. [渝粤教育] 西南石油大学 普通地质学 参考 资料
  18. ADXL345 三轴加速度角度传感器
  19. 数字后端基本概念介绍Blockage Link
  20. NFS nfs4_reclaim_open_state lock reclaim failed

热门文章

  1. WooCommerce可扩展性:如何扩大您的WooCommerce商店
  2. Django入门(一)
  3. JQury及其选择器
  4. 张宏 :移动机器人全局定位技术与方法是啥?道翰天琼认知智能机器人平台API接口大脑为您揭秘。
  5. 唯品会还“品“的动吗?
  6. 微软C/C++编译器选项
  7. 大数据和云计算是如何结合
  8. 为什么有人会说「感谢拼多多」,让一贫如洗的我还能活下去?
  9. 微信墙java源码_高仿微信java代码
  10. LineRenderer组件