Qt 国产嵌入式操作系统实现文字转语音功能(TTS)

1.简介

本示例使用的CPU:rk3588。

操作系统:kylin V10

架构:aarch64

在Windows端,我们很容易想到使用Qt自带的类QTextToSpeech来实现文字转语音功能,Qt版本得在5.11.0以上才支持。但是在嵌入式平台,尤其是在国产的操作系统中,我们需要编译Qt源码,使得Qt能够支持文字转语音功能,我使用的Qt版本5.12.8,我的想法是在编译配置中将文字转语音功能编译进去,但是我并没有找到相关的配置选项,如果有知道的大佬,请指教。

Qt 文字转语音_qt 文本转语音-CSDN博客

查看系统的版本:

lsb_release -a

查看系统架构:

uname -m

查看Qt的编译选项,生成makefile。

./configure -help

后来我采用了另外的三方库eSpeak,来实现了文字转语音。

2.QTextToSpeech使用方法

  • setRate(double):可以设置 速率 高低音 音量,此属性保存当前语音速率,范围从-1.0到1.0。默认值0.0是正常的语音流。
  • setPitch(double):此属性保存语音音高,范围从-1.0到1.0。默认的0.0是正常的语音音高。
  • setVolume(double):此属性保存当前音量,范围从0.0到1.0。默认值是平台的默认音量
  • setVoice(const QVoice &voice):设置声音使用。注意:在某些平台上,设置语音会更改其他语音属性,如地区、音高等。这些变化触发了信号的发射。
  • void setLocale(const QLocale &locale);设置语言的语种 有中文 英文啥的
  • void say(const QString &text);播放语音 传入 字符串比如 say(“hello world”) 语音里就说 hello world

3.eSpeak编译

这里我并不是使用的交叉编译,我直接放到将源码放到平台上编译。

eSpeak依赖PortAudio进行播放音频,所以在编译eSpeak前需要准备好PortAudio的库。

PortAudio是一个免费、跨平台、开源的音频I/O库。它能够简化C/C++的音频程序的设计实现,能够运行在Windows、Macintosh OS X和UNIX之上(Linux的各种版本也不在话下)。

PortAudio下载:我下载的如下图所示的包。

PortAudio - an Open-Source Cross-Platform Audio API

PortAudio编译:

解压完后在portaudio目录下创建build目录用于安装。生成makefile。

./configure --prefix=/home/kylin/wzz/build

编译:make -j8 && make install

在build目录下就有了安装好的头文件和库。

eSpeak下载地址:

espeak: Downloads

解压完成后,进入到src中。

cd src && cp portaudio19.h portaudio.h 

修改Makefile内容:

vi Makefile

修改3-7行,根据自己的路径来修改。

注释掉30行:AUDIO = portaudio

打开31行:AUDIO = portaudio0

注释掉53行:LIB_AUDIO=/usr/lib/libportaudio.so.0

添加LIB_AUDIO=$(PREFIX)/lib/libportaudio.so (刚刚编译生成的portaudio库)

 

保存后执行:

make -j8 && make install

生成的库在/home/kylin/wzz/build下。

4.eSpeak使用

在bin目录下生成espeak可执行程序。

执行命令:

./espeak "你好" -v zh

嵌入到Qt代码中:源码示例。

espeak_Initialize:初始化。

espeak_SetVoiceByName:设置声音。

espeak_SetSynthCallback:设置回调。

espeak_Synth:语音合成。

espeak_Cancel:停止合成。

espeak_Terminate:终止。

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QList>
#include <QMutex>class MyThread : public QThread
{
public:MyThread(QObject *parent = nullptr);public:void stop();void add(QString text);void cancel();
protected:void run();private:QString m_text;bool m_isStart = false;QMutex m_mutex;bool m_isNewText;
};#endif // MYTHREAD_H#include "mythread.h"
#include <QDebug>#ifdef __LINUX__
extern "C"
{
#include "espeak/speak_lib.h"
}int speakCallback(short *wav, int numsamples, espeak_EVENT *events)
{fwrite(wav, sizeof(short), numsamples, stdout);
}
#endif // __LINUX__MyThread::MyThread(QObject *parent): QThread(parent)
{
#ifdef __LINUX__if(espeak_Initialize(AUDIO_OUTPUT_PLAYBACK,0,NULL,0) != EE_OK){qDebug()<<"espeak_Initialize error";}espeak_SetVoiceByName("zh+f2");
#endif // __LINUX__//espeak_SetSynthCallback(speakCallback);}void MyThread::stop()
{m_isStart = false;
}void MyThread::add(QString text)
{
#ifdef __LINUX__m_mutex.lock();if(espeak_IsPlaying())espeak_Cancel();m_text = text;m_isNewText = true;m_mutex.unlock();
#endif // __LINUX__
}void MyThread::cancel()
{
#ifdef __LINUX__espeak_Cancel();
#endif // __LINUX__
}void MyThread::run()
{
#ifdef __LINUX__m_isStart = true;while(m_isStart){if(m_isNewText){QString text = m_text;QByteArray byte = text.toUtf8();if(espeak_Synth(byte.data(),byte.length(),0,POS_CHARACTER,0,espeakCHARS_UTF8,NULL,NULL) != EE_OK){qDebug()<<"espeak_Synth error";}m_isNewText = false;}else{msleep(50);}}espeak_Terminate();#endif // __LINUX__
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表的增删改查CURD(一)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 新增&#xff08;Create&#xff09; 全列插入 指定列…

【数据结构】二叉树-堆(函数实现)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 头文件 函数实现 初始化 销毁 …

牛客周赛 Round 5 解题报告 | 珂学家 | 思维场

前言 剑&#xff0c;和茶一样&#xff0c;只有细细品味&#xff0c;才能理解它的风雅。 整体评价 挺难的一场比赛&#xff0c;C题差点点错科技树(想着用Dsu On Tree), D题开始上难度&#xff0c;但是只是分析其实就是一个区间求交集的脑筋急转弯&#xff0c;E题盲猜是菊花图。…

中仕公考:2024年度国考笔试分数公布,进面名单已出

2024年度考试录用公务员笔试成绩和合格分数线已经公布&#xff0c;考生们可以自行登录公务员专题网站查询成绩。 进面人员名单根据规定的面试比例&#xff0c;按照笔试成绩从高至低的顺序&#xff0c;1月14日已经公布进面名单。 没有进入面试人员名单的考生可以关注调剂&…

ZooKeeper 实战(三) SpringBoot整合Curator-开发使用篇

文章目录 ZooKeeper 实战(三) SpringBoot整合Curator-开发使用篇0. ZooKeeper客户端 1. Curator1.1. 简介1.2. 应用场景1.3. 优势1.4. 依赖说明 2. 依赖导入3. 配置类3.1. 重试策略3.2. 实现代码3.3. 总结 4. Curator中的基本API4.1. 创建节点CreateMode中的节点类型4.2. 查询节…

基于MATLAB计算无线通信覆盖(一)环境准备

一、环境 MATLAB 2022b 注&#xff1a;开始仿真前需部署地理坐标区和地理图&#xff0c;最好采用第三种&#xff0c;直接把底图数据下载到本地&#xff0c;防止连接不上网络时只能显示darkwater的底图。 可用于地理坐标区和地理图的底图如下表所示 二、下载底图并安装 工具&…

【数据结构和算法】奇偶链表

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;分离节点后合并 三、代码 3.1 方法一&#xff1a;分离节点后合并 四、复杂度分…

java版微信小程序商城 免 费 搭 建 java版直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

经典网络 循环神经网络(一) | RNN结构解析,代码实现

文章目录 1 提出背景2 RNN2.1 RNN结构2.2 RNN代码实现2.3 代码简洁实现 1 提出背景 为什么要引入RNN呢&#xff1f; 非常简单&#xff0c;之前我们的卷积神经网络CNN&#xff0c;全连接神经网络等都是单个神经元计算 但在序列模型中&#xff0c;前一个神经元往往对后面一个神…

为什么使用 atan2(sin(z), cos(z)) 进行角度归一化?

文章目录 为什么使用 atan2(sin(z), cos(z)) 进行归一化&#xff1f;为什么归一化后的角度等于原始角度&#xff1f; atan2 方法返回 -π 到 π 之间的值&#xff0c;代表点 (x, y) 相对于正X轴的偏移角度。这个角度是逆时针测量的&#xff0c;以弧度为单位。关于 atan2 函数为…

YOLOv5姿态估计:HRnet实时检测人体关键点

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下利用YOLOv5进行姿态估计&#xff0c;HRnet与SimDR检测图片、视频以及摄像头中的人体关键点&#xff0c;欢迎大家一起前来探讨学习~ 本文目录&#xff1a; 一、项目准备1Pycharm中克隆github上的项目2.具体步…

【Linux实用篇】Linux软件安装 JDK Tomcat MySQL lrzsz

1. 软件安装 1.1 软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照red…

微信好友批量自动添加:快捷方式解密

对于一些希望扩大社交圈子或者推广业务的人来说&#xff0c;手动添加好友可能是一个耗时且繁琐的任务。 不过&#xff0c;别担心&#xff0c;今天给大家种草一个能够批量自动添加好友的微信管理工具&#xff0c;让你轻松地扩展好友列表。 首先&#xff0c;当微信在个微管理系…

Python数据分析案例31——中国A股的月份效应研究(方差分析,虚拟变量回归)

案例背景 本次案例是博主本科在行为金融学课程上做的一个小项目&#xff0c;最近看很多经管类的学生作业都很需要&#xff0c;我就用python来重新做了一遍。不弄那些复杂的机器学习模型了&#xff0c;经管类同学就用简单的统计学方法来做模型就好。 研究目的 有效市场假说是现…

VUE项目快速打包发布

VUE项目快速打包发布 首先在你的VS Code中新建一个终端 输入 npm run build 回车等运行结束之后会在你的项目中生成一个dist目录 此时再iis部署的时候把你添加的网站指定的目录指向dist即可

STM32CubeMX配置STM32G071UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M 配置好串口&#xff0c;选择异步模式 配置DMA TX,RX,选择循环模式。 NVIC中勾选使能中断 勾选生成独立的.c和h文件 配置好需要的开发环境并获取代码 串口重定向勾选Use Micro LIB main.c文件修改 增加头文件和串口重定向 #include <string.h&g…

spring常见漏洞(3)

CVE-2017-8046 Spring-Data-REST-RCE(CVE-2017-8046)&#xff0c;Spring Data REST对PATCH方法处理不当&#xff0c;导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE 影响版本 Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 Spring Bo…

光学雨量监测站比传统雨量站有哪些优势

光学雨量监测站相比传统雨量站具有许多优势。首先&#xff0c;光学雨量监测站采用光学原理进行雨量监测&#xff0c;而传统雨量站则依靠传感器和机械部件进行测量。光学雨量监测站的结构相对简单&#xff0c;不需要频繁维护和校准&#xff0c;减少了运维成本和工作量。 其次&am…

【Emgu CV教程】5.1、几何变换之平移

图像的几何变换对于图像处理来说&#xff0c;也是最基础的那一档次&#xff0c;包括平移、旋转、缩放、透视变换等等&#xff0c;也就是对图像整理形状的改变&#xff0c;用到的函数都比较简单&#xff0c;理解起来也很容易。但是为了凑字数&#xff0c;还是一个函数一个函数的…

如何通过企业司法协助信息API识别潜在的不良合作伙伴

引言 在商业合作中&#xff0c;合作伙伴的信誉和合规性是至关重要的。然而&#xff0c;在选择合作伙伴时&#xff0c;我们往往面临信息不对称的问题。如何有效地识别潜在的不良合作伙伴&#xff0c;避免潜在的风险呢&#xff1f;通过企业司法协助信息API&#xff0c;我们可以快…