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.mfbz.cn/a/323214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HubSpot社交媒体整合的好处有哪些?

HubSpot的社交媒体整合提供了许多好处&#xff0c;有助于用户更好地管理和优化其社交媒体活动。以下是一些使用HubSpot社交媒体整合的好处&#xff1a; 集中管理&#xff1a; 用户可以在HubSpot平台上集中管理多个社交媒体账户&#xff0c;无需切换到不同的平台。这简化了社交媒…

同步、异步无障碍:Python异步装饰器指南

一、引言 Python异步开发已经非常流行了&#xff0c;一些主流的组件像MySQL、Redis、RabbitMQ等都提供了异步的客户端&#xff0c;再处理耗时的时候不会堵塞住主线程&#xff0c;不但可以提高并发能力&#xff0c;也能减少多线程带来的cpu上下文切换以及内存资源消耗。但在业务…

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷①

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段&#xff1a;职业素养与理论技能项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段&#xff1a;安全运营项目1. 操作系统安全配置与加固任务一Linux …

基于信号完整性的一些PCB设计建议

最小化单根信号线质量的一些PCB设计建议 1. 使用受控阻抗线&#xff1b; 2. 理想情况下&#xff0c;所有信号都应该使用完整的电源或地平面作为其返回路径&#xff0c;关键信号则使用地平面作为返回路径&#xff1b; 3. 信号的返回参考面发生变化时&#xff0c;在尽可能接近…

欧盟产品安全新规来袭,亚马逊发出紧急提醒(GPSR)要求

欧盟产品安全新规来袭&#xff0c;亚马逊发出紧急提醒&#xff08;GPSR&#xff09;要求 一、发布新规 这世界上唯一不变的事&#xff0c;或许就是变化本身。 在跨境电商领域&#xff0c;这个道理再次得到验证。近日&#xff0c;不少卖家都收到了一封来自亚马逊的通知。通知中…

springboot下载图片的简单处理方式

参考地址 springboot&#xff1a;各种下载文件的方式_springboot下载文件-CSDN博客 开箱即用实战 GetMapping("/t1")public void down1(HttpServletResponse response) throws Exception {response.reset();response.setContentType("application/octet-strea…

在服务器上使用Docker运行SRS Stack,推拉直播流、多平台转播、本地录制、虚拟直播、直播转码、AI字幕、其他

SRS Stack | SRS (ossrs.net) Docker​ 推荐使用Docker运行SRS Stack&#xff1a; docker run --restart always -d -it --name srs-stack -v $HOME/data:/data \-p 2022:2022 -p 2443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \registry.cn-hangzhou.aliyun…

Linux 多个php版本选择需要的php的版本(修改环境变量)

这两天遇到了个问题&#xff0c; 原本服务器的php版本是7.3.13&#xff0c;经过一些操作之后不知道怎么了变成了5.6 #php版本查看 php -v然后我就对 5.6版本进行了升级&#xff0c;升级到了7.3.33&#xff0c; 这个时候 php -v 是7.3.33&#xff0c; 神奇的一幕出现了&#xf…

把握现货黄金的基本操作技巧

在投资市场这个大舞台上&#xff0c;有各种各样的投资产品供投资者选择&#xff0c;其中黄金作为一种重要的投资资产&#xff0c;一直受到广大投资者的青睐。然而&#xff0c;黄金交易并非易事&#xff0c;需要掌握一定的操作技巧。那么&#xff0c;如何才能把握住现货黄金的操…

XS2180四通道,兼容 IEEE 802.3at/af以太网供电 PSE 控制器 V1.0

XS2180 是一个四通道、供电设备&#xff08; PSE &#xff09;电源控制 器&#xff0c;设计用于 IEEE 802.3at/af 兼容 PSE 。器件提供用 电设备&#xff08; PD &#xff09;检测、分级、限流以及负载断开检测。器 件支持自动工作和软件编程。器件还支持最新二事件分…

删除运行框中的文件打开历史记录

当我们使用everything、百度、迅雷等软件&#xff0c;在列表中右键选中打开文件夹时。 当使用 winR 快捷键等方式打开运行时&#xff0c;输入盘符会出现之前打开过的文件夹&#xff0c; 一方面展示的特别多会比较混乱&#xff0c;另一方面 记得在之前的window版本中&#xff08…

数据库系列:InnoDB下实现高并发控制

1 介绍 并发控制是为了防止多用户并发使用数据库时造成数据错误和程序运行错误&#xff0c;保证数据的完整性。当多个事务并发地存取数据库时&#xff0c;就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据&#xff0c;破坏数据库…

第27集《佛法修学概要》

丁二、天乘分三&#xff1a;戊一、十善业。戊二、四禅定。戊三、四空定 请大家打开讲义第七十七页&#xff0c;这是五乘里面的第二个法门&#xff0c;天乘法门。 大乘佛教把我们众生生命的现象分成了三个部分&#xff1a;第一个部分&#xff0c;叫作 本来清净&#xff1b;第…

CSS 之 跑马灯边框

一、简介 ​ 之前有做过渐变色边框的样式&#xff0c;然后某天刷抖&#x1f3b5;&#xff0c;看到某个老师在讲跑马灯的样式效果&#xff0c;于是就自己尝试实现一下跑马灯样式的边框&#xff0c;虽然这种样式并不常见&#xff08;基本没卵用&#xff09;&#xff0c;其使用场…

git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

GIT | 分支 文章目录 GIT | 分支创建分支合并分支删除分支合并冲突分支管理策略bug分支强制删除分支 创建分支 查看当前本地仓库中有哪些分支 git branchHEAD所指向的分支就是当前正在工作的分支 cat .git/HEAD创建一个分支 git branch dev创建好了&#xff0c;但是目前还是…

Redis基础系列-哨兵模式

Redis基础系列-哨兵模式 文章目录 Redis基础系列-哨兵模式1. 引言2. 什么是哨兵模式&#xff1f;3. 哨兵模式的配置4. 哨兵模式的启动和验证4.1 主master宕机&#xff0c;看会出现什么问题4.2 重启6379主机 5. 哨兵模式的工作原理和选举原理5.1. SDown主观下线&#xff08;Subj…

Vue.js轻量级框架:快速搭建可扩展的管理系统

一、前言 在项目实战开发中&#xff0c;尤其是大平台系统的搭建&#xff0c;针对不同业务场景&#xff0c;需要为用户多次编写用于录入、修改、展示操作的相应表单页面。一旦表单需求过多&#xff0c;对于开发人员来说&#xff0c;算是一种重复开发&#xff0c;甚至是繁杂的工作…

RFID技术在汽车装备中的应用:提升安全性与效率

RFID技术在汽车装备中的应用&#xff1a;提升安全性与效率 射频识别&#xff08;RFID&#xff09;技术是一种非接触式的自动识别技术&#xff0c;它利用射频信号及其空间耦合和传输特性&#xff0c;实现对目标对象的信息读写。随着汽车工业的不断发展&#xff0c;汽车装备的技…

开源28181协议视频平台搭建流程

最近项目中用到流媒体平台&#xff0c;java平台负责信令部分&#xff0c;c平台负责流媒体处理&#xff0c;找了评分比较好的开源项目 https://gitee.com/pan648540858/wvp-GB28181-pro 流媒体服务基于 c写的 https://github.com/ZLMediaKit/ZLMediaKit 说明文档&#xff1a;h…

ElasticSearch扫盲概念篇[ES系列] - 第500篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…