我创建了一个虚拟助手,可以在Windows 10上使用Python 3.6在网上为我搜索内容,打开特定网站,打开word,powerpoint等应用程序。 我已成功将其转换为.exe文件,并且运行正常,但是无法播放代码中包含的声音片段。在将声音转换为exe之前,我将声音放在与代码相同的目录中。当您尝试以ADMINISTRATOR身份运行应用程序时,它没有播放声音,而是由Windows声音代替(我希望这样做确实有意义)。 有什么办法可以解决此问题,或者Pyinstaller可以将我的代码与音频混合吗?感谢您的帮助!
除了重新转换外,我从未尝试过其他任何方法,因为从目录中删除音频文件毫无意义。
这是我的代码中播放声音的部分。如果您想/需要查看我的整个代码(有500行),请告诉我,我会提供。
elif "toss a coin" in recog1.recognize_google(audio, language="en-US"):
coin = ["HEADS", "TAILS"]
engine.say("Tossing a coin...")
engine.runAndWait()
winsound.PlaySound("coin_toss.wav", winsound.SND_FILENAME)
engine.say("The coin toss shows" + random.choice(coin))
engine.runAndWait()
elif "roll a die" in recog1.recognize_google(audio, language="en-US"):
engine.say("Rolling a die")
engine.runAndWait()
winsound.PlaySound("roll_die", winsound.SND_FILENAME)
engine.say("The die result shows " + str(random.randint(0, 6)))
engine.runAndWait()
当我在IDE(Pycharm)上运行它时,它可以正常运行,但是当我在命令行上运行时,它也可以运行,但是音频不起作用。
答案 0 :(得分:1)
PyInstaller不会做这种事情。您需要手动提供声音文件。首先,您需要使用add-data
标志将声音文件添加到输出可执行文件,然后创建一个函数来从提取的路径加载文件。
请记住,我正在使用resource_path
函数加载声音文件。将歌曲文件放在脚本文件旁边。
import os
import sys
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
...
elif "toss a coin" in recog1.recognize_google(audio, language="en-US"):
coin = ["HEADS", "TAILS"]
engine.say("Tossing a coin...")
engine.runAndWait()
winsound.PlaySound(resource_path("coin_toss.wav"), winsound.SND_FILENAME)
engine.say("The coin toss shows" + random.choice(coin))
engine.runAndWait()
elif "roll a die" in recog1.recognize_google(audio, language="en-US"):
engine.say("Rolling a die")
engine.runAndWait()
winsound.PlaySound(resource_path("roll_die"), winsound.SND_FILENAME)
engine.say("The die result shows " + str(random.randint(0, 6)))
engine.runAndWait()
...
并使用以下命令生成可执行文件:
pyinstaller -F --add-data "path/to/coin_toss.wav;." --add-data "path/to/roll_die;." script.py