科大讯飞语音合成使用小记
写在前面
最近因为特殊需求需要做一个语音合成的项目,使用的是讯飞的在线语音合成webapi,因此开篇博文记录一下自己的工作。
语音合成步骤
语音合成的webapi技术文档详情移步:讯飞语音合成(流式版)文档中心 经过仔细阅读调用文档,做了一个不完全总结流程图:
由于使用软件为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();
构建过程并没有报错,然而下面在进行authorziation的Base64编码:
//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()
这样才能够传入data的Json对象里~
一定要注意数据类型的转换,很重要!
暂时先记到这里,后续解决了再来填坑~