- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了一个简单的 Python 程序来读取一个 wave 文件,并在更改后将其存储为一个新文件。
import codecs, wave
#convert a number to its two's complemented value (For positive it is equal itself)
def convert_to_twos(value, wid_len=16):
if value < 0 :
value = value + (1 << wid_len)
return value
#receive the value of a two's complemented number.
def twos_back_value(value, wid_len=16):
if value & (1 << wid_len -1):
value = value - (1 << wid_len)
return value
#opening files
input_file = wave.open(r"<address of input wave file>", 'r')
output_file = wave.open(r"<an address for output wave file>", 'w')
#Get input file parameters and set them to the output file after modifing the channel number.
out_params = [None, None, None, None, None, None]
in_params = input_file.getparams()
out_params[0] = 1 # I want to have a mono type wave file in output. so I set the channels = 1
out_params[1] = in_params[1] #Frame Width
out_params[2] = in_params[2] #Sample Rate
out_params[3] = in_params[3] #Number of Frames
out_params[4] = in_params[4] #Type
out_params[5] = in_params[5] #Compressed or not
output_file.setparams(out_params)
#reading frames from first file and storing in the second file
for frame in range(out_params[2]):
value = int(codecs.getencoder('hex')(input_file.readframes(1))[0][:4], 16) #converting first two bytes of each frame (let assume each channel has two bytes frame length) to int (from byte string).
t_back_value = twos_back_value( value ,out_params[1]*8)
new_value = int(t_back_value * 1)
new_twos = convert_to_twos(new_value, out_params[1]*8)
to_write = new_twos.to_bytes((new_twos.bit_length() + 7) // 8, 'big')
output_file.writeframes(to_write)
#closing files
input_file.close()
output_file.close()
问题是当我运行上面的程序并播放输出文件时,我只能听到噪音而没有其他声音! (虽然我希望同一个文件只在一个 channel 模式下!)
更新:
我发现了一些奇怪的东西。根据文档,函数 readframes(n)
读取并返回至多 n 帧音频,作为字节串。所以我希望这个函数只返回十六进制值。但实际上我可以看到一些奇怪的非十六进制值:
read_frame = input_file.readframes(1)
print (read_frame)
print (codecs.getencoder('hex')(read_frame)[0])
print ("")
以上代码,在 for 循环中返回:
b'\xe3\x00\xc7\xf5'
b'e300c7f5'
b'D\xe8\xa1\xfd'
b'44e8a1fd'
b'\xde\x08\xb2\x1c'
b'de08b21c'
b'\x17\xea\x10\xe9'
b'17ea10e9'
b'{\xf7\xbc\xf5'
b'7bf7bcf5'
b'*\xf6K\x08'
b'2af64b08'
如您所见,read_frame
中有一些非十六进制值! (例如,*、}、D、...)。这些是什么?
最佳答案
您看到的值是每个帧的四个字节,即第一个 channel 两个字节和第二个 channel 两个字节。对于单声道 WAV,您只会看到两个字节。
以下方法应该能让您走上正确的道路。你需要使用 Python 的 struct
将二进制帧值转换为有符号整数的库。然后您可以根据需要操作它们。对于我的示例,我简单地乘以 2/3:
import wave
import codecs
import struct
#opening files
input_file = wave.open(r"sample.wav", 'rb')
output_file = wave.open(r"sample_out.wav", 'wb')
#Get input file parameters and set them to the output file after modifing the channel number.
in_params = list(input_file.getparams())
out_params = in_params[:]
out_params[0] = 1
output_file.setparams(out_params)
nchannels, sampwidth, framerate, nframes, comptype, compname = in_params
format = '<{}h'.format(nchannels)
#reading frames from first file and storing in the second file
for index in range(nframes):
frame = input_file.readframes(1)
data = struct.unpack(format, frame)
value = data[0] # first (left) channel only
value = (value * 2) // 3 # apply a simple function to each value
output_file.writeframes(struct.pack('<h', value))
#closing files
input_file.close()
output_file.close()
请注意,像这样一次处理一帧波形文件会非常慢。可以通过减少对 writeframes
的调用次数来加快速度.
format
保存解压二进制值所需的格式。对于 2 声道 WAV 文件,这将包含 4 个字节。 format
然后将配置为 <hh
这意味着使用 struct.unpack
将产生两个字段,每个字段包含每个 channel 的整数表示。所以四个字节变成了一个包含两个整数的列表,每个整数对应一个 channel 。
关于python - 使用 Python 修改 WAV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33865675/
如果已知该确切样本存在于 wav 中的某处(但可能与其他声音混合),是否可以使用 FFT 找到较长 wav 中出现的小 wav 样本? 编辑 (收到两个回复后):如果我有一个包含所有已知声音的库,这些
我对 .NET 中的音频完全陌生,所以请多多包涵。 我的目标是创建一个具有两个 channel 的 wav 文件。左声道将包含语音消息(使用 SpeechSynthesizer 生成的流),右声道需要
我的大部分信息都来自其他stackoverflow帖子,但没有一个真正有用。 import UIKit import AVFoundation class FaceButtonSc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
这可能是一个非常简单的问题;我将一个单声道 WAV 文件转换为一个 short[] 数组,并且我有一个将其写回 WAV 文件的函数。一切正常。 (writeBuffer 是 short[] 数组) b
我们的应用程序需要知道它加载的音频文件的样本数。我们使用的库可以可靠地确定采样率,但不能确定样本数。我们是否可以仅从文件大小和采样率来计算样本数? 最佳答案 马克说什么。不,通常您需要解释标题。但是,
我正在用java做一个项目,需要我加密wave文件。那么,是否有一个直接的过程可以将波形文件转换为二进制文件并返回?我将对二进制数据应用加密算法。 最佳答案 是的。 File file = new F
我想知道如何从 .wav 文件中获取样本以执行两个 .wav 文件的窗口连接。 谁能告诉我怎么做? 最佳答案 wave标准库的模块是关键:当然在代码顶部的 import wave 之后,wave.op
我有一个几分钟长的 .wav 文件,我想将其分成不同的 10 秒 .wav 文件。 到目前为止,这是我的 python 代码: import wave import math def main(fil
我在 ffmpeg 中使用以下命令合并多个 wav 文件: -f concat -safe 0 -i /storage/emulated/0/AudioClipsForSpeakerRecogniti
我正在尝试用python实现主动降噪。我的项目由两组代码组成: 录音代码 声音过滤代码 我的目标是当您运行该程序时,它将开始通过麦克风录音。录音完成后,会生成一个名为“file1.wav”的保存文件,
我正在尝试制作一个音乐识别系统。我担心我可能没有按照预期读取 wav 样本,而且我可能会应用错误的窗口大小来进行 FFT 和其他操作。 如果你能帮我的话,那就太好了。 首先,我有一些关于 Wavs 中
如何使用 java 合并两个 wav 文件? 我试过了 this但它没有正常工作,他们还有其他方法吗? 最佳答案 如果您直接处理 wav 文件的字节,您可以在任何编程语言中使用相同的策略。对于此示例,
尝试为我的 previous question 找到解决方法,我想将用 byte[](具有 wav header )编写的 16k 8 位单声道 wav 转换为 8k 8 位单声道流/字节 []。 是
目前我正在使用一个语音到文本的翻译模型,该模型采用 .wav 文件并将音频中的可听语音转换为文本转录本。该模型之前曾用于直接录制的 .wav 音频录音。但是现在我正在尝试对视频中最初出现的音频做同样的
试图在 python 中将 wav 文件转换为 wav uLaw。 使用 pydub 的 AudioSegment,我可以使用以下命令转换为 mp3: AudioSegment.from_wav(fr
我在 xcode 项目中添加了 LibFlac。然后我在我的项目中添加了来自 Libflac 的decode/main.c。我通过了 infile.flac 并运行了项目的可执行文件,但它给出了以下错
大家好,感谢您的阅读。 我想使用 Python 的 scipy.io.wavfile 对一首歌进行一些分析。由于我只有 .mp3 格式的歌曲,因此我使用 ffmpeg 将文件转换为 .wav,方法如下
我需要连接两个音频波,以便最终输出的音频波应该有一个更平滑的交汇点。我的意思是,在连接点,假设 10 秒钟,第一个音频应该开始淡出,而另一个音频开始拾取。 我已经能够连接两个音频文件并生成单个输出,但
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,它适用于 NAudio 库,但我想使用 MemoryStream 而不是临时文件。 using System.
我是一名优秀的程序员,十分优秀!