Linux下 python调用讯飞离线语音合成(tts)

article/2025/8/21 18:15:14

Linux下,使用Python调用讯飞TTS离线SDK,源代码:

  • https://github.com/cch96/iflytek_tts
  • 具体使用方法参照readme

解决过程

Windows

Windows的SDK有编译好的可以直接被python用ctypes模块调用的动态链接库。可以直接根据科大讯飞的接口文档以及错误码进行开发调试。

  • bin文件夹下的dll
    在这里插入图片描述
  • 接口文档: http://mscdoc.xfyun.cn/windows/api/iFlytekMSCReferenceManual/files.html
  • 错误码: https://www.xfyun.cn/document/error-code

Linux

Linux版的SDK没有编译好的so,但是Linux的SDK中有一些函数库的动态链接库。

  • libs文件夹下的so
    图
于是开始尝试使用这个库来调用接口,实现功能。在此期间出现了一些问题。

问题1:
在导入libmsc.so时出现异常

	OSError: libs/x64/libmsc.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE

该异常是由于讯飞的tts是由c++实现了,需要链接c++的一些基础依赖库。这里是少了lstdc++.so
解决1:
ctypes中有两种加载动态链接库的方式ctype.CDLL() 或者ctypes.cdll.load_libary(),
CDLL有一个mode的可选参数,mode=ctypes.RTLD_GLOBAL,可以全局引入动态链接,如果调用的动态库有其它依赖库时,提前加载的功能
把lstdc++.so提前导入即可ctypes.CDLL("lstdc++.so", mode=ctypes.RTLD_GLOBAL)

问题2:
解决了依赖库问题,在调用接口时出现异常

	segmentation fault

段错误,访问了不存在或者受限的内存,这个问题涉及到ctypes与c的交互的内部机制,不好解决,于是换了个思路
解决2:
放弃原来的思路,即用ctypes调用动态链接库中的接口,完成语言合成的逻辑。
改用,用c封装语音合成的逻辑,由它去调用动态链接库中的函数,而python只需要简单调用这些c封装好的接口。
其实官方的sdk中的c语言demo是可用的,把它稍加改造就可以满足我们的要求,就不用自己封装了。

最终解决

  1. 官方demo改成接口模块,并编译成so

    $gcc -c -fPIC -o mylib.o tts_offline_sample.c
    $gcc -shared -o libtts.so mylib.o

  2. 将libstdc++.so, libmsc.so, libtts.so都加载进来

    def __new__(cls, *args, **kwargs):# 加载库ctypes.CDLL("libstdc++.so.6", mode=ctypes.RTLD_GLOBAL)plat = platform.architecture()if plat[0] == '32bit':dll = CDLL(os.path.join(WORK_ROOT, 'libs/x86/libmsc.so'), mode=ctypes.RTLD_GLOBAL)else:dll = CDLL(os.path.join(WORK_ROOT, 'libs/x64/libmsc.so'), mode=ctypes.RTLD_GLOBAL)cls.dll = cdll.LoadLibrary(os.path.join(WORK_ROOT, "libtts.so"))cls.lock = threading.RLock()return super(IflytekTTS, cls).__new__(cls)
  3. python去调用libtts.so中的接口

    def text2wav(self, text, filename):"""文字合成语音"""# 底层的c是不支持多线程的,所以这里限制一下with self.lock:ret = self.dll.msp_login(None, None, self.login_params)if (self.MSP_SUCCESS != ret):# 如果登陆验证失败print("MSPLogin failed, error code: %d.\n", ret)return#  登陆成功# print("开始合成 ...\n")ret = self.dll.text_to_speech(text, filename, self.session_begin_params)# print("合成完毕\n")# 退出登录self.dll.msp_logout()
    
第一次写博客,若有哪里不对请大家斧正

参考

https://blog.csdn.net/weizehua/article/details/88305752
https://blog.csdn.net/u013783095/article/details/79639754
https://www.cnblogs.com/hello–the-world/archive/2012/05/31/2528326.html
https://www.landui.com/help/show-7989


http://chatgpt.dhexx.cn/article/DcgQ9Vws.shtml

相关文章

使用讯飞tts+ffmpeg自动生成视频

起因 某日,看到一个营销号的视频说做视频日进斗金,大意是用软件识别文章小说,搭配一些图片转换成自己的视频。看完当时脑海里冒出一个念头,我也可以,于是有了这番尝试。 方案 首先文字方面,我选择了【聚合数…

构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server

上一篇我们封装了科大讯飞接口实现了 UniMRCP ASR Plugin,这篇文章我们再简单说一下 TTS 的实现。 MRCP plugin 以下内容请参考《基于 UniMRCP 实现讯飞 ASR MRCP Server》: UniMRCP 的编译、安装运行UniMRCP plugin 的加载、调用流程UniMRCP plugin 的…

ROS语音交互系统_(2)利用讯飞TTS实现ROS下语音合成播报

前言 - Writing a Simple Publisher and Subscriber (C++) - ubuntu16.04外接音箱无声音 1、先前准备 (1)在~/catkin_ws/src目录下执行 $ catkin_create_pkg voice_system roscpp rospy std_msgs (2࿰

讯飞tts调用

目标:能在arm开发板上运行 拿到arm版本libmcs.so库后尝试集成到开发板,导入库后运行10102错误,查找官方错误码。 注意到官方给的例子有两个参数: const char* session_begin_params "engine_type local,voice_namexiaoya…

讯飞tts语音引擎_讯飞输入法A.I.语音引擎再升级 更强大更实用!

时代在进步,用手打字已OUT,眼下是语音的大时代。近日,讯飞输入法Android版和iOS版更新A.I.语音引擎,进一步优化通用语音识别效果,同时还基于说话人和使用场景,重点提升语音候选词、噪声环境、轻声说话及专有名词的识别准确率。正是科大讯飞技术创新、成果落地的真实投映。…

基于ROS2和科大讯飞的文字转语音TTS入门教程

基于ROS2和科大讯飞的语音转文字入门教程 基于ROS2和科大讯飞的文字转语音TTS入门教程1.环境搭建2.创建工程3.编译和执行 基于ROS2和科大讯飞的文字转语音TTS入门教程 本文将展示,如何利用ROS2和科大讯飞的TTS模块,实现简单的文字转语音功能。利用ROS2&…

巧用讯飞TTS进行文本合成语音(LINUX操作系统)

因为工作需要用到文本转语音文件,然后进行播放的应用场景。 我先后研究了三种开源的框架程序,festival、ekho和espeak。但实际运行后,效果很差,也没精力训练调试它们。 后来我突然想起来在科大讯飞是语音处理的老大,TT…

初探机器学习之使用讯飞TTS服务实现在线语音合成

最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍。 一、什么是语音合成(TTS) 1.1 What is 语音合…

麒麟系统虚拟机安装教程

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 1.首先得安装VM Ware软件。 2.打开VM Ware,点击“文件”->“新建虚拟机”。 3.进入新建虚拟机向导,点击下一步。如下图&…

史上最最详细的win10虚拟机安装教程,手把手从头到尾

史上最最详细的win10虚拟机安装教程 1.安装VMware 12Pro 前天我安装了VM12,并安装了win10系统的虚拟机。遇到了很多问题,我想拿出来和大家分享一下解决办法。 首先,第一步先上下载地址: VMware 12下载地址 大家下载时记得选择普…

虚拟机安装教程

虚拟机安装教程   vmware10虚拟机是个软件,安装后可用来创建虚拟机,在虚拟机上再安装系统,在这个虚拟系统上再安装应用软件,所有应用就像操作一台真正的电脑,因此,我们可以利用虚拟机学习安装操作系统、…

Fedora虚拟机安装教程

Fedora虚拟机安装教程 (作者:Baron_wu 禁止转载) 获取VMware14 链接: https://pan.baidu.com/s/1WQuajxl2KOtcn9WYendglQ 提取码:2K32获取Fedora安装镜像 64bit : https://download.fedoraproject.org/pu…

win10虚拟机安装教程

win10虚拟机安装 下载iso镜像文件win10镜像安装步骤拍摄快照 下载iso镜像文件 首先我们需要准备一个win10的iso镜像系统,下载地址:https://msdn.itellyou.cn/ 我们选择最新版本就可以了,选择consumer editions版本(其实选择两个…

VMware16虚拟机安装教程

一、VMware下载 VMware下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 我的电脑是Windows电脑,所以选择Workstation 16 Pro for Windows下载,如果你的电脑事Linux系统,选择Work…

deepin虚拟机安装教程

deepinISO镜像:链接:https://pan.baidu.com/s/1yzxtAetA9eccO6pNFO6wTg 提取码:az78 --来自百度网盘超级会员V5的分享 deepin是Linux内核的,里面附带办公软件,今天小编就在虚拟机上体验一波!开车&#x…

CentOS7虚拟机安装教程

第一步:打开虚拟机找到创建新的虚拟机 第二步:进入向导选择典型 第三步:选择稍后添加操作系统 第四步:选择linux CentOS 7的版本 第五步:自定义虚拟机名称和安装地址 第六步:指定磁盘大小,默认选…

Ubuntu 20.04 虚拟机安装教程

首先你需要下载 VMware,建议不要放于C盘,不会下载的建议看 哔哩哔哩Frank。下载 Ubuntu 20.04 镜像,也是建议不放于C盘,我放在了 E:\Ubuntu 20.04 iso 完成上诉步骤,打开VMware,点击创建新的虚拟机。选择 自…

Linux虚拟机安装教程

一、虚拟机的创建 我们在工作中会需要用到Linux环境,但Linux系统毕竟没有Windows系统用起来顺手。处于这种考虑,我们可以在电脑上安装一个Linux虚拟机,在虚拟机上虚拟出一套电脑所需要的资源。现在就开始进行VMware的安装。 我们下载完VMw…

虚拟机安装(详细教程)

我这个主要是前期的下载安装,后面的操作大家可以参考VirtualBox 安装Kali linux最新版(超详细)_Jokong的博客-CSDN博客_virtualbox安装kali 这个作者写的超级详细,小白完全跟得上 目录 官网地址: VirtualBox6.1.3…

最强卸载神器,使你的Windows绝对干净

前言 Uninstall Tool 是一款超级强大的软件卸载工具,它完全可以替代您Windows自带的”添加/删除程序”功能,超强的卸载能力可以卸载您安装的任何第三方软件应用,也可卸载注册表相关项让你的系统更清洁干净,但它有一个更加强大的功…