You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:25