实时语音识别库 Wrp 的使用方法
Wrp库可以使用与 AmiVoice SDK 相似的接口,通过 AmiVoice API 的 WebSocket 接口开发实时应用程序。可以发送流式音频并逐步接收结果。该库可用于 Java、C#、C++、Python、PHP 等语言。
客户端程序概述
使用Wrp的程序流程如下:
方法
客户端程序按顺序执行以下处理。()中列出了对应的Wrp方法。
- 连接 (
connect) - 发送语音识别请求 (
feedDataResume) - 发送音频数据 (
feedData) - 结束音频数据发送 (
feedDataPause) - 断开连接 (
disconnect)
事件
来自服务器的语音检测和语音识别通知事件都通过监听器类的方法获得。有以下5种事件。()中列出了Wrp需要实现的方法名称。
- 检测到语音开始时通知的事件
utteranceStarted(startTime) - 检测到语音结束时通知的事件
utteranceEnded(endTime) - 语音识别处理开始时通知的事件
resultCreated() - 识别中间结果的通知事件
resultUpdated(result) - 识别结果的通知事件
resultFinalized(result)
必须实现识别结果通知事件 resultFinalized(result)。根据需要实现其他处理服务器通知的方法。
实现指南
我们将逐步说明如何使用Wrp,并给出每种语言的示例。
以下代码示例均摘自 GitHub 存储库 advanced-media-inc/amivoice-api-client-library 中公开的 WrpSimpleTester。完整代码请参考以下源文件:
有关执行方法和文件结构等说明,请参阅客户端库的示例程序WrpSimpleTester。
1. 初始化
创建Wrp类的实例。
- Java
- C#
- C++
- PHP
- Python
// 初始化 WebSocket 语音识别服务器
com.amivoice.wrp.Wrp wrp = com.amivoice.wrp.Wrp.construct();
// 初始化 WebSocket 语音识别服务器
com.amivoice.wrp.Wrp wrp = com.amivoice.wrp.Wrp.construct();
// 初始化 WebSocket 语音识别服务器
Pointer<com::amivoice::wrp::Wrp> wrp = com::amivoice::wrp::Wrp::construct();
// 初始化 WebSocket 语音识别服务器
$wrp = com\amivoice\wrp\Wrp::construct();
# 初始化 WebSocket 语音识别服务器
wrp = com.amivoice.wrp.Wrp.construct()
2. 实现监听器类
继承com.amivoice.wrp.WrpListener类并实现事件处理程序。
语音识别结果通过resultFinalized的参数result获得。详细信息请参阅语音识别结果格式的WebSocket 接口。另外,识别结果文本使用 UTF-8 编码并进行 Unicode 转义。另请参阅关于结果文本。
以下代码在utteranceStarted、utteranceEnded、resultCreated、resultUpdated、resultFinalized各方法中实现了将日志输出到标准输出。通过wrp.setListener(listener)将实现了这些方法的监听器实例设置到wrp实例。使用text_方法解码结果文本的 Unicode 转义。text_方法的完整代码在 GitHub 上公开。
- Java
- C#
- C++
- PHP
- Python
public class WrpTester implements com.amivoice.wrp.WrpListener {
public static void main(String[] args) {
// 创建 WebSocket 语音识别服务器事件监听器
com.amivoice.wrp.WrpListener listener = new WrpTester(verbose);
wrp.setListener(listener);
}
@Override
public void utteranceStarted(int startTime) {
System.out.println("S " + startTime);
}
@Override
public void utteranceEnded(int endTime) {
System.out.println("E " + endTime);
}
@Override
public void resultCreated() {
System.out.println("C");
}
@Override
public void resultUpdated(String result) {
System.out.println("U " + result);
String text = text_(result);
if (text != null) {
System.out.println(" -> " + text);
}
}
@Override
public void resultFinalized(String result) {
System.out.println("F " + result);
String text = text_(result);
if (text != null) {
System.out.println(" -> " + text);
}
}
public class WrpTester : com.amivoice.wrp.WrpListener {
public static void Main(string[] args) {
// 创建 WebSocket 语音识别服务器事件监听器
com.amivoice.wrp.WrpListener listener = new WrpTester(verbose);
wrp.setListener(listener);
}
public void utteranceStarted(int startTime) {
Console.WriteLine("S " + startTime);
}
public void utteranceEnded(int endTime) {
Console.WriteLine("E " + endTime);
}
public void resultCreated() {
Console.WriteLine("C");
}
public void resultUpdated(string result) {
Console.WriteLine("U " + result);
string text = text_(result);
if (text != null) {
Console.WriteLine(" -> " + text);
}
}
public void resultFinalized(string result) {
Console.WriteLine("F " + result);
string text = text_(result);
if (text != null) {
Console.WriteLine(" -> " + text);
}
}
}
class WrpTester : private com::amivoice::wrp::WrpListener {
public: static void main(const StringList& args) {
// 创建 WebSocket 语音识别服务器事件监听器
Pointer<com::amivoice::wrp::WrpListener> listener = new WrpTester(verbose);
wrp->setListener(listener);
}
public: void utteranceStarted(int startTime) override {
print("S %d", startTime);
}
public: void utteranceEnded(int endTime) override {
print("E %d", endTime);
}
public: void resultCreated() override {
print("C");
}
public: void resultUpdated(const char* result) override {
print("U %s", String().fromUTF8(result).to());
unsigned short* text = text_(result);
if (text != NULL) {
print(" -> %s", String().fromUTF16(text).to());
delete[] text;
}
}
public: void resultFinalized(const char* result) override {
print("F %s", String().fromUTF8(result).to());
unsigned short* text = text_(result);
if (text != NULL) {
print(" -> %s", String().fromUTF16(text).to());
delete[] text;
}
}
}
String().fromUTF8(result).to()的实现请参考 GitHub。
class WrpTester implements com\amivoice\wrp\WrpListener {
public static function main($args) {
// 创建 WebSocket 语音识别服务器事件监听器
$listener = new WrpTester($verbose);
$wrp->setListener($listener);
}
public function utteranceStarted($startTime) {
p("S " . $startTime);
}
public function utteranceEnded($endTime) {
p("E " . $endTime);
}
public function resultCreated() {
p("C");
}
public function resultUpdated($result) {
p("U " . $result);
$text = $this->text_($result);
if ($text !== null) {
p(" -> " . $text);
}
}
public function resultFinalized($result) {
p("F " . $result);
$text = $this->text_($result);
if ($text !== null) {
p(" -> " . $text);
}
}
}
'p'的实现如下:
function p($s = "") {
print s($s) . "\n";
}
class WrpTester(com.amivoice.wrp.WrpListener):
@staticmethod
def main(args):
# 创建 WebSocket 语音识别服务器事件监听器
listener = WrpTester(verbose)
# 设置 wrp 对象的监听器
wrp.setListener(listener)
def utteranceStarted(self, startTime):
print("S %d" % startTime)
def utteranceEnded(self, endTime):
print("E %d" % endTime)
def resultCreated(self):
print("C")
def resultUpdated(self, result):
print("U %s" % result)
text = self.text_(result)
if text != None:
print(" -> %s" % text)
def resultFinalized(self, result):
print("F %s" % result)
text = self.text_(result)
if text != None:
print(" -> %s" % text)