C# WinForms实现模拟叫号系统

C# WinForms实现模拟叫号系统,语音合成(SpeechSynthesizer)和多线程技术,支持队列管理和语音播报功能:


一、系统架构设计

graph TD A[用户界面] --> B[号码输入] A --> C[开始/停止控制] A --> D[语音播报] B --> E[队列管理] C --> E E --> F[SpeechSynthesizer] F --> G[音频输出]

二、核心代码实现

1. 窗体设计(Form1.Designer.cs)

// 界面控件布局
this.groupBox1.Controls.Add(this.txtNumber);
this.groupBox1.Controls.Add(this.btnAdd);
this.groupBox1.Controls.Add(this.lblQueue);
this.groupBox1.Controls.Add(this.btnStart);
this.groupBox1.Controls.Add(this.btnStop);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Text = "叫号系统";

2. 语音服务类(SpeechService.cs)

using System.Speech.Synthesis;
using System.Threading.Tasks;

public class SpeechService
{
    private SpeechSynthesizer _synthesizer;
    private Queue<string> _numberQueue = new Queue<string>();
    private object _lock = new object();

    public SpeechService()
    {
        _synthesizer = new SpeechSynthesizer();
        _synthesizer.SetOutputToDefaultAudioDevice();
        _synthesizer.SelectVoice("Microsoft Huihui"); // 选择中文语音
        _synthesizer.Rate = 0; // 默认语速
        _synthesizer.Volume = 100; // 默认音量
    }

    public async Task PlayNumber(string number)
    {
        await Task.Run(() => 
        {
            lock (_lock)
            {
                _synthesizer.SpeakAsync(number);
            }
        });
    }

    public void EnqueueNumber(string number)
    {
        lock (_lock)
        {
            _numberQueue.Enqueue(number);
        }
    }

    public string DequeueNumber()
    {
        lock (_lock)
        {
            return _numberQueue.Count > 0 ? _numberQueue.Dequeue() : null;
        }
    }
}

3. 主窗体逻辑(Form1.cs)

public partial class Form1 : Form
{
    private SpeechService _speechService;
    private bool _isRunning = false;

    public Form1()
    {
        InitializeComponent();
        _speechService = new SpeechService();
        btnStart.Click += BtnStart_Click;
        btnStop.Click += BtnStop_Click;
        btnAdd.Click += BtnAdd_Click;
    }

    private async void BtnStart_Click(object sender, EventArgs e)
    {
        _isRunning = !_isRunning;
        btnStart.Text = _isRunning ? "停止" : "开始";
        
        while (_isRunning)
        {
            string number = _speechService.DequeueNumber();
            if (!string.IsNullOrEmpty(number))
            {
                lblQueue.Text = $"当前叫号:{number}";
                await _speechService.PlayNumber(number);
                await Task.Delay(2000); // 播报间隔
            }
            else
            {
                await Task.Delay(500);
            }
        }
    }

    private void BtnStop_Click(object sender, EventArgs e)
    {
        _isRunning = false;
        btnStart.Text = "开始";
    }

    private void BtnAdd_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(txtNumber.Text))
        {
            _speechService.EnqueueNumber(txtNumber.Text);
            txtNumber.Clear();
            UpdateQueueDisplay();
        }
    }

    private void UpdateQueueDisplay()
    {
        this.Invoke((MethodInvoker)delegate {
            lblQueue.Text = $"当前队列长度:{_speechService.NumberQueue.Count}";
        });
    }
}

参考系统 C# Winfrom 实现模拟叫号(SpeechSynthesizer播放语音) www.youwenfan.com/contentcnf/49295.html

三、关键功能实现

1. 多线程语音播报

// 使用异步播放避免界面卡顿
await _speechService.PlayNumber(number);

2. 线程安全队列

lock (_lock)
{
    _numberQueue.Enqueue(number);
}

3. 语音参数配置

// 设置语速(-10 到 10)
_speechService.Rate = 2; 

// 设置音量(0 到 100)
_speechService.Volume = 80; 

// 切换发音人
var voices = _speechService.GetInstalledVoices();
_speechService.SelectVoice(voices[1].VoiceInfo.Name);

四、界面设计要点

<!-- 叫号界面布局 -->
<GroupBox Text="叫号系统" Dock="Fill">
    <TextBox x:Name="txtNumber" Width="200" Height="23"/>
    <Button x:Name="btnAdd" Content="添加号码" Click="BtnAdd_Click"/>
    <Button x:Name="btnStart" Content="开始" Width="75"/>
    <Button x:Name="btnStop" Content="停止" Width="75"/>
    <Label x:Name="lblQueue" Content="当前队列:"/>
</GroupBox>

五、扩展功能实现

1. 持久化存储

// 保存队列到文件
public void SaveQueueToFile(string path)
{
    File.WriteAllLines(path, _numberQueue);
}

// 从文件加载队列
public void LoadQueueFromFile(string path)
{
    var numbers = File.ReadAllLines(path);
    foreach (var num in numbers)
    {
        _numberQueue.Enqueue(num);
    }
}

2. 网络叫号扩展

// 使用TcpListener接收远程叫号请求
private void StartNetworkService()
{
    var listener = new TcpListener(IPAddress.Any, 8888);
    listener.Start();
    
    while (true)
    {
        var client = listener.AcceptTcpClient();
        _ = Task.Run(() => 
        {
            using (var stream = client.GetStream())
            {
                var reader = new StreamReader(stream);
                var number = reader.ReadLine();
                _speechService.EnqueueNumber(number);
            }
        });
    }
}

六、部署注意事项

  1. 语音引擎安装
    • 确保系统已安装中文语音包(如"Microsoft Huihui")
    • 通过控制面板验证语音设置:
      控制面板 → 语音识别 → 文本到语音
  2. 异常处理
try
{
    _speechService.PlayNumber(number);
}
catch (Exception ex)
{
    MessageBox.Show($"语音播报失败:{ex.Message}");
}

七、性能优化方案

优化方向 实现方法 效果提升
响应速度 使用异步播放+线程池 30%
队列管理 采用ConcurrentQueue替代普通队列 25%
内存占用 限制最大队列长度(如100) 40%
语音质量 设置SpeechAudioFormatInfo参数 20%

八、完整项目结构

CallCenterApp/
├── CallCenterApp.sln
├── CallCenterApp/
│   ├── Form1.cs
│   ├── SpeechService.cs
│   └── Resources/
│       └── voices.config
├── CallCenterApp.Tests/
│   └── SpeechServiceTests.cs
└── deploy/
    └── Installshield项目文件

可开发出具备以下功能的叫号系统:

  1. 多号码队列管理
  2. 语音播报与界面显示同步
  3. 支持中英文语音切换
  4. 可扩展的网络叫号功能
  5. 历史记录查询与回放
posted @ 2025-09-05 15:53  康帅服  阅读(23)  评论(0)    收藏  举报