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.hqwc.cn/news/409650.html

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

相关文章

数据仓库(2)-认识数仓

1、数据仓库是什么 数据仓库 &#xff0c;由数据仓库之父比尔恩门&#xff08;Bill Inmon&#xff09;于1990年提出&#xff0c;主要功能仍是将组织透过资讯系统之联机事务处理(OLTP)经年累月所累积的大量资料&#xff0c;透过数据仓库理论所特有的资料储存架构&#xff0c;做…

springboot第49集:【思维导图】多线程,常用类与基础API,集合框架,泛型,数据结构源码...

多线程创建方式一&#xff1a;继承Thread类多线程创建方式二&#xff1a;实现Runnable接口jdk5.0新增两种创建多线程的方式 image.png image.png image.png image.png image.png new Thread(new Runnable() {public void run() {for (int i 1; i < 100; i) {if (i % 2 0) …

Linux 入门命令大全汇总 + Linux 集锦大全 【20240115】

文章目录 Linux 入门命令大全汇总Linux 集锦大全更多信息 Linux 入门命令大全汇总 别有一番风趣的alias 刚刚好合适的 apropos 命令 迷你计算器 bc 可看黄道吉日的 cal 全文可查看&#xff1a; Linux入门命令大全全文 Linux 集锦大全 linux终端中最漂亮的几款字体介绍及…

RK3568笔记八: Display子系统

modetest 是由 libdrm 提供的测试程序&#xff0c;可以查询显示设备的特性&#xff0c;进行基本的显示测试&#xff0c;以及设置显示的模式。 我们可以借助该工具来学习 Linux DRM 应用编程&#xff0c;另外为了深入分析 Rockchip DRM driver&#xff0c;有必要先了解一下这个…

【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 1. Myb…

HCIA——11计算机网络分层结构——OSI/ISO、TCP/IP

学习目标&#xff1a; 参考模型 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本…

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法 对不起大家&#xff0c;昨天文章里的告别说早了&#xff0c;这个系列还不能就这么结束。 我们前面的文章中讲解过RabbitMQ的用法&#xff0c;所谓MQ就是一种发布订阅模式的消息模型。在Spring中其实本身也为我们提供…

【上分日记】第380场周赛(数位dp+ KMP + 位运算 + 二分 + 双指针 )

文章目录 前言正文1.3005. 最大频率元素计数2.3007.价值和小于等于 K 的最大数字3.3008. 找出数组中的美丽下标 II 总结尾序 前言 本场周赛&#xff0c;博主也只写出两道题(前两道, hhh菜鸡勿喷)&#xff0c;第三道涉及位运算 &#xff0c;数位dp&#xff0c;第四道涉及KMP。 下…

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2C(mpu6050陀螺仪和加速度计)SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR1…

[Linux 进程(四)] 再谈环境变量,程序地址空间初识

文章目录 1、前言2、环境变量2.1 main函数第三个参数 -- 环境参数表2.2 本地环境变量和env中的环境变量2.3 配置文件与环境变量的全局性2.4 内建命令与常规命令2.5 环境变量相关的命令 3、程序地址空间 1、前言 上一篇我们讲了环境变量&#xff0c;如果有不明白的先读一下上一…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…

LabVIEW编码器自动校准系统

简介 在工作中&#xff0c;精确的角度测量和校准对于保持设备精度至关重要。开发了一套自动化角度编码器校准系统&#xff0c;利用了LabVIEW的强大功能。该系统以全圆连续角度标准装置为基础&#xff0c;配合二维导轨装夹系统&#xff0c;实现了空心轴角度编码器的高效自动校…