如何用Python的wave模块编写音频文件?求修复文本转音频代码
文本转音频文件转换器修复方案
原代码核心问题
- 二进制字符串混入空格,循环时会无效遍历空格字符
- 写入WAV文件仅写入单个数值,未生成对应频率的完整正弦波形
winsound.Beep与文件写入重复操作,时长逻辑不统一- 未按采样率和时长计算每个比特对应的音频采样点数
修复后的完整代码
import wave import struct import math # 配置参数 SAMPLE_RATE = 44100 # 采样率(每秒采样点数) BIT_DURATION = 0.5 # 每个二进制位对应的音频时长(秒) HIGH_FREQ = 440.0 # 对应二进制1的高音频率 LOW_FREQ = 330.0 # 对应二进制0的低音频率 def generate_tone(frequency, duration): """生成指定频率和时长的正弦波音频数据""" num_samples = int(SAMPLE_RATE * duration) amplitude = 32767 # 16位音频最大振幅(避免失真) tone_data = [] for i in range(num_samples): # 计算正弦波采样值 sample = amplitude * math.sin(2 * math.pi * frequency * i / SAMPLE_RATE) # 打包为16位小端格式二进制数据 tone_data.append(struct.pack('<h', int(sample))) return b''.join(tone_data) # 获取输入文本 input_text = input("请输入要转换为音频的文本:") # 转换为无空格的二进制字符串 binary_str = ''.join(format(ord(char), 'b') for char in input_text) print(f"转换后的二进制字符串:{binary_str}") # 创建并写入WAV文件 with wave.open('sound.wav', 'w') as wav_obj: wav_obj.setnchannels(1) # 单声道 wav_obj.setsampwidth(2) # 16位采样宽度 wav_obj.setframerate(SAMPLE_RATE) # 遍历每个二进制位,生成对应音频并写入 for bit in binary_str: if bit == '1': wav_obj.writeframesraw(generate_tone(HIGH_FREQ, BIT_DURATION)) elif bit == '0': wav_obj.writeframesraw(generate_tone(LOW_FREQ, BIT_DURATION)) print("音频文件已生成:sound.wav")
关键修复说明
- 移除二进制字符串中的空格,确保仅处理0和1字符
- 新增
generate_tone函数,生成对应频率的完整正弦波形,解决原代码仅写入单个采样点的问题 - 去掉冗余的
winsound.Beep调用,专注生成标准WAV文件 - 用
with语句管理WAV文件,自动处理关闭操作,避免资源泄漏 - 统一配置参数,方便后续调整频率、时长等设置
内容的提问来源于stack exchange,提问作者HSRM15
相关产品推荐
相关产品推荐

