Skip to content

Commit

Permalink
加了一些新功能
Browse files Browse the repository at this point in the history
  • Loading branch information
DSP-8192 committed Sep 20, 2022
1 parent 0a505b2 commit a33bbbc
Show file tree
Hide file tree
Showing 18 changed files with 79 additions and 55 deletions.
16 changes: 10 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,20 @@
/HZYSTempOutput

#用于测试的输入输出
*.wav
textToRead.txt
/*.wav
/textToRead.txt

#转换成可执行文件过程中生成的临时文件
/excutables

#打包好的文件
*.exe
*.bin
*.zip
/*.exe
/*.bin
/*.zip

#用于测试模块的代码
*.ipynb
/*.ipynb

#演示视频
/*.flv
/*.mp4
65 changes: 39 additions & 26 deletions HZYS_GUI.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from platform import system
from tkinter import Tk, Toplevel
from tkinter import HORIZONTAL, Tk, Toplevel
from tkinter import messagebox, filedialog
from tkinter import Checkbutton, Button, scrolledtext, OptionMenu
from tkinter import Label, font, BooleanVar, StringVar
from tkinter import Label, font, BooleanVar, DoubleVar, Scale
from huoZiYinShua import *
from multiprocessing import Process, freeze_support
from PIL import ImageTk, Image
Expand Down Expand Up @@ -36,7 +36,8 @@ def onDirectPlay():
textToRead = textArea.get(1.0, 'end')
myProcess = Process(target=HZYS.directPlay,
kwargs={"rawData": textToRead, "inYsddMode": inYsddMode.get(),
"pitchShift": optionConvertMap[pitchShiftOption.get()]})
"pitchShift": pitchShiftOption.get(), "norm": normAudio.get(),
"reverse": reverseAudio.get()})
myProcess.start()


Expand All @@ -49,7 +50,8 @@ def onExport():
if not outputFile.endswith(".wav"):
outputFile += ".wav"
HZYS.export(textToRead, filePath=outputFile, inYsddMode=inYsddMode.get(),
pitchShift=optionConvertMap[pitchShiftOption.get()])
pitchShift=pitchShiftOption.get(), norm=normAudio.get(),
reverse=reverseAudio.get())
messagebox.showinfo("疑似是成功了", "已导出到" + outputFile +"下")


Expand Down Expand Up @@ -154,13 +156,9 @@ def createConfigWindow():
#储存生成选项的变量
#-------------------------------------------
inYsddMode = BooleanVar()
pitchShiftOption = StringVar()
optionConvertMap = {
"正常": "disabled",
"说的道莉": "xingzhuan",
"说的老理": "laotou",
"谁家小孩": "xiaohai"
}
normAudio = BooleanVar()
reverseAudio = BooleanVar()
pitchShiftOption = DoubleVar()



Expand All @@ -171,12 +169,6 @@ def createConfigWindow():
font=font.Font(family="微软雅黑", size=10))


#复选框
ysddCkBt = Checkbutton(mainWindow, text="匹配到特定文字时使用原声大碟",
variable=inYsddMode, onvalue=True, offvalue=False,
font=font.Font(family="微软雅黑", size=10))


#按钮们
#播放按钮
playButton = Button(mainWindow, text="直接播放", command=onDirectPlay, height=1, width=8,
Expand All @@ -193,14 +185,33 @@ def createConfigWindow():
font=font.Font(family="微软雅黑", size=11))


#原声大碟复选框
ysddCkBt = Checkbutton(mainWindow, text="匹配到特定文字时使用原声大碟",
variable=inYsddMode, onvalue=True, offvalue=False,
font=font.Font(family="微软雅黑", size=10))


#标准化音频复选框
normCkBt = Checkbutton(mainWindow, text="分别标准化每个字和每条原声大碟句子",
variable=normAudio, onvalue=True, offvalue=False,
font=font.Font(family="微软雅黑", size=10))


#倒放音频复选框
reverseCkBt = Checkbutton(mainWindow, text="频音的成生放倒",
variable=reverseAudio, onvalue=True, offvalue=False,
font=font.Font(family="微软雅黑", size=10))


#音调偏移文本
pitchShiftLabel = Label(mainWindow, text="音调偏移选项:",
font=font.Font(family="微软雅黑", size=10))


#音调偏移
pitchShiftMenu = OptionMenu(mainWindow, pitchShiftOption,
*list(optionConvertMap.keys()))
pitchShiftScale = Scale(mainWindow, from_=0.4, to=2.0, orient=HORIZONTAL, width=15, length=200,
resolution=0.1, variable=pitchShiftOption,
font=font.Font(family="微软雅黑", size=9))



Expand All @@ -218,16 +229,15 @@ def createConfigWindow():

#主窗口
#-----------------------------
#设置窗口大小
mainWindow.geometry("480x360")
mainWindow.geometry("480x420")
mainWindow.title("欧炫!纯纯的活字印刷")
mainWindow.resizable(False, False)
#窗口图标
try:
img = ImageTk.PhotoImage(Image.open("./lizi.ico"))
mainWindow.tk.call('wm', 'iconphoto', mainWindow._w, img)
except:
messagebox.showwarning("警告", "缺失图标")
#窗口标题
mainWindow.title("欧炫!纯纯的活字印刷")

#元素属性
#-----------------------------
Expand All @@ -238,9 +248,12 @@ def createConfigWindow():
configButton.place(x=310, y=230)

ysddCkBt.place(x=20, y=280)
pitchShiftLabel.place(x=20, y=310)
pitchShiftOption.set("正常")
pitchShiftMenu.place(x=110, y=310)
normCkBt.place(x=20, y=305)
reverseCkBt.place(x=20, y=330)

pitchShiftLabel.place(x=20, y=375)
pitchShiftOption.set(1)
pitchShiftScale.place(x=110, y=360)


#检查活字印刷实例是否配置正确
Expand Down
4 changes: 2 additions & 2 deletions generateExeWin.bat
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
CALL nuitka --mingw --disable-console --enable-plugin=numpy,tk-inter --nofollow-import-to=matplotlib --include-data-dir="E:/ProgramFiles/Python/Lib/site-packages/_soundfile_data"="_soundfile_data" --standalone --onefile --output-dir=./excutables/Windows/ ./HZYS_GUI.py
CALL nuitka --mingw --enable-console --enable-plugin=numpy --nofollow-import-to=matplotlib --include-data-dir="E:/ProgramFiles/Python/Lib/site-packages/_soundfile_data"="_soundfile_data" --standalone --onefile --output-dir=./excutables/Windows/ ./HZYS.py
CALL nuitka --mingw --disable-console --enable-plugin=numpy,tk-inter --nofollow-import-to=matplotlib --include-data-dir="E:/ProgramFiles/Python/Lib/site-packages/_soundfile_data"="_soundfile_data" --windows-icon-from-ico="./lizi.ico" --standalone --onefile --output-dir="./excutables/Windows/" "./HZYS_GUI.py"
CALL nuitka --mingw --enable-console --enable-plugin=numpy --nofollow-import-to=matplotlib --include-data-dir="E:/ProgramFiles/Python/Lib/site-packages/_soundfile_data"="_soundfile_data" --windows-icon-from-ico="./lizi.ico" --standalone --onefile --output-dir="./excutables/Windows/" "./HZYS.py"
49 changes: 28 additions & 21 deletions huoZiYinShua.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,6 @@
#目标采样率
_targetSR = 44100

#关键词与频率伸缩系数对照
_keyWordPitchMap = {
"laotou": 0.8,
"xiaohai": 1.5,
"xingzhuan": 1.3
}




Expand All @@ -40,21 +33,30 @@ def _fileName2FolderName(fileName):



#标准化音频,统一音量
def _normalizeAudio(data):
rms = np.sqrt(np.mean(data**2))
normData = data / rms * 0.2
return normData



#读取音频文件
def _loadAudio(fileDir):
def _loadAudio(fileDir, norm):
data, sampleRate = sf.read(fileDir)
#双声道转单声道
if (len(data.shape) == 2):
#左右声道相加除以2
data = (data[:, 0] + data[:, 1]) / 2

#统一采样率
if (sampleRate != _targetSR):
#计算转换后的长度
newLength = int((_targetSR / sampleRate) * len(data))
#转换
data = np.interp(np.array(range(newLength)), np.linspace(0,newLength-1,len(data)), data)

#标准化
if norm:
data = _normalizeAudio(data)
return data


Expand Down Expand Up @@ -113,24 +115,24 @@ def config(self, configFileLoc):

#直接导出
def export(self, rawData, filePath="./Output.wav", inYsddMode=False,
pitchShift="disabled"):
self.__concatenate(rawData, inYsddMode, pitchShift)
pitchShift=1, norm=False, reverse=False):
self.__concatenate(rawData, inYsddMode, pitchShift, norm, reverse)
self.__export(filePath)
print("已导出到" + filePath + "下")



#直接播放
def directPlay(self, rawData, tempPath="./HZYSTempOutput/temp.wav",
inYsddMode=False, pitchShift="disabled"):
self.__concatenate(rawData, inYsddMode, pitchShift)
inYsddMode=False, pitchShift=1, norm=False, reverse=False):
self.__concatenate(rawData, inYsddMode, pitchShift, norm, reverse)
self.__export(tempPath)
playsound(tempPath)



#生成中间文件
def __concatenate(self, rawData, inYsddMode, pitchShift):
def __concatenate(self, rawData, inYsddMode, pitchShift, norm, reverse):
missingPinyin = []
self.__concatenated = np.array([])

Expand Down Expand Up @@ -190,7 +192,9 @@ def __concatenate(self, rawData, inYsddMode, pitchShift):
#拼接每一个字
try:
self.__concatenated = np.concatenate((self.__concatenated,
_loadAudio(self.__voicePath + word + ".wav")))
_loadAudio(self.__voicePath
+ word + ".wav",
norm)))
#如果出现错误
except Exception as e:
print(e) #显示错误信息
Expand All @@ -208,7 +212,8 @@ def __concatenate(self, rawData, inYsddMode, pitchShift):
self.__concatenated = np.concatenate((self.__concatenated,
_loadAudio(self.__ysddPath
+ self.__ysddTable[pronunciations[i][0]]
+ ".wav")))
+ ".wav",
norm)))
#如果出现错误
except Exception as e:
print(e) #显示错误信息
Expand All @@ -221,15 +226,17 @@ def __concatenate(self, rawData, inYsddMode, pitchShift):


#音高偏移
if (pitchShift != "disabled"):
self.__concatenated = _shiftPitch(self.__concatenated,
_keyWordPitchMap[pitchShift])
if (pitchShift != 1):
self.__concatenated = _shiftPitch(self.__concatenated, pitchShift)

#倒放
if(reverse):
self.__concatenated = np.flip(self.__concatenated)

#如果缺失拼音,则发出警告
if len(missingPinyin) != 0:
print("警告:缺失或未定义{}".format(missingPinyin))



#导出wav文件
Expand Down
Binary file modified sources/che.wav
Binary file not shown.
Binary file added sources/chuang.wav
Binary file not shown.
Binary file added sources/chui.wav
Binary file not shown.
Binary file added sources/cou.wav
Binary file not shown.
Binary file added sources/cu.wav
Binary file not shown.
Binary file added sources/en.wav
Binary file not shown.
Binary file added sources/pian.wav
Binary file not shown.
Binary file added sources/reng.wav
Binary file not shown.
Binary file added sources/se.wav
Binary file not shown.
Binary file added sources/sun.wav
Binary file not shown.
Binary file added sources/wa.wav
Binary file not shown.
Binary file modified sources/zen.wav
Binary file not shown.
Binary file added sources/zhei.wav
Binary file not shown.
Binary file added sources/zhun.wav
Binary file not shown.

0 comments on commit a33bbbc

Please sign in to comment.