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

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

关键修改说明:

  1. 替换播放逻辑为数据生成:用numpy生成正弦波表示蜂鸣,静音则生成全0数组,替代原来的winsound.Beep和time.sleep。
  2. 统一音频参数:设定标准采样率44100Hz,确保生成的WAV文件兼容性。
  3. 音频拼接与保存:将摩尔斯电码的每个元素转换为对应的音频片段,拼接后用sf.write写入WAV文件。
  4. 修复原代码问题:移除了重复的input调用,优化了摩尔斯电码的拼接逻辑。

内容的提问来源于stack exchange,提问作者Naman Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:01:09