https://pythonjishu.com/tzzjavbepoesojm/
安装
1
pip install pyttsx3 pip install gtts
2
报错的话
OSError: libespeak.so.1: cannot open shared object file: No such file or directory
sudo apt-get update sudo apt-get install espeak
3 编译
$ git clone https://github.com/caixxiong/espeak-data $ cd espeak-data/ $ unzip espeak-data.zip $ sudo cp -r * /usr/lib/arm-linux-gnueabihf/espeak-data/ $ sudo espeak --compile=zh
设置中文
engine.setProperty('voice', 'zh')
单独
#!/usr/bin/env python # -*- coding: utf-8 -*- import pyttsx3 engine = pyttsx3.init() ''' voices = engine.getProperty('voices') for voice in voices: print("Voice:") print(" - ID: %s" % voice.id) print(" - Name: %s" % voice.name) print(" - Languages: %s" % voice.languages) print(" - Gender: %s" % voice.gender) print(" - Age: %s" % voice.age) ''' engine.setProperty('voice', 'zh') engine.setProperty('rate', 200)# speed engine.setProperty('volume', 0.7) text = "你好,欢迎使用中文语音合成!" engine.say(text) engine.runAndWait() #engine.save_to_file(text, 'output.wav') #engine.runAndWait()
综合实例
import pyttsx3 import pyaudio import time #from gtts import gTTS from multiprocessing import Process,Manager class Voice(): #def __init__(self,ShareDatas,Lock): def __init__(self): # 初始化 TTS 引擎 self.engine = pyttsx3.init() self.engine.setProperty("rate", 150) # 设置语速 self.engine.setProperty("volume", 0.8) # 设置音量 # 定义待朗读的中文文本 self.text = "世界上没有垃圾,只有被人滥用的资源。" # 设置 TTS 引擎的语言为中文 self.engine.setProperty("voice", "zh") # 进行语音合成 #engine.say(text) #engine.runAndWait() def Say(self,text,voice_name='temp.mp3'): self.engine.say(text) self.engine.runAndWait() with open(voice_name, "wb") as file: self.engine.save_to_file(text, voice_name) self.engine.runAndWait() def Play(self,voice_name="temp.mp3"): #return # 播放合成的音频 chunk = 1024 p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(2), channels=1, rate=44100, output=True) with open(voice_name, "rb") as file: data = file.read(chunk) while data: stream.write(data) data = file.read(chunk) stream.stop_stream() stream.close() p.terminate() def Vioce_PLAY(ShareImages,lock): Voice_=Voice() while 1: if ShareImages[9]==1: print("vioce break") break if ShareImages[1]==1: ShareImages[1]=0 msg=ShareImages[2] Voice_.Say(msg) time.sleep(4) else: time.sleep(0.001) ''' if __name__ == '__main__': lock = Manager().Lock()#创建共享内存容器 ShareImages=Manager().dict()#存str类型数据 ShareImages[1]=0#用于控制保存图像和开始识别 ShareImages[2]="购买物品是"#计算结果 播报 ShareImages[9]=0 p = Process(target=Vioce_PLAY, args=(ShareImages,lock))#开启进程 p.deamon=True #伴随主进程关闭而关闭,但是有时候还是关闭不了,单独搞个标志位来控制 p.start()#开始 i=0 while 1: time.sleep(3) if ShareImages[1]==0: ShareImages[1]=1 i=i+1 ShareImages[2]="购买物品是"+str(i) else: pass '''
单纯播放mp3
import time import pygame import os from mutagen.mp3 import MP3 from multiprocessing import Process,Manager def GET_mp3List(): #获取地址并拼接 path_mp3='mp3/' mp3_list_Path=[] for i in os.listdir(path_mp3): s=os.path.join(path_mp3,i) mp3_list_Path.append(s) print(i) return mp3_list_Path def Mp3_paly_all(): mp3_list_Path=GET_mp3List() if len(mp3_list_Path)==0: print("没有数据") return 0 for Path_i in mp3_list_Path: # 获取每一首歌的时长 audio = MP3(Path_i) print("歌曲时间",int(audio.info)) pygame.mixer.init() path = Path_i pygame.mixer.music.load(path) pygame.mixer.music.play(10)#播放载入的音乐。该函数立即返回,音乐播放在后台进行 time.sleep(int(10)) pygame.mixer.music.pause() # 暂停 time.sleep(int(3)) pygame.mixer.music.unpause() # 接着播放 #获取歌曲时间 time.sleep(int(audio.info.length)) def Mp3_paly_while(ShareImages,lock): pygame.mixer.init() while 1: if ShareImages[9]==1: print("mp3 stop") if ShareImages[6]=="paly": ShareImages[6]="wait" path = ShareImages[7] pygame.mixer.music.load(path) print("开始播放歌曲",path) #audio = MP3(path) #print("歌曲时间",int(audio.info)) pygame.mixer.music.play() elif ShareImages[6]=="stop": ShareImages[6]="wait" pygame.mixer.music.pause() # 暂停 time.sleep(0.0001) ''' if __name__ == '__main__': ShareImages=Manager().dict() lock=Manager().Lock() ShareImages[6]="wait"# ,mp3 动作 ShareImages[7]="wait"# ,mp3 当前播放名字 ShareImages[9]=0#用于关闭所有进程 #1采集图像进程 t1=Process(target=Mp3_paly_while,args=(managerdata,sharelock)) t1.start() t1.deamon=True #伴随主进程关闭而关闭 while 1: pass '''
单独播放mp3