Errno 13 Permission denied: 'file.mp3' Pyt

2019-09-16 11:16发布

问题:

I am getting an error when writing to an audio file.

Basically, I am overwriting the data in the mp3 whenever my function gets called and then playing it.

It works the first time through, but then gives me [Errno 13] Permission denied: 'file.mp3' then on.

Here is the code:

def speech(self, response):
    audio_file = "response.mp3"
    tts = gTTS(text=str(response), lang="en")
    tts.save(audio_file)
    pygame.mixer.init()
    pygame.mixer.music.load(audio_file)
    pygame.mixer.music.play()

Error is on the tts.save line.

More info:

Traceback (most recent call last):

  File "myprojectpath", line 63, in speech
    tts.save(audio_file)

  File "C:\Python35\lib\site-packages\gtts\tts.py", line 93, in save
    with open(savefile, 'wb') as f:

Thanks!

回答1:

from gtts import gTTS
import playsound
import os

x = ['sunny', 'sagar', 'akhil']
tts = 'tts'
for i in range(0,3):
    tts = gTTS(text= x[i], lang = 'en')
    file1 = str("hello" + str(i) + ".mp3")
    tts.save(file1)
    playsound.playsound(file1,True)
    print 'after'
    os.remove(file1)

change the file name every time you save it, this worked for me.



回答2:

a much better solution is this, if i had the time i would also calculate the probability of ever landing a same file

from gtts import gTTS
from playsound import playsound
import random
import os

#creating a super random named file

r1 = random.randint(1,10000000)
r2 = random.randint(1,10000000)

randfile = str(r2)+"randomtext"+str(r1) +".mp3"

tts = gTTS(text='hey, STOP It!!', lang='en', slow=True)
tts.save(randfile)
playsound(randfile)

print(randfile)
os.remove(randfile)


回答3:

You can create another file in the same folder, just copy and rename it.

File you want to use: ("C:/.../file.mp3") copied file: ("C:/.../file_copy.mp3")

You can change the file loaded in mixer.music.load("C:/.../file.mp3") to mixer.music.load("C:/.../file_copy.mp3") and delete delete the ("C:/.../file.mp3") without problem using this:

from pygame import mixer
import os

mixer.music.load("C:/.../file.mp3")
mixer.music.play()
mixer.music.load("C:/.../file_copy.mp3")
os.remove("C:/.../file.mp3")

but the code above will remove the file before even playing it, so you can use a method to await it play:

from pygame import mixer
import os

mixer.music.load("C:/.../file.mp3")
mixer.music.play()
while mixer.music.get_busy(): # check if the file is playing
    pass
mixer.music.load("C:/.../file_copy.mp3")
os.remove("C:/.../file.mp3")