程序说明

该程序是继我上一次调用科大讯飞语音合成离线SDK,用Python写了一个文本转语音的程序的进一步开发,这次开发是用pyqt5模块和其自带的designer做了一个gui界面。

程序展示

该程序我分为了三大板块进行编写,第一板块是对科大讯飞语音合成离线的SDK,第二板块是对调用pyqt5对gui界面的编写,第三板块是主函数的编写。

第一板块SDK的调用

import ctypes
import wave
import time
from ctypes import cdll, c_int, byref, string_atframe_rate = 8000                 # 频率
MSP_SUCCESS = 0                   # 成功标识
MSP_TTS_FLAG_STILL_HAVE_DATA = 1
MSP_TTS_FLAG_DATA_END = 2         # 结束标识
MSP_TTS_FLAG_CMD_CANCELED = 4
"""
LoadLibrary: 将指定的模块加载到调用进程的地址空间中(C++)
MSPLogin: 初始化msc,用户登录
QTTSSessionBegin: 开始一次语音合成,分配语音合成资源
QTTSTextPut: 写入要合成的文本
QTTSAudioGet: 获取合成音频
QTTSSessionEnd: 结束本次语音合成
MSPLogout:  退出登录
"""# 登入科大讯飞离线语音合成SDK
def login(login_dll,login_params):dll=login_dllparams=login_params# ret为0时,则登入成功ret=dll.MSPLogin(None, None, params)if ret!=MSP_SUCCESS:print("登入失败")print(ret)else:print("登入成功")
# 开始一次语音合成,分配语音合成资源
def QTTS_Session_Begin(login_dll,session_begin_params):dll=login_dll# 将session_begin_params以指定的编码格式编码字符串,格式为utf-8session_begin_params_bytes = bytes(session_begin_params, 'UTF-8')# python中c语音int型error_code = c_int()# python中c语音char型dll.QTTSSessionBegin.restype = ctypes.c_char_psessionID = dll.QTTSSessionBegin(session_begin_params_bytes, byref(error_code))if error_code.value!=0 :print(f'调用失败,错误码 {error_code.value}')else:print("调用成功")return sessionID
# 写入要合成的文本
def QTTS_Text_PUT(login_dll,session_ID,text):dll = login_dll# 将text以指定的编码格式编码字符串,格式为utf-8text = text.encode('UTF-8')ret = dll.QTTSTextPut(session_ID, text, len(text), None)if ret!=MSP_SUCCESS:print("文本写入失败")else:print("文本写入成功")
# 获取合成音频
def QTTS_Audio_Get(login_dll,session_ID,wavFile):audio_len, synth_status, getret = c_int(), c_int(), c_int()dll = login_dlldll.QTTSAudioGet.restype = ctypes.c_void_ppdata = bytes()while True:pdata = dll.QTTSAudioGet(session_ID, byref(audio_len),byref(synth_status), byref(getret))# print(getret.value)# print(synth_status.value)if getret.value != MSP_SUCCESS:breakif pdata:data = string_at(pdata, audio_len.value)# 将wav_data转换为二进制数据写入文件wavFile.writeframes(data)if synth_status.value == MSP_TTS_FLAG_DATA_END:breaktime.sleep(0.1)  # 这里为官方建议,可以去除不使用,避免转换时间过长wavFile.close()
#结束本次语音合成
def QTTS_Session_End(login_dll,session_ID):dll = login_dlldll.QTTSSessionEnd(session_ID, "Normal")dll.MSPLogout()

第二板块gui界面的编写

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'xiaoyuzhuanhuan.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("小鱼语音转换")MainWindow.resize(590, 576)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)self.textBrowser.setGeometry(QtCore.QRect(0, 460, 400, 60))self.textBrowser.setObjectName("textBrowser")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(0, 440, 72, 15))self.label.setObjectName("label")self.textEdit = QtWidgets.QTextEdit(self.centralwidget)self.textEdit.setEnabled(True)self.textEdit.setGeometry(QtCore.QRect(0, 30, 400, 400))self.textEdit.setObjectName("textEdit")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(0, 10, 72, 15))self.label_2.setObjectName("label_2")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(410, 270, 171, 251))self.pushButton.setStyleSheet("font: 14pt \"仿宋\";")self.pushButton.setIconSize(QtCore.QSize(100, 40))self.pushButton.setObjectName("pushButton")self.splitter = QtWidgets.QSplitter(self.centralwidget)self.splitter.setGeometry(QtCore.QRect(410, 30, 171, 221))self.splitter.setOrientation(QtCore.Qt.Vertical)self.splitter.setObjectName("splitter")self.label_3 = QtWidgets.QLabel(self.splitter)self.label_3.setObjectName("label_3")self.checkBox = QtWidgets.QCheckBox(self.splitter)self.checkBox.setObjectName("checkBox")self.checkBox_2 = QtWidgets.QCheckBox(self.splitter)self.checkBox_2.setObjectName("checkBox_2")self.label_4 = QtWidgets.QLabel(self.splitter)self.label_4.setObjectName("label_4")self.lineEdit = QtWidgets.QLineEdit(self.splitter)self.lineEdit.setObjectName("lineEdit")self.label_5 = QtWidgets.QLabel(self.splitter)self.label_5.setObjectName("label_5")self.lineEdit_2 = QtWidgets.QLineEdit(self.splitter)self.lineEdit_2.setObjectName("lineEdit_2")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 590, 26))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "小鱼语音转换"))self.label.setText(_translate("MainWindow", "转换结果"))self.label_2.setText(_translate("MainWindow", "文本输入"))self.pushButton.setText(_translate("MainWindow", "转换"))self.label_3.setText(_translate("MainWindow", "音色"))self.checkBox.setText(_translate("MainWindow", "xiaoyan"))self.checkBox_2.setText(_translate("MainWindow", "xiaofeng"))self.label_4.setText(_translate("MainWindow", "语速"))self.label_5.setText(_translate("MainWindow", "音量"))

第三板块主函数的编写

from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
import sys
import xiaoyuzhuanhuan  # UI文件import yuyin_Yclass MainCode(QMainWindow, xiaoyuzhuanhuan.Ui_MainWindow):def __init__(self):QMainWindow.__init__(self)xiaoyuzhuanhuan.Ui_MainWindow.__init__(self)self.setupUi(self)# 给 pushButton 这个控件加上点击事件的响应函数zhuanhuandself.pushButton.clicked.connect(self.zhuanhuan)def zhuanhuan(self):self.textBrowser.clear()success_flag = "转换成功"voice_name=""yuyin_path=""zhuanhuan_text= self.textEdit.toPlainText()  # 获得textEdit输入框的内容zhuanhuan_yusu=self.lineEdit.text()zhuanhuan_yinliang=self.lineEdit_2.text()if zhuanhuan_text==None:success_flag="未输入文本"if zhuanhuan_yinliang==None:success_flag = "未输入音量大小"if zhuanhuan_yusu==None:success_flag = "未输入语速大小"if self.checkBox.isChecked():voice_name="xiaoyan"yuyin_path="fo | D:\\opencv\\test_yuyin\\Windows_aisound_exp1226_6e05e282\\bin\\msc\\res\\tts\\xiaoyan.jet;fo|D:\\opencv\\test_yuyin\\Windows_aisound_exp1226_6e05e282\\bin\\msc\\res\\tts\\common.jet"if self.checkBox_2.isChecked():voice_name="xiaofeng"yuyin_path="fo | D:\\opencv\\test_yuyin\\Windows_aisound_exp1226_6e05e282\\bin\\msc\\res\\tts\\xiaofeng.jet;fo|D:\\opencv\\test_yuyin\\Windows_aisound_exp1226_6e05e282\\bin\\msc\\res\\tts\\common.jet"# else:#     success_flag = "未选择音色"# 调用科大讯飞离线SDKlogin_dll = yuyin_Y.cdll.LoadLibrary(r"/opencv\test_yuyin\Windows_aisound_exp1226_6e05e282\bin\msc_x64.dll")# 账号登入login_params = b"appid = 6e05e282, work_dir = ."# 参数填写,实际参数去以下官网# https: // www.xfyun.cn / doc / mscapi / Windows & Linux / wlapi.html  # qtts-h-%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90session_begin_params = "engine_type=local, voice_name=%s, text_encoding=utf8, tts_res_path=%s, sample_rate=8000, speed=%s, volume=%s, pitch=50, rdn=2, effect=0, speed_increase=1, rcn=1"%(voice_name,yuyin_path,zhuanhuan_yusu,zhuanhuan_yinliang)yuyin_Y.login(login_dll, login_params)session_ID =yuyin_Y.QTTS_Session_Begin(login_dll, session_begin_params)yuyin_Y.QTTS_Text_PUT(login_dll, session_ID,zhuanhuan_text)# 1、打开WAV文档wavFile = yuyin_Y.wave.open(r"yuyin_Y.wav", "wb")# 2、配置声道数、量化位数和取样频率wavFile.setnchannels(1)wavFile.setsampwidth(2)wavFile.setframerate(yuyin_Y.frame_rate)yuyin_Y.QTTS_Audio_Get(login_dll, session_ID, wavFile)yuyin_Y.QTTS_Session_End(login_dll, session_ID)self.textBrowser.append(success_flag)  # 在底部文本显示框显示 须为字符串if __name__ == '__main__':app = QApplication(sys.argv)md = MainCode()md.show()sys.exit(app.exec_())

总结

该程序还存在一些问题,比如第一次语音转换之后,第二次使用时输出框依然显示转换成功,无法确定第二转换成功的确切时间。输出的文件名无法在gui进行变动和无法使文件保存在使用者想保存的文件夹。这些等等将在以后的文章里进一步完善。

如果有更好的想法的大佬,欢迎在评论区指出,或者私信我。可以进行友善的交流。

调用科大讯飞语音合成离线SDK的基础上调用pyqt5模块编写gui界面相关推荐

  1. 手把手的操作——用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(二)

    上一篇的地址手把手的操作--用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(一) 上一篇讲到了最难的地方,参数的转换,这里单独写出来 ** 三.参数的转换(难点) ** 注:本文 ...

  2. 语音合成离线sdk linux,iOS SDK

    语音合成初始化.// 一次初始化成功,可以反复调用合成和参数设置接口,不需要频繁初始化和释放,减少耗时 NSString * initParam = [self genInitParams]; [_n ...

  3. h5builder php,PHP+HBuilder基础上调用微信App支付

    HBuilder基座已实现H5 plus的支付API,现已集成支付宝快捷支付平台.使用支付功能前必须在支付宝网站开通"快捷支付"服务,并配置服务器生成订单信息. 使用微信支付功能需 ...

  4. java web调用exe文件_从网页WEB上调用本地应用程序(java)

    自己写了个java的桌面程序,想通过web页面调用直接打开登录页面,传账号和密码两个参数. 在网上看了很多资料,大多处理方法是自定义个协议然后通过协议来打开本地exe文件,但是这样传的参数怎么解析? ...

  5. android 字符串调用方法名,尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'...

    在其中一个片段中,有一个RecyclerView带有自定义适配器,并且单击其中一个项目将转到另一个页面,该页面是相同Activity的新实例.但是,某些行为会在我的应用程序中导致错误. 从我的活动中, ...

  6. C#调用科大讯飞离线语音合成TTS

    原作者勿怪,未经允许就转载了,感谢万分. http://www.cnblogs.com/xuguanghui/p/4505555.html ------------------------------ ...

  7. java64 离线_Java调用人脸识别离线sdk-windows版

    最近因工作需求在java-web服务中调用人脸识别离线sdk,主要通过JNA及JNI技术,但均未调试通过,JNA调用时出现以下异常,一直未解决,求大佬指点,导常信息如下: in BaiduFaceAp ...

  8. java人脸识别api_Java调用人脸识别离线sdk-windows版

    最近因工作需求在java-web服务中调用人脸识别离线sdk,主要通过JNA及JNI技术,但均未调试通过,JNA调用时出现以下异常,一直未解决,求大佬指点,导常信息如下: in BaiduFaceAp ...

  9. android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C

    首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解! 关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只 ...

最新文章

  1. Oracle Grid Control 10.2.0.5 for Linux 安装和配置指南
  2. 预测技术智能化,机器学习是第一功臣
  3. Shell 正则表达式总结及其含义举例
  4. [团队公告]第二次技术交流主题征集
  5. 软件测试的特殊字符包含什么,测试常见的特殊字符集及接口测试中的测试字符...
  6. bzoj 2905 背单词
  7. 蓝桥杯51单片机之利用中断同时控制流水灯、数码管、独立按键、蜂鸣器【单片机开发初学者有趣综合案例】
  8. c语言实验 正弦csdn,实验2 正弦波振荡器(LC振荡器和晶体振荡器)
  9. Hbase预分区入门
  10. win10忘记开机密码
  11. 假短信截图在线生成器_工资到账提醒短信原来可以这样玩
  12. 2017年进口食品代理加盟排行榜
  13. React 事件处理
  14. CF 1467 B. Hills And Valleys
  15. [MySQL 源码] Innodb Pessimistic Insert流程
  16. 一文解读时间序列基本概念
  17. 警惕!2007年网络***十大手段
  18. LVM如何实现逻辑卷镜像
  19. 星辰变服务器响应超时,星辰变游戏出现突然安装不了怎么办 解决方案一览
  20. 贝塞尔曲线案例——七星瓢虫的绘制

热门文章

  1. BT下载会损害硬盘吗?--硬盘的工作原理,硬盘寿命
  2. 我的世界使用mysql数据库_mysql数据库常用命令笔记
  3. 2022-2028全球与中国语音控制设备市场现状及未来发展趋势
  4. 企业如何借助百度百家号进行网络推广?
  5. 数据结构第二遍思维导图
  6. cartographer源码解析(二)node_main.cc文件详解
  7. debian重启ssh服务_Win10自带的ssh客户端key权限设置
  8. Selenium——文件另存为
  9. Photoshop 2020 更新内容
  10. burpsuite安装注册