C# WinForms实现模拟叫号系统

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


一、系统架构设计

用户界面 号码输入 开始/停止控制 语音播报 队列管理 SpeechSynthesizer 音频输出


二、核心代码实现

1. 窗体设计(Form1.Designer.cs)
csharp 复制代码
// 界面控件布局
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)
csharp 复制代码
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)
csharp 复制代码
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/contentcsj/49295.html

三、关键功能实现

1. 多线程语音播报
csharp 复制代码
// 使用异步播放避免界面卡顿
await _speechService.PlayNumber(number);
2. 线程安全队列
csharp 复制代码
lock (_lock)
{
    _numberQueue.Enqueue(number);
}
3. 语音参数配置
csharp 复制代码
// 设置语速(-10 到 10)
_speechService.Rate = 2; 

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

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

四、界面设计要点

csharp 复制代码
<!-- 叫号界面布局 -->
<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. 持久化存储
csharp 复制代码
// 保存队列到文件
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. 网络叫号扩展
csharp 复制代码
// 使用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. 异常处理
csharp 复制代码
try
{
    _speechService.PlayNumber(number);
}
catch (Exception ex)
{
    MessageBox.Show($"语音播报失败:{ex.Message}");
}

七、性能优化方案

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

八、完整项目结构

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

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

  1. 多号码队列管理
  2. 语音播报与界面显示同步
  3. 支持中英文语音切换
  4. 可扩展的网络叫号功能
  5. 历史记录查询与回放
相关推荐
helloworddm4 小时前
Orleans 流系统握手机制时序图
后端·c#
William_cl4 小时前
【C# OOP 入门到精通】从基础概念到 MVC 实战(含 SOLID 原则与完整代码)
开发语言·c#·mvc
YuanlongWang9 小时前
c# 泛型的详细介绍
c#
嵌入式学习和实践11 小时前
C# WinForms 多窗口交互通信的示例-主窗口子窗口交互通信
c#·交互·主窗口-子窗口通信
专注VB编程开发20年11 小时前
C#,VB.NET数组去重复,提取键名和重复键和非重复键
c#·.net·linq·取唯一键·去重复·重复数量
YuanlongWang12 小时前
Entity Framework Core和SqlSugar的区别,详细介绍
c#
unicrom_深圳市由你创科技14 小时前
工业上位机,用Python+Qt还是C#+WPF?
python·qt·c#
偶尔的鼠标人1 天前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#
ytttr8731 天前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#