模拟拨号

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实现这些音频,代码如下

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


所以这个项目用来对暗号或者秘密传信最合适不过了。欢迎前来体验。