模拟拨号
这个项目用来模拟手机拨号键盘,按键的声音也是按照电话标准制作(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实现这些音频,代码如下
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('<h', sample))
拨号实现原理
这个“拨号”不会把号码在现实中播出,只是一个玩具。程序会请求后端,读取数据库,返回文本,然后转为tts语音播放。
扩展
我为拨号提供了一个注册号码界面,可以在此输入号码对应的音频内容,目前只支持文本,再套用tts实现。
http://dev.565455.xyz/tel/add.html
所以这个项目用来对暗号或者秘密传信最合适不过了。欢迎前来体验。