# 模拟拨号 ![](https://s2.loli.net/2025/07/10/9jUKztxwOEMVyiF.png) [http://dev.565455.xyz/tel/](http://dev.565455.xyz/tel/) 这个项目用来模拟手机拨号键盘,按键的声音也是按照电话标准制作(DTMF)。 > 电话拨号数字的频率采用双音多频(DTMF)技术,每个数字由高低频组合而成。(GB3380-1982) 具体频率如下表 | 低频\高频(Hz) | 1209 | 1336 | 1447 | 1633 | | -- | -- | -- | -- | -- | | 697 | 1 | 2 | 3 | A | | 770 | 4 | 5 | 6 | B | | 852 | 7 | 8 | 9 | C | | 941 | * | 0 | # | D | **音频模拟** 我使用Python实现这些音频,代码如下 ```{code-block} python import numpy as np import wave import struct # 参数设置 sample_rate = 44100 # 采样率 duration = 1 # 波形持续时间(秒) frequency = 1000 # 正弦波频率(Hz) phone_button = [ ["1", 1209, 697], ["2", 1336, 697], ["3", 1477, 697], ["4", 1209, 770], ["5", 1336, 770], ["6", 1477, 770], ["7", 1209, 852], ["8", 1336, 852], ["9", 1477, 852], ["*", 1209, 941], ["0", 1336, 941], ["#", 1477, 941] ] # 生成时间轴 t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) # 音频生成 for button in phone_button: # 生成两个频率的正弦波 wave_data = np.sin(2 * np.pi * button[1] * t) + np.sin(2 * np.pi * button[2] * t) # 归一化 wave_data = wave_data / np.max(np.abs(wave_data)) # 将数据转换为16位整数(int16:-32768到32767) wave_data = wave_data * 32767 wave_data = wave_data.astype(np.int16) # 创建WAV文件 with wave.open(f"./{button[0]}.mp3", 'w') as wav_file: # 设置WAV文件的参数 wav_file.setnchannels(1) # 单声道 wav_file.setsampwidth(2) # 16位 wav_file.setframerate(sample_rate) # 写入数据 for sample in wave_data: wav_file.writeframes(struct.pack('