Python 简单生成 WAV 波形声音文件

让机器发出声响,本身就是一件充满魔法的事情。有没有想过,用一段简单的代码,生成一个最简单的声音呢?
Python 这门脚本语言的库十分丰富,借助于其中的三个内置模块就能完成这件神奇的事情:
math 模块提供了圆周率常量 pi 和正弦函数 sin, 这些使得我们无需掌握高等数学就可以完成今天的任务;
wave 模块提供了读取和写入波形文件数据的功能,使得我们无需操心 wave 文件的技术细节,就可以把波形数据写入到其中;
struct 可以将数据打包成二进制数据,这方便了我们可以把计算到的数据封装成二进制数据写入 wave 文件
此外,我们还需要对声音的本质以及三角函数有一定的认识。
下面是我拙劣的代码,希望大佬们勿喷。
"""产生正弦波形的音频文件。"""
from ast import Str
import math
import struct
import wave
def sinewave(limit: int, a: int, omega: float):
"""正弦波样本生成器。
limit 指定生成的总样本数
a 指定振幅大小
omega 指定角转速
"""
for n in range(limit):
yield int(a*math.sin(omega*n))
def generateSineWaveFile(file: Str, sampleRate: int, frequency: int, duration: float):
"""生成一个特定正弦波的音频文件。
file 指定文件名
sampleRate 指定采样频率(单位:赫兹)
frequency 指定频率(单位: 赫兹)
duration 指定时常(单位:秒)
"""
# 振幅。
amplitude = 10000
# 每周期样本数。
samplesPerCycle = sampleRate // frequency
# 总样本数。
totalSamples = int(duration*sampleRate)
# 使最后一次的样本值与第一次样本值相同,都为 0,因此需要保证 totalSamples 是 samplesPerCycle 的倍数 + 1。
if rem := totalSamples % samplesPerCycle:
totalSamples = totalSamples+(samplesPerCycle - rem)
totalSamples = totalSamples+1
# 创建波形文件并循环写入采样数据。
with wave.open(file, 'wb') as wf:
# 设置为单声道。
wf.setnchannels(1)
# 设置采样量化位数为双字节16位。
wf.setsampwidth(2)
# 设置采样率。
wf.setframerate(sampleRate)
# 样本间隔角旋转量。
omega = 2*math.pi/(sampleRate/frequency)
# 遍历每一个采样点。
for s in sinewave(totalSamples, amplitude, omega):
# 将采样数据打包成字节数据写入波形文件。
data = struct.pack('<h', int(s))
wf.writeframes(data)
# 以脚本运行时根据用户提示生成一个示例文件。
if __name__ == "__main__":
print('简易波形生成器')
filename = input('请输入用于保存波形的文件名: ')
frequency = int(input('正弦波的声音频率(单位:赫兹):'))
duration = float(input('持续时间()单位:秒: '))
generateSineWaveFile(filename, 48000, frequency, duration)

用 Python 简单生成 WAV 波形声音文件的更多相关文章

  1. MmSystem播放Wav格式声音

    //MmSystem播放Wav格式声音 //MmSystem 支持 *.wav声音格式 snd ->SoundRecorderuses MmSystem; //引用MmSystem//播放系统声 ...

  2. 解析WAV音频文件----》生成WAV音频文件头

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i WAV音频文件介绍: WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统 ...

  3. Python中生成(写入数据到)Excel文件

      转自http://www.crifan.com/export_data_to_excel_file_in_python/ 在Python中,如何将数据,导出为Excel,即把数据写入到新生成的ex ...

  4. myeclipse(2015)中创建简单的Maven项目的步骤(用于生成可执行jar文件)------》myeclipse2015

    利用MyEclipse的引导,可以很方便的创建简单的.用于生成可执行jar文件的Maven项目: 1.New -> Project... 选择 Maven Project, 点击Next > ...

  5. python使用简单http协议来传送文件

    python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServ ...

  6. 从用python自动生成.h的头文件集合和类声明集合到用python读写文件

    最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...

  7. 利用Python 脚本生成 .h5 文件 代码

    利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...

  8. pcm数据生成wav文件

    Qt由pcm数据生成wav文件 void AudioGrabber::saveWave(const QString &fileName, const QByteArray &raw, ...

  9. 图文介绍MyEclipse (2015) 中创建简单的Maven项目的步骤(用于生成可运行jar文件)

    利用MyEclipse的引导,能够非常方便的创建简单的.用于生成可运行jar文件的Maven项目: (原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/cl ...

随机推荐

  1. js字符串首字母大写的不同写法

    写法一: let name = 'hello' name.charAt(0).toUpperCase() + name.slice(1) 写法二: let name = 'hello' name.sl ...

  2. 基于 Keras 实现图像风格转移

     Style Transfer 这个方向火起来是从2015年Gatys发表的Paper A Neural Algorithm of Artistic Style(神经风格迁移) , 这里就简单提一下论 ...

  3. Javascript实现让小图片一直跟着鼠标移动

    Javascript实现让小图片一直跟着鼠标移动实例 注意:图片可能加载不出来,注意更换 <!doctype html> <html> <head> <met ...

  4. 发现一个现象:golang中大量的go出新协程,必然在GC统计中出现1ms以上的GC延迟

    结论:协程池还是有必要的,能够有效减小GC的压力. 我的某个服务,为了方(tou)便(lan),一些异步处理的场合直接go出协程来处理. 服务中使用这样的代码来统计GC的延迟: var mem run ...

  5. 关于3G移动通信网络中用户ip的配置过程的研究(中国电信cdma2000)

    在RP口对ppp过程进行研究 PPP协商过程,如下图所示: 在建立ppp过程中pdsn需要与FAAA.HAAA交互.同时在分组数据业务进行过程中这种交互更加频繁,介绍如下,分为两种情况,简单ip,移动 ...

  6. 使用 Swoole 加速你的 CMS 系统

    项目介绍 MyCms是一款基于Laravel开发的开源免费的自媒体博客CMS系统,适用于个人网站及企业网站开发使用,助力个人开发者知识技术变现 Swoole介绍 Swoole: PHP的异步.并行.高 ...

  7. 公司内部一次关于kafka消息队列消费积压故障复盘分享

    背景现象 1.20晚上8点业务线开始切换LBS相关流量,在之后的1个小时时间内,积压量呈上升趋势,一路到达50W左右,第二天的图没贴出具体是50W数字,以下是第一天晚上的贴图部分. 现象一: 现象二: ...

  8. golang中的反射解析结构体标签tag

    package main import ( "fmt" "reflect" ) type resume struct { // 反射解析结构体标签tag Nam ...

  9. 获取URL中的某段字符

    1. Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问. ️ ...

  10. Python写春联(turtle版)

    Python就好比编程界的瑞士军刀,开箱即用.无所不能.这得益于Python简洁易用的语法,以及丰富的第三方库,你想在电脑上做什么,总能找到事半功倍的第三方库.比如,在这新春佳节之际,用Python来 ...