科大讯飞语音合成使用小记

写在前面

最近因为特殊需求需要做一个语音合成的项目,使用的是讯飞的在线语音合成webapi,因此开篇博文记录一下自己的工作

语音合成步骤

语音合成的webapi技术文档详情移步:讯飞语音合成(流式版)文档中心 经过仔细阅读调用文档,做了一个不完全总结流程图

unity 讯飞 语音合成 讯飞科大语音合成_编程语言


由于使用软件为QT creator 5.3,本人也是个QT小白,因此在实际操作中遇到很多问题。

接口鉴权

由于在做这个工作之前使用过讯飞AIUI平台,在构建项目的时候一不小心就把两者的api_key弄错了,因此构建失败。
在构建signature_origin的时候,看了参考的demo,写成了这个样子:

//对signature_origin采用sha256编码,并使用base64编码得到最终的signature
   QByteArray signature = QMessageAuthenticationCode::hash(signature_origin,XunFeivoice_Apisecret,QCryptographicHash::Sha256).toBase64();

构建过程并没有报错,然而下面在进行authorziationBase64编码:

//authorization格式:api_key="keyxxxxxx",algorithm="hmac-sha256",headers="host date request-line",signature="……"
   //对authorization进行base64编码
   QByteArray authorization;
   authorization = QString("api_key=\"%1\",algorithm=\"%2\",headers=\"%3\",signature=\"%4\"",XunFeivoice_Apikey,algorithm1,headers,signature).toUtf8().toBase64();

报错不存在这样的书写,可怜自己是个小白,不太明白QT如何在QString中添加变量表示的前提下加上英文双引号。括号里的写法是参考JAVA写的,感觉太蠢了~
个人怀疑可能是要把后面三个变量变成QString类型才能引用(原先是二进制字节数组格式),目前由于忙着别的事还没调试。马克一下

接口数据传输

由于传输的内容是之前访问AIUI平台的交互结果,已经事先通过进行解析成QString类型,保存为result_text。
由于传输要求是Websocket传输,因此需要先new一个client

//新建客户端
   client = new QWebSocket;
   client-> setParent(this);
   //连接服务器
   client -> open(QUrl(ttsurl));

然而天不遂人愿,这里提示

D:\qtproject\weather\mainwindow.cpp:64: error: 'client' was not declared in this scope
    client = new QWebSocket;
    ^

大概在头文件里还需要声明一次?
经过“实地考察”,发现同样需要在mainwindow.h中声明(记得带上QWebSocket头文件):

QWebSocket *client;

随后就能编译通过了!

数据类型问题

D:\qtproject\weather\mainwindow.cpp:340: error: no match for 'operator=' (operand types are 'QByteArray' and 'const QString')
         result_text = DataMap.value("answer");
                     ^

这里发现自己在mainwindow.h定义的result_text为二进制字节数组,然而map的键值此处理应是QString类型,因此报错。

解决方法

result_text声明类型改为QString,这一块就不会报错了!相应地在client传文本时,需要做以下操作:

//result_text为string类型,转换成QByteArray类型进行编码,然后再转成string类型进行传输
   data.insert("text",QString(result_text.toUtf8().toBase64()));
   //方法2:result_text.toLatin1().toBase64()

这样才能够传入dataJson对象里~
一定要注意数据类型的转换,很重要!
暂时先记到这里,后续解决了再来填坑~