65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Plantronics 和 Twilio 口述短信

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2013 年 9 月 17 日

CPOL

7分钟阅读

viewsIcon

20978

downloadIcon

144

为什么您不需要手机即可发送短信

我是一个彻头彻尾的短信上瘾者。我承认……我喜欢给家人和朋友发短信,内容都是一些不需要完整电话交谈的事情。然而,我讨厌在手机的小键盘上打字,如果我能直接听写信息,那会快得多。

幸运的是,在 Twilio 的帮助下,以及我可靠的缤特力耳机的一些酷炫 API 使用,我编写了一个小程序来连接这些服务,并允许我通过桌面发送具有听写功能的短信。在本文中,我将向您展示我是如何连接蓝牙耳机、Microsoft 语音识别和 Twilio,以便我能够向我的朋友和家人发送短信。

配置和账户激活

在开始编写任何代码之前,我需要从 缤特力开发者连接 网站安装缤特力 SDK。在我注册并为耳机安装了 SDK 后,我去了 Twilio 并注册了一个账户。如果您想跟随本演示,您可以注册并停留在他们的试用期内,以了解它是如何工作的。唯一的缺点是您会在短信中收到一些额外的信息,表明您正在使用试用账户。

选择电话号码并完成 Twilio 注册过程后,我看到了 Twilio 上的用户仪表板,其中包含了我将应用程序连接到 Twilio 服务所需的信息。

图 1 - Twilio 仪表板,包含集成所需的凭据

我们将需要此屏幕上的“账户 SID”和“身份验证令牌”值。单击“身份验证令牌”旁边的锁定图标以查看令牌的值,以便您可以复制它以供以后在我们的应用程序中使用。

一个新的 Windows Forms 项目

从一个新的 Windows Forms 项目开始,我可以开始添加引用并构建我的实用程序应用程序。我选择 Windows Forms 是因为我喜欢图形界面的简洁性,并且需要访问语音识别库。我为项目中 Program Files/Plantronics/SDK 文件夹中的 Interop.Plantronics.dll 文件添加了一个引用。如果安装了 Spokes 2.8 SDK,您需要右键单击解决方案资源管理器中的引用并将其设置为“嵌入互操作类型 = false”。在 SDK 的未来版本中,您将不必设置此选项。

现在来了一个秘密的辅助库,它非常酷,您只需使用它就可以让您下次使用缤特力耳机编程时生活更轻松。缤特力的一位开发人员 Lewis Collins 为他们的 Spokes API 编写了一个 C# 包装类,使与耳机的交互变得异常简单。从 GitHub 下载 SpokesWrapper 文件 并将其添加到项目中。您不会后悔的。

接下来,我可以通过使用 NuGet 添加 Twilio 包来添加对 Twilio 客户端的引用

图 2 - 我应用程序已安装的 NuGet 包

最后,我在 .Net 4.5 框架中添加了对 System.Speech 库的引用。这个库包含了在这个项目中启用语音识别所需的所有功能。我以前没有使用过这个,我认为这是一个很好的机会来在我的一个项目中启用语音功能。

启用缤特力耳机

在项目的初始窗体中,我添加了一个名为 txtLog 的文本框并将其停靠在屏幕底部。我将把与耳机的交互日志信息写入此框。这样我就可以解决任何意想不到的异常交互。我通过使用 Plantronics.UC.SpokerWrapper.DebugLogger 接口扩展窗体类来启用此日志交互。此接口添加了一个 DebugPrint 方法,该方法将在耳机设备上发生事件时触发。

Form1_Load 事件处理程序中,我添加了一些代码来获取对耳机的引用并在应用程序持续时间内连接到它

public partial class Form1 : Form, DebugLogger
 {
  private Spokes _Spokes;
  private int _CallId = 1;

  private const string APP_NAME = "DesktopSms";

  public Form1()
  {
      InitializeComponent();

  }

  public void DebugPrint(string methodname, string str)
  {
      if (txtLog.InvokeRequired)
      {
        txtLog.Invoke(new Action<string,string>(DebugPrint), methodname, str);
        return;
      }
      txtLog.Text += string.Format("{2} {0}:\t{1}\r\n", methodname, str, DateTime.Now);
  }

  private void Form1_Load(object sender, EventArgs e)
  {

    this._Spokes = Spokes.Instance;
    _Spokes.SetLogger(this);

    _Spokes.Connect(APP_NAME);

  }
代码清单 1 – 窗体的开始以及与耳机的交互

随着耳机连接的建立,以及日志信息输出到日志文本框,我可以专注于实际与耳机的交互。

当我在屏幕上单击按钮或按下耳机上的按钮时,我希望开始听写。我在屏幕上添加了一个标准按钮,并巧妙地将其命名为 btnDictate。我还添加了一个名为 txtMyMessage 的文本框,用于显示转录的消息文本,也允许我在传输消息之前进行任何更改……我为此添加了一个事件处理程序,并将 Spokes.ButtonPress 事件连接到触发 DictateMessage 方法

    // in Form1_Load
    _Spokes.ButtonPress += _Spokes_ButtonPress;

  }

  void _Spokes_ButtonPress(object sender, ButtonPressArgs e)
  {
    if (e.headsetButton == Interop.Plantronics.HeadsetButton.HeadsetButton_Talk)
    {
      DictateMessage();
    }

  }

  private void btnDictate_Click(object sender, EventArgs e)
  {
    DictateMessage();
  }

  private void DictateMessage()
  {
     txtMyMessage.Invoke(new Action(() => txtMyMessage.BackColor = Color.Yellow));
     _Spokes.OutgoingCall(++_CallId, "Sms Dictation");
  }
代码清单 2:将按钮连接到执行听写的方法

我将 txtMyMessage 文本框的颜色更改为黄色,以便在耳机准备好接收听写时提供视觉提示。您还会注意到我发出了 Spokes.OutgoingCall 执行。这将“打开”耳机上的麦克风,以便我们可以开始收听消息。

您将永远需要的超简单语音识别!

语音识别是我认为很难实现的功能。当我阅读了文档和一些 CodeProject 文章后,我发现我可以在几分钟内实现它。

我在 Form 类中添加了一个 SpeechRecognitionEngine 对象,并在 Form 构造函数中对其进行初始化。这样,我就可以确保窗体始终准备好进行听写。我为 SpeechRecognized 事件和 RecognizeCompleted 事件添加了事件处理程序,以便我能够捕获转录的文本并关闭耳机麦克风。

  private SpeechRecognitionEngine _Recognizer;

  public Form1()
  {
    InitializeComponent();

    _Recognizer = new SpeechRecognitionEngine();
    _Recognizer.RequestRecognizerUpdate();
    _Recognizer.LoadGrammar(new DictationGrammar());
    _Recognizer.SpeechRecognized += _Recognizer_SpeechRecognized;
    _Recognizer.RecognizeCompleted += _Recognizer_RecognizeCompleted;

  }
代码清单 3 – 连接 SpeechRecognitionEngine

引擎需要配置的最后一部分是语法。您会看到我调用了 LoadGrammar 方法并传入了 DictationGrammar,这是 Microsoft 提供的默认听写语法。它并不完美,您可以创建自己的语法对象来满足您的需求,但对我来说已经足够了。

我的 SpeechRecognized 事件处理程序只是简单地捕获检测到的文本并将其写入 txtMyMessage 文本框以供审查

  void _Recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  {
    DebugPrint("Detected Speech", e.Result.Text);
    txtMyMessage.Text = e.Result.Text;
    txtMyMessage.Invoke(new Action(() => txtMyMessage.BackColor = Color.White));
                
  }
代码清单 4 – 收集听写文本并呈现

我将使用以下代码在 RecognizeCompleted 事件中关闭缤特力耳机

  void _Recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
  {
     _Spokes.EndCall(_CallId);
  }
代码清单 5 – 完成听写并关闭耳机麦克风

现在,让我们继续实际发送这条消息!

使用 Twilio 传输消息

最后一步,使用 Twilio 传输消息,简单得令人尴尬。我羞于写出它有多么简单,因为他们出色地提供了一个让我的编码生活变得简单的 API。

我在这个类的顶部添加了两个常量,它们将保存我之前从 Twilio 用户仪表板记录的 AccountSidAuthToken。除了一个名为 txtDestination 的新文本框来保存目标电话号码外,我还在屏幕上添加了一个名为 btnSendMessage 的按钮,它将实际传输 txtMyMessage 文本框中的文本。这简直太简单了……看看这个点击事件的事件处理程序

  private const string TwilioAccountSid = "MY ACCOUNT SID";
  private const string TwilioAuthToken = "MY AUTH TOKEN";
  private void btnSendMessage_Click(object sender, EventArgs e)
  {
    var client = new TwilioRestClient(TwilioAccountSid, TwilioAuthToken);
    var msg = client.SendSmsMessage("MY TWILIO NUMBER", txtDestination.Text, txtMyMessage.Text);
  }
代码清单 6 – 使用 Twilio 发送短信

我使用之前定义的 AccountSidAuthToken 创建了一个 TwilioRestClient。通过该客户端,我发出一个 SendSmsMessage,其中包含我的 Twilio 电话号码、要发送到的电话号码以及要发送的消息文本。我喜欢看到如此简单易用的 API!

摘要

图 3 - 最终用户界面

通过这些快速简便的方法,我能够将我的耳机连接到短信平台。这个示例项目可以使用一些消息内容和长度的验证。如果我愿意,我可能会将功能集成到一个更大的应用程序中。为了我的需要,我可以向我的妻子发送有趣的短信,而无需触摸我的手机,并使用我酷炫的缤特力耳机。我已将我的源代码附加到此项目以供您参考,如果您想亲自尝试。

本文最初发表于 缤特力开发者区。

© . All rights reserved.