工作的程序员

与我聊天,第 3 部分:会见临床医学家

Ted Neward

 

Ted Neward
在本系列的第一部分 (msdn.microsoft.com/magazine/hh781028),我使用对流层云承载语音短信系统在电话里建造了一个简单的语音输入系统。这不是太复杂,但它显示如何使用脚本对流层的服务器上托管的 API 的对流层接听电话,提出一个菜单、 收集响应输入等等。

在第二列 (msdn.microsoft.com/magazine/hh852597)、 拍向横和谈 Feliza,"聊天-bot"原始"伊丽莎"程序,本着为了采取用户的文本输入和响应的方式类似于我们听心理学家的沙发上斜躺的同时。同样,"她"并不是所有的复杂,但 Feliza 跨,和更重要的是得到了要点,显示如何轻松地系统可以扩展到更多接近通过图灵测试。

然后,自然的似乎把这两件和他们一起焊缝:让对流层收集语音或从该用户,并将它添加到 Feliza,输入短信让她计算深、 周到的响应,将它发送回对流层与有对流层中的把饲料它返回给用户。不幸的是,一个显著的断开可以防止从正像它一样容易听。因为我们使用对流层脚本 API,它的服务器上承载我们对流层 app 和对流层不开放其主持 ASP 的服务器。净 app,更不用说我们自定义的 Feliza 二进制文件 (这最后一列,都只是一套的微软。NET 框架 Dll)。

幸运的是,对流层意识到能做语音短信本身不是会真的把它切开发人员精通业务的人群中,和它提供了相同种类的语音短信访问,但在类似的其余部分 HTTP 信道。换句话说,对流层将传入的语音或短信输入,将它传递给您的选择的 URL,然后捕获响应和 … … 无论响应说到它的好,做 (请参见图 1)。

Tropo-Hosted API Call Flow
图 1 对流层托管 API 调用流

为 true,这增加网络通信的另一的层使整个系统,所有故障切换和性能关注由此带来的另一个网络往返。但这也意味着我们可以捕获输入,并将它存储在我们的选择,很有可能是一个重要的关注事项,某些应用程序中的任何服务器上 — — 安全、 数据库访问等等。

所以让我们横着走一步,找出对流层如何这小小的 HTTP 舞蹈。

你好,对流层 … … 从我的域

开始的地方是用简单的"Hello world"-样式的访问。对流层,像许多互联网 Api,使用 HTTP 通信通道和 JSON 作为发送的数据的序列化格式。所以上最容易做的事情是生成简单的、 静态的 JSON 对象请求时调用一个电话号码,对流层说"Hello"到调用方。那样做 JSON 如下所示:

{
  "tropo": [
    {
      "say": {
        "value":"Hello, Tropo, from my host!"
      }
    }
  ]
}

表面上看,结构是相当简单的。JSON 对象是单字段对象,字段"对流层"存储的对象的数组,每个告诉对流层怎么做 ; 在此情况下,它是单个"说"命令,使用对流层文字语音引擎,说,"喂,对流层,从我的主机 !"但对流层需要知道如何找到此 JSON 对象,这意味着我们需要创建和配置新的对流层应用程序,而我们需要对流层可以找到 (它可能不能躲在防火墙后面的开发人员笔记本电脑的含义) 的服务器。第二点是通过访问您最喜爱的 ASP,轻松地固定的。净宿主提供商 (我用 WinHost — — 其基本计划是完美的为此)。第一,需要返回到对流层控制面板。

这一次时创建新的应用程序,选择"对流层 WebAPI"的而不是"对流层脚本"(请参见图 2),并为其提供的 URL,可以找到该特定的 JSON 文件 ; 在我而言,我创建了 feliza.org (在这之后的步骤预期),它放下了该站点的根目录。完全配置,它看起来像图 3

The Application Wizard
应用程序向导图 2

The Configured Application
图 3 配置的应用程序

虽然对流层是快乐挂钩 Skype 和会话初始协议 (SIP) 的数目,对我们来说,我们仍要手动挂钩标准的电话号码。我做了,虽然你不在找,和人数是 425-247-3096 要花点时间和拨号服务器的情况下。

然后就行了 !某种程度。

您构建您自己站在我旁边的对流层服务了,如果你没有得到任何一种响应从手机在拨号时。在这种情况,对流层提供了应用程序调试器能够看到你的对流层应用程序中的日志。(看起来在页的顶部蓝色栏中)。当日志来看,我们会看到类似下面:"收到非 2XX 状态代码对对流层-线程-8d60bf40bc3409843b52f30f929f641c [url=http://www.feliza.org/helloworld.json、 代码 = 405]。"

没错,对流层了 HTTP 错误。具体来说,它得到了"405"的错误,它 (对于那些还没记住 HTTP 规范) 转换为"不受支持的方法"。

若要老实说,调用其他服务的对流层是休息的有点不恰当,因为它真的没有遵循的基本规则一个:HTTP 动词描述在资源上的操作。对流层真的不关心动词 ; 它只是职位的一切。这就是为什么在主机 (正确) 响应 HTTP POST 请求,因为静态页不是 POSTable。Oy。

幸运的是,我们知道,很容易修复的技术。在这一点上,我们创建 ASP。净 app (空是细),并为其提供所需的路由"/ helloworld.json"并将其映射到简单的控制器,如下面的代码 (带有多非相关代码,省略) 中所示:

namespace TropoApp
{
  public class MvcApplication : System.Web.HttpApplication
  {
    public static void RegisterRoutes(RouteCollection routes)
    {
      routes.MapRoute("HelloWorld", "helloworld.json",
        new { controller = "HelloWorld", action = "Index" });
    }
  }
}

… …,又只是返回静态 JSON 为我们 HelloWorld,如下所示 (与省略多非相关代码):

namespace TropoApp.Controllers
  {
    public class HelloWorldController : Controller
    {
      public const string helloworldJSON =
        "{ \"tropo\":[{\"say\":{\"value\":\"Hello, Tropo," +
        " from my host!
\"}}]}";
      [AcceptVerbs("GET", "POST")]
      public string Index() {
        return helloworldJSON;
      }
    }
  }

这推送到服务器,而我们的黄金。

说,说,说 … …。

如果只是有点"说"的 JSON 拨动你的记忆,那是因为我们在对流层脚本 API 的早期探索的过程中遇到。当时,它是我们中调用的方法,通过一系列的名称/值描述如何自定义口语的输出参数 (中真正的 JavaScript 时尚) 对。在这里,因为我们没有在服务器上调用 Api 的能力 — — 请记住,我的服务器不在对流层的云上承载此 JSON 文件 — — 我们要描述它的结构形式。所以,如果我们要有不同的声音,用户交谈,我们需要指定作为"说"的对象中的字段:

{
  "tropo":[
    {
      "say":
      {
        "value":"Hello, Tropo, from my host!",
        "voice":"Grace"
      }
    }
  ]
}

现在,恩典 (谁被描述为"澳大利亚英语"),将迎接我们对流层的名称中。 全部详情"说"形容在对流层 API 文档在其网站上,都是 JSON 对象正在来回传递。

这里是凡使用 ASP。网确实非常出色:而不是尝试建立这些字符串 JSON 的代码中,我们可以在 ASP 中使用隐式对象以 JSON 绑定。为便于摔出这些 JSON 对象网 (请参见图 4)。

图 4 使用。NET Framework 以 JSON 对象绑定

public static object helloworld =
  new { tropo =
    new[] {
      new {
        say = new {
          value = "Hello, Tropo, from my host!",
          voice = "Grace"
        }
      }
    }
  };
[AcceptVerbs("POST")]
public JsonResult Index()
{
  return Json(helloworld);
}

发送的 JSON 必须有其字段和值使用双引号,相对于正常的 JavaScript,"它可以是"单引号或双引号括。 使用以 JSON 对象绑定使所有这一切完全无关,应用程序开发人员。 很高兴。 (注:对流层还提供了一个客户端库为 C# 文摘 JSON 的东西,降低了,但我正在关注休息调用"手动"因为这也有助于说明如何执行同样的 ASP 的事情。NET MVC 设计模式在一般 — — 请参见 bit.ly/bMMJDv 的详细信息。)

听听的声音 … …

Feliza 点并不是只是为了虽然喷出的心理牛肚、 随机千篇一律的位。 她需要听到用户的口语的输入,分析的然后喷出的心理肚随机千篇一律的位。 为了做到这一点,我们必须能够处理的传入的张贴 JSON 对象的对流层将发送给我们。 这样做是相对容易,考虑到它是一个 JSON 对象 (和描述在 bit.ly/yV5ect 关于"问"结构,会说一些东西,然后暂停,等待输入) 和该 ASP。NET MVC 有一些好的自动 JSON 对象绑定用于执行此操作。 所以,例如,给用户,并有发表问题它开车去 JSON 不同的结果,我们会希望"问"一样,在图 5 看到在对流层 docs)。

图 5 一"问"示例

public static object helloworld =   new { tropo =
    new[] {
      new {
        say = new {
          value = "Hello, Tropo, from my host!",
          voice = "Grace"
        }
      }
    }
};
[AcceptVerbs("POST")]
public JsonResult Index()
{
  return Json(helloworld);
}
{
  "tropo": [
    {
      "ask": {
        "say": [
          {
            "value": "Please say your account number"  
          }
        ],
        "required": true,
        "timeout": 30,
        "name": "acctNum",
        "choices": {
          "value": "[5 DIGITS]"
        } 
      } 
    },
    {
      "on":{
        "next":"/accountDescribe.json",
        "event":"continue"
      }
    },
    {
      "on":{
        "next":"/accountIncomplete.json",
        "event":"incomplete"
      }
    }
  ] 
}

参数意味着,这"问"超时时间将在 30 秒内,然后将结果 (这必须是五位数字) 绑定到名为"acctNum"参数在后续的 JSON 响应发布回来了,它将发送到"accountDescribe.json"的终结点。如果帐户号码是不完整的对流层则会发布到"accountIncomplete.json"等。

它目前写是系统只有一个问题:如果我们要改变输入的类型 (在"选项"字段中) 从"[5 位数]""[任何]"(这是什么 Feliza 希望看到的毕竟 — — 她希望用户能够说他们想要的任何东西),对流层告诉我们有关"问"试图通过语音信道捕获输入"[任何]"种所不允许的文档中。这给带来的人士使用的语音交谈 Feliza。在几乎任何其他应用程序的情况下,这不是一个问题。语音输入通常将需要向一小部分的投入,约束,否则,我们将需要大量的准确性转语音到文本中。对流层可以录制语音频道,并将其存储为 MP3 文件的脱机分析,但对流层为我们提供了另一种选择的不限成员名额的文本输入。

ASP。网谈到 F #

我们用铁丝对流层到我们的网站,但 Feliza 仍然坐在她 F # Dll,毫无关系。我们现在可以开始去安装 Feliza F # 二进制文件对传入的输入,但这将需要 ASP。网谈到 F #,是比较简单,但不是总是显而易见的运动。ASP。净网站也将要需要发出自定义 JSON 响应回来了,所以,而不是离开半完成的工作,我们就会关闭 Feliza 完成下一次 — — 看有可能扩展系统更进一步的一些方法。

编码愉快 !

Ted Neward 是 Neudesic LLC 的建筑顾问。他写了一百多篇,是 C# MVP 和 INETA 的演讲者和创作并合著十几本书,包括最近发表"专业 F # 2.0"(Wrox,2010年)。他咨询、 定期指导。他在到达 ted@tedneward.com 如果你有兴趣于将他来和你的团队工作或阅读他的博客,在 blogs.tedneward.com

多亏了以下的技术专家审查这篇文章: Adam Kalsey