如何用Python将winsound生成的摩尔斯电码蜂鸣声保存为WAV文件
将摩尔斯电码蜂鸣声保存为WAV文件
以下是修改后的代码,替换了winsound直接播放的逻辑,改为生成数字音频数据并保存为WAV文件,使用soundfile的sf.write完成写入:
import numpy as np import soundfile as sf # 音频参数 SAMPLE_RATE = 44100 # 标准音频采样率(Hz) FREQ = 550 # 蜂鸣频率(Hz) DOT_LENGTH = 60 # 点的时长(毫秒) DASH_LENGTH = DOT_LENGTH * 3 PAUSE_SYMBOL = DOT_LENGTH # 符号间停顿(毫秒) PAUSE_WORD = DOT_LENGTH * 7 # 单词间停顿(毫秒) alphaToMorse = {'a': ".-", 'b': "-...", 'c': "-.-.", 'd': "-..", 'e': ".", 'f': "..-.", 'g': "--.", 'h': "....", 'i': "..", 'j': ".---", 'k': "-.-", 'l': ".-..", 'm': "--", 'n': "-.", 'o': "---", 'p': ".--.", 'q': "--.-", 'r': ".-.", 's': "...", 't': "-", 'u': "..-", 'v': "...-", 'w': ".--", 'x': "-..-", 'y': "-.--", 'z': "--..", '1': ".----", '2': "..---", '3': "...--", '4': "....-", '5': ".....", '6': "-....", '7': "--...", '8': "---..", '9': "----.", '0': "-----", ' ': "/", '.': ".-.-.-", ',': "--..--", '?': "..--..", "'": ".----.", '@': ".--.-.", '-': "-....-", '"': ".-..-.", ':': "---...", ';': "---...", '=': "-...-", '!': "-.-.--", '/': "-..-.", '(': "-.--.", ')': "-.--.-", 'á': ".--.-", 'é': "..-.."} def generate_beep(dur_ms): """生成指定时长的正弦波蜂鸣数据""" dur_sec = dur_ms / 1000 t = np.linspace(0, dur_sec, int(SAMPLE_RATE * dur_sec), endpoint=False) # 生成正弦波形,归一化到[-1, 1]范围 wave = np.sin(2 * np.pi * FREQ * t) return wave def generate_silence(dur_ms): """生成指定时长的静音数据""" dur_sec = dur_ms / 1000 return np.zeros(int(SAMPLE_RATE * dur_sec)) def morse_to_audio_data(morse): """将摩尔斯电码字符串转换为完整的音频数据数组""" audio_segments = [] for idx, char in enumerate(morse): if char == ".": audio_segments.append(generate_beep(DOT_LENGTH)) elif char == "-": audio_segments.append(generate_beep(DASH_LENGTH)) elif char == "/": audio_segments.append(generate_silence(PAUSE_WORD)) else: # 符号间的停顿,最后一个符号后不需要停顿 if idx != len(morse) - 1: audio_segments.append(generate_silence(PAUSE_SYMBOL)) # 拼接所有音频片段 return np.concatenate(audio_segments) def morsecode(): while True: message = input("> ").strip() if not message: return # 转换为摩尔斯电码 unable_convert = [] morse = [] for char in message.lower(): if char in alphaToMorse: morse.append(alphaToMorse[char]) else: unable_convert.append(char) if unable_convert: print(f"无法转换的字符:{' '.join(unable_convert)}") morse_str = ' '.join(morse) print(f"摩尔斯电码:{morse_str}") # 生成音频数据并保存 audio_data = morse_to_audio_data(morse_str) sf.write("morse_code.wav", audio_data, SAMPLE_RATE) print("已保存为 morse_code.wav") if __name__ == "__main__": morsecode()
关键修改说明:
- 替换播放逻辑为数据生成:用
numpy生成正弦波表示蜂鸣,静音则生成全0数组,替代原来的winsound.Beep和time.sleep。 - 统一音频参数:设定标准采样率44100Hz,确保生成的WAV文件兼容性。
- 音频拼接与保存:将摩尔斯电码的每个元素转换为对应的音频片段,拼接后用
sf.write写入WAV文件。 - 修复原代码问题:移除了重复的
input调用,优化了摩尔斯电码的拼接逻辑。
内容的提问来源于stack exchange,提问作者Naman Kumar
相关产品推荐
相关产品推荐

