基于Qt平台webapi语音机器人三,添加TTS在线语音合成

10 篇文章 0 订阅

1.0版本的讯飞机器人实现了语义理解,人机交互的基本,2.0版本实现了语音合成,通过语音与机器人交互,但是返回的语义也只能通过文本的方式进行展示,而本章节加入的则是将机器人的回答通过讯飞在线语音合成技术,这样就可以实现用户语音输入,机器人语音回复的完整流程了。实现方式同样是webapi。
与之前的方式不同的是这一次我并没有认真的去读讯飞的webapi开发手册,而是选择了一种简单的方式,直接将讯飞的示例python程序下载下来,因为qt本身是可以调用python程序的,所以我打算直接通过qt调用讯飞webapi示例python程序,毕竟人生苦短,我用python。
首先下载讯飞在线运行合成webapi python示例程序
这个是开发文档,在里面查找调用示例,下载python示例,下载成功后打开tts_ws_python3_demo.py,有人说我不懂python程序,没关系,我也不是很懂,但是python程序里面已经很好的注释了你需要修改的地方:

if __name__ == "__main__":
# 测试时候在此处正确填写相关信息即可运行
wsParam = Ws_Param(APPID='XXXXXXX', APIKey='XXXXXXXXXXXXXX',
APISecret='XXXXXXXXXX',
Text="这是一个语音合成示例")
websocket.enableTrace(False)
wsUrl = wsParam.create_url()
ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
ws.on_open = on_open
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

填入APPID,APIKey,APISecret和修改Text即可,其他的不需要你去看了,APPID,APIKey之前都有介绍,这是讯飞语音交互必要的请求头,然后是APISecret,这个是在线语音合成必要的请求头,在讯飞开放平台控制台,创建应用进入语音合成(流式版)服务后即可查看。
修改好APPID,APIKey,APISecre之后打开命令行,进入tts_ws_python3_demo.py路径执行:python tts_ws_python3_demo.py,运行完成后发现同级目录下已经生成了一个demo.pcm的音频文件,那这就简单了,直接将aiui回复的文本信息替换python程序里的Text,运行python代码然后播放demo.pcm音频就实现了完整流程。
于是,我在qt中链接python的库,添加tts python程序,编译,发现qt报错了,Python Py_Initialize未定义,于是我问候了许久的度娘,问题却始终没有解决,最后发现有可能是我的qt是32位的,而我安装的python是64位的,不匹配。
既然这种方式行不通,而命令行可以用,那我就直接通过QProcess,运行命令行来实现:

void Widget::sendTtsMsg(QString tts_text)
{
QProcess *ttsMsgProcess = new QProcess(this);
QString command = "python " + QCoreApplication::applicationDirPath()+ "/Audio/tts_ws_python3_demo.py " + tts_text;
ttsMsgProcess->setReadChannelMode(QProcess::MergedChannels);
ttsMsgProcess->setWorkingDirectory(QCoreApplication::applicationDirPath()+ "/Audio");
ttsMsgProcess->start(command);
ttsMsgProcess->waitForStarted();
ttsMsgProcess->waitForFinished();
}

其中tts_text是要替换tts_ws_python3_demo.py中的Text,即回复的文本信息,我们直接调用时是没有给python传入参数的,所以tts_ws_python3_demo.py需要进行一点点的修改,注意添加的部分和修改的地方:

...
import os
import sys   #添加的部分	

STATUS_FIRST_FRAME = 0  # 第一帧的标识
STATUS_CONTINUE_FRAME = 1  # 中间帧标识
STATUS_LAST_FRAME = 2  # 最后一帧的标识
voice_text = sys.argv[1]    #添加的部分 

class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, Text):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.Text = voice_text   #修改的地方
        ...

实际上很简单,运行成功后通过之前的AudioDevice 类添加的播放函数就可以播放生成的pcm音频了

void AudioDevice::playRestultVoice()
{
    if(!resultVoiceFile->isOpen())
    {
        resultVoiceFile->open(QIODevice::ReadOnly);
    }
    // 设置音频文件格式;
    QAudioFormat format;
    // 设置采样频率;
    format.setSampleRate(16000);
    // 设置通道数;
    format.setChannelCount(1);
    // 设置每次采样得到的样本数据位值;
    format.setSampleSize(16);
    // 设置编码方法;
    format.setCodec("audio/pcm");
    // 设置采样字节存储顺序;
    format.setByteOrder(QAudioFormat::LittleEndian);
    // 设置采样类型;
    format.setSampleType(QAudioFormat::UnSignedInt);
    output = new QAudioOutput(format);
    output->start(resultVoiceFile);
}

至此完善的语音交互流程实现
源码下载链接:
源码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值