366|2

156

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【2024 DigiKey 创意大赛】- [复制链接]

 

打个草稿

最新回复

好的,等待   详情 回复 发表于 2024-11-3 08:47
点赞 关注
 
 

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

好的,等待

 
 
 

回复

156

帖子

1

TA的资源

一粒金砂(中级)

板凳
 

RE: 【2024 DigiKey 创意大赛】简单做了个语音合成小玩意

因为这段时间有别的事情要忙,没有对7月份报名的这个得捷比赛有很高的完成度,但是这段时间对语音合成感兴趣,用VITS语音合成库做了一些有意思的东西,并且由于VITS库目前只有Python代码,还顺带简单了解了下Python的一些机制以及学习如何将Python代码和C++工程相结合,也就是在C++ makefile工程里直接调用Python的工程。目前我在网上找到的容易入门且实用的VITS语音合成库是出自CjangCjengh这位B站UP主在github分享的MoeGoe应用代码库,以及,功能多样,代码使用Python搭建,可支持Windows和Linux多平台部署,所以可以部署在树莓派等ARM aarch64架构的单板计算机上面。如图所示:

 

左上角为MoeGoe源码,第二行第二列的MoeGoe_GUI是基于MoeGoe应用源码的C#上位机,可以直接在Windows上运行,这个上位机清楚演示了MoeGoe源码的基本功能,如选择VITS AI语音模型,语音配置,说话人语气配置,生成的mp3文件的存放目录等,比如我这里选择的是《碧蓝档案》手游天童爱丽丝的AI语音模型,以及(《赛马娘》手游日文名:ウマ娘)的草上飞语气: 1.wav (317.06 KB, 下载次数: 0)

 

Windows的部署和运行,UP主已经做好,要做的就是在报名参赛的物料树莓派5B单板计算机上部署,将源码拷到树莓派5B上:

 

需要留意树莓派最新版本镜像所选的Python版本,这是跟后续安装的wheel支持库紧密相关的,如图,这是3.11.2版本:

 

修改Python代码,将AI模型文件等参数以函数形参的方式传入,这样的话,给外部的C++工程调用就可以直接传参指定参数了:

 

Python是脚本语言,不需要编译,直接运行即可:

Python3 MoeGoe.py

在运行过程中需要安装非常多的支持库,Python可支持在线安装和离线安装,离线安装wheel文件的方式和在线安装是一样的,都是通过

pip3 install


指令进行:

并且由于树莓派环境的特殊性,安装的时候需要加入参数--break-system-packages来打破系统限制,不然装不了外部wheel文件:

pip3 install scipy --break-system-packages
pip3 install torch --break-system-packages

 

运行时指定输入的普通话语音(当然也支持日语),即可生成mp3文件,不过受限于树莓派5B的CPU和RAM限制,无法生成太长的语音,会中途闪退结束程序。

 

下面分享一下在C++工程中调用Python代码的方式:

void Python_Local_VITS_API(string str)
{
    str = "\"[ZH]" + str + "[ZH]\"";
    str = removeNewlines(str);
    printf("str = %s.\n" , str.c_str());
    Py_Initialize();
    if (!Py_IsInitialized()) 
    {
        printf("ERROR:C++ Python API init fail.\n");
    }
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('/home/MoeGoe-3.0.1/')");

    PyObject *pModule = PyImport_ImportModule("MoeGoe");
    if (pModule == NULL)
    {
        printf("ERROR:MoeGoe.py loaded failed!\n");
    }

    PyObject *pFunc = PyObject_GetAttrString(pModule , "moegoe_main");
    if (!PyCallable_Check(pFunc))
    {
        printf("ERROR:Python fun moegoe_main load failed.\n");
    }
    PyObject* args = PyTuple_New(4);
    PyTuple_SetItem(args , 0 , Py_BuildValue("s" , "/home/voice_model/alice.pth"));
    PyTuple_SetItem(args , 1 , Py_BuildValue("s" , str.c_str()));
    PyTuple_SetItem(args , 2 , Py_BuildValue("i" , 1));
    PyTuple_SetItem(args , 3 , Py_BuildValue("s" , "/home/1.wav"));

    if (!PyCallable_Check(pFunc))
    {
        printf("ERROR:Python fun args load failed.\n");
    }

    PyObject* ret = PyObject_CallObject(pFunc , args);
    // PyArg_Parse(ret , "i" , &result);
    // printf("result = %d.\n" , result);
    printf("After PyObject_CallObject.\n");
    Py_DECREF(pFunc);
    Py_DECREF(pModule);
    Py_Finalize();
    printf("After Py_Finalize.\n");
}

Py_Initialize()和Py_Finalize()是搭建和解散Python运行环境的操作,PyImport_ImportModule()是加载py文件,也就是可以使用py文件里面的函数进行操作, PyTuple_SetItem()用于设置参数,s代表字符串,i代表整数,PyObject_CallObject()运行函数,可带参可无参,第二个参数填NULL就是无参,将函数运行之后,生成语音文件保存在本地目录/home/1.wav:

 

使用本地语音合成功能有两个好处,第一是语音生成的时间短,第二是可以很方便的合成各种数据检测数据,比如:

 

VID_20241104_163105

 

这次比赛申请的雷达传感器物料没怎么研究,就接了个串口线跑了下:

 

非常平平无奇,但是非常好用。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表