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

news2025/2/25 17:42:55

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.coloradmin.cn/o/1388828.html

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

相关文章

GC9008 12V 全桥驱动芯片,可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM&#xff08;IN1/IN2&#xff09;输入接口,与行业标准器件兼容.是 SOP8封装&#xff0c;GC9008D是DIP封装 芯片特点 ● H 桥电机…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】

nxp s32k144芯片使用J-LINK程序刷写

1.nxp s32k144 (1)打开软件&#xff1a;J-Flash V6.30j (2)新建工程&#xff1a;file->new project (3)选择芯片型号和 target interface (4)可以保存芯片和接口配置 (5)打开程序&#xff1a;File->open data file &#xff08;6&#xff09;程序刷写&#xff1a;T…

hf-mirror 使用

文章目录 命令下载搜索下载gated model 根据这篇文章&#xff1a; 大模型下载使我痛苦 得知 Huggingface 镜像站 https://hf-mirror.com 命令下载 网站首页会介绍下载方法 更多用法&#xff08;多线程加速等&#xff09;详见这篇文章。简介&#xff1a; 方法一&#xff1a;…

Unity | 渡鸦避难所-7 | 攻击碰撞检测

1 前言 英雄的宝剑并非只是装饰物&#xff0c;利剑出鞘时可以对怪物造成伤害。同样&#xff0c;怪物挥出铁拳时也会对英雄造成伤害。当然&#xff0c;都有同样的前提&#xff1a;在武器碰到对方的情况下&#xff0c;才会造成伤害。利用物理引擎&#xff0c;可以轻松的实现碰撞…

网络攻击与检测防御:维护数字安全的关键挑战

随着数字化时代的深入&#xff0c;网络攻击已成为企业和个人面临的严峻挑战之一。本文将深入探讨不同类型的网络攻击&#xff0c;以及有效的检测和防御策略&#xff0c;以确保网络系统的安全性和稳定性。 1. 常见网络攻击类型&#xff1a; DDoS 攻击&#xff1a;分布式拒绝服…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…

C++多线程学习[四]:多线程的通信和同步、互斥锁、超时锁、共享锁

一、多线程的状态 初始化 &#xff08;Init&#xff09;&#xff1a;该线程正在被创建。就绪 &#xff08;Ready&#xff09;&#xff1a;该线程在就绪列表中&#xff0c;等待CPU的调度。运行 &#xff08;Running&#xff09;&#xff1a;该线程正在运行。阻塞&#xff08;Bl…

AI智能化办公:巧用ChatGPT高效搞定Excel数据分析

文章目录 1. 自动提取关键信息2. 自动生成分析报告3. 自动回答问题4. 自动生成图表《巧用ChatGPT高效搞定Excel数据分析》关键点内容简介作者简介 《AI智能化办公&#xff1a;ChatGPT使用方法与技巧从入门到精通》图书特色内容简介作者简介 随着人工智能技术的不断发展&#xf…

【服务器数据恢复】服务器迁移数据时lun数据丢失的数据恢复案例

服务器数据恢复环境&服务器故障&#xff1a; 一台安装Windows操作系统的服务器。工作人员在迁移该服务器中数据时突然无法读取数据&#xff0c;服务器管理界面出现报错。经过检查发现服务器中一个lun的数据丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘…

Java 10_000 代表什么意思? 数字里面混夹着下划线?

先放一张图 &#xff0c;这到底是sleep了多久&#xff1f; public static void main(String[] args) {int a 10_000; System.out.println(a); // 10000} java 7 的 特性 &#xff1a;https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals…

开发需求总结9-el-tree获取选中节点,节点全选时返回被全选子级的父节点,未全选则返回被选中的节点

目录 需求描述 代码实现&#xff1a; 需求描述 需要获取树组件选中的节点&#xff0c;假如父节点被选中&#xff08;该节点全选&#xff09;&#xff0c;即只返回父节点的数据&#xff0c;如父节点未被全选&#xff0c;则正常返回被选中节点的数据。 示例一&#xff1a; 如上图…

未来科技五年人工智能行业产业发展趋势最新竞争力

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是近年来快速发展的热门领域&#xff0c;被广泛应用于各个行业。随着技术的不断创新和突破&#xff0c;人工智能行业的竞争力也在不断提升。本文将分析未来科技五年人工智能行业产业发展趋势&#xff0c…

群发邮件的免费软件?做外贸用什么邮箱好?

群发邮件的免费软件有哪些&#xff1f;好用的邮件群发软件&#xff1f; 在数字时代&#xff0c;邮件已成为人们沟通的主要方式之一。有时候&#xff0c;我们需要给大量的联系人发送信息&#xff0c;这时候&#xff0c;群发邮件就显得格外重要。接下来蜂邮就来探讨一下那些值得…

基于springboot的疫情物资捐赠和分配系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 课题背景 二…

2024年-最强DXF图色纯脚本开源-by剑道书生

1.此项目截止更新2024年1月10日 项目功能 1.未央搬砖 2.未央圆桌 3.白图搬砖 4.自动登录 5.未央拍卖 6.刷畅玩每日 7.洗票 8.魔化 9.换票 10.拍卖辟邪玉和玉荣 11.自动入库 12.自动换号 13.替换玉荣 等一系列功能 代码行数约17000行左右,源码开源出来仅供大家学习研究不可用于…

群晖启动SSH功能【无法执行此操作,可能是因为网络连接不稳定或系统正忙】的解决方案

修改了SSH配置导致SSH服务无法启动或者其它操作导致的SSH服务无法启动 解决方案&#xff1a;控制面板-任务计划-新增任务 附上命令: bash sudo cp /etc.defaults/ssh/sshd_config /etc/ssh这个命令是用默认的ssh配置覆盖掉当前的ssh配置 添加任务后不要勾选前面的启动&#x…

长春数字孪生元宇宙赋能工业智能制造,助力制造业企业数字化转型

长春数字孪生元宇宙赋能工业智能制造&#xff0c;助力制造业企业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为制造业企业发展的必然趋势。长春市作为我国重要的工业基地之一&#xff0c;积极探索数字化转型的新路径&#xff0c;将数字孪生元宇宙技术应用于工…

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

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

如何在企业微信开发者中心使用内网穿透工具回调本地接口服务

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…