我试图找到一种方法在python中创建文本到语音(我在Windows 7上).我正在使用pyinstaller来编译这个程序.我尝试了很多方法,包括使用谷歌通过urllib2模块访问的非官方文本到语音程序.这最终会创建一个mp3文件.有关代码的详细信息,此代码的大部分内容来自http://glowingpython.blogspot.com/2012/11/text-to-speech-with-correct-intonation.html.然后我需要播放这个生成的mp3文件.我使用了mplayer,ffmpeg,mp3play,audiere,pydub和pygame都有相同的结果:没有播放声音,但没有引发异常.我甚至在覆盆子pi上使用了相同的pygame代码并成功播放了mp3文件.我也尝试将它转换为一个wav文件,它运行良好,只有当我尝试用pygame或winsound播放它时,同样的事情发生了.没有声音,没有例外.我当前的代码使用winsound,播放我可以在Windows媒体播放器中成功播放的wav文件(我甚至可以使用os.startfile()从python中的windows media player中打开它).这里是:
winsound.PlaySound("file.wav", winsound.SND_FILENAME) #the wav file is in the same directory as the program
Run Code Online (Sandbox Code Playgroud)
我也在尝试使用pygame调音台音乐模块.例如:
init() #this is pygame.init(), I only imported init and the mixer module
pygame.mixer.init() #initializes pygame.mixer
pygame.mixer.music.load(filename) #loads it in music
pygame.mixer.music.play() #plays it in music
time.sleep(20)
Run Code Online (Sandbox Code Playgroud)
我甚至用winsound和win32api Beep()函数成功地从python中播放了声音.但是,这显然无法播放mp3或wav文件.我还尝试了一个完全不同的文本到语音引擎,使用pyttsx在混音中播放没有mp3文件的声音:
import pyttsx
engine = pyttsx.init()
def tts(mytext):
engine.say(mytext)
engine.runAndWait()
Run Code Online (Sandbox Code Playgroud)
这也无法创建声音或引发异常.由于这种模式,我觉得这与系统有关,但似乎并不是显而易见的事情.
因为这几乎肯定与硬件有关(pygame.mixer已经在不同的硬件上运行,我相信它通常适用于Windows),知道我使用东芝笔记本电脑可能很重要.另外,我使用的是python 2.7.
理想情况下,我想用pygame做这个,因为我有最丰富的使用经验,并且有一些声音编辑功能我想在pygame中访问,如果可能的话.
我也尝试使用64位python(我在64位Windows 7上使用32位python).它仍然无法工作.
我也试过在Ubuntu虚拟盒环境中播放一个mp3文件,但是在同一个设备上.它仍然无法正常工作.这并不特别令人惊讶,因为virtualbox使用来自主机操作系统的大量资源(如屏幕和wifi),因此它不一定会以不同的方式播放声音.任何解决方法都会有所帮助.有些声音很好,在python中没有专门的mp3或wav文件,所以可能有一个解决方案.
我在Windows 7上使用py2exe来使用psutil制作应用程序.我正在使用python 2.7.我正在制作单个文件可执行文件.当我尝试用psutil编译python python程序时,它接近结尾说:
The following modules appear to be missing
['_psutil_bsd', '_psutil_linux', '_psutil_osx', '_psutil_posix', '_psutil_sunos', '_scproxy', '_sysconfigdata', 'builtins']
Run Code Online (Sandbox Code Playgroud)
但是,该程序编译良好.当我运行编译的程序时,它崩溃并生成一个日志文件:
回溯(最近一次调用最后一次):文件"TaskManager.py",第27行,在文件"zipextimporter.pyc",第82行,在load_module文件"psutil__init __.pyc",第135行,在文件"zipextimporter.pyc"中,行82,在load_module文件"psutil_psmswindows.pyc",第14行,在文件"zipextimporter.pyc",第98行,在load_module中导入错误:MemoryLoadLibrary加载失败_psutil_mswindows.pyd
我已尝试在设置的选项部分列出:
"includes": ["_psutil_mswindows.pyd"]
Run Code Online (Sandbox Code Playgroud)
以及公正
"includes": ["psutil"]
Run Code Online (Sandbox Code Playgroud)
我也尝试将所有列出的模块py2exe列为缺失.除了包含没有做任何事情的psutil之外,py2exe找不到这些文件.
关于这个主题在线有相当多的类似问题,但没有一个有很好的答案(如果有任何答案),许多错误都不是我的问题.
更新:奇怪的是,我在py2exe的构建目录的build\bdist.win32\winexe\collect-2.7中找到了_psutil_mswindows.pyd.我想由于某种原因它没有得到正确的包装.
我正在编写一个python类,它充当一个不可变的无限序列.
该类不使用生成器来访问此无限序列,而是根据__getitem__方法中的算法为序列中的任意索引生成值.
我很好奇处理__len__这种对象的方法的最佳方法是什么.理想情况下,我会回过头float("inf")来__len__.但是,在幕后len()调用对象__len__方法的函数需要一些特定的值.
如果__len__设置为返回float("inf")或decimal.Decimal("Infinity"),len()则通过引发TypeError来拒绝它.它还拒绝"-1"的值,这意味着序列是无限的.此外,当我试图用一个无边类,我碰巧早前撰文指出,确实在事实上继承int,len()无论出于何种原因返回0.
虽然让值只是"0"并不是一个很大的不便,虽然像这样的类很不寻常,但我仍然很想知道,有没有一种很好的方法来处理类的长度属性那是一个无限的序列?
我发现了很多关于使用pygame及其字体库的教程,但它们都显示了相同的东西.他们都向您展示了如何在背景上写一些纯文本,这很棒,但除此之外,我找不到很多有用的信息.
通过我正在进行的项目,我有一些菜单按钮,我已经实现了精灵.当你将鼠标悬停在它们上面时,它们会改变颜色,而且一切都很好.我想做的是在这些按钮上写文字,但我对如何做到这一点感到困惑.从docs font.render的工作原理如下:
"这会创建一个新的Surface,并在其上呈现指定的文本.Pygame无法直接在现有Surface上绘制文本:相反,您必须使用Font.render - 在新Surface上绘制文本以创建图像(Surface)文本,然后将此图像blit到另一个Surface上."
所以我试图拍摄附在我的精灵上的图像,然后直接将文字加到上面.这似乎绝对没有什么:
resume = self.button_font.render(
'Resume Game',
True,
constants.WHITE,
(23, 56, 245) # Main color of the button, tried without this as well
)
self.resume_button.image.blit(
resume,
self.resume_button.rect,
)
Run Code Online (Sandbox Code Playgroud)
我知道代码运行,但你从来没有看到任何文字.如果我将文本直接显示到我的主屏幕表面,它只会写在我的简历按钮的顶部(当然取决于blit顺序).我究竟做错了什么?文档似乎表明这是处理它的正确方法,但我还没有找到其他人这样做.任何帮助将不胜感激.