Ошибка разрешения Python 3 при воспроизведении звукового файла (mp3, модуль воспроизведения звука)

Несколько дней назад программа работала нормально, а сегодня остановилась. Ни одна буква не изменена. Одним из моих шагов по устранению неполадок было удаление файла «output1.mp3» и проверка, будет ли он работать таким образом, но это не сработало. Другое дело, что когда он не распечатывал ошибку, он продолжал воспроизводить только этот звуковой файл, независимо от того, правильно он говорил или нет... Вот последняя ошибка, которую я получил, надеюсь, это поможет:

Traceback (most recent call last):
  File "main3.py", line 123, in <module>
    start()
  File "main3.py", line 117, in start
    tts(say)
  File "main3.py", line 24, in tts
    play('output1.mp3')
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\playsound.py", line 35, in _playsoundWin
    winCommand('open "' + sound + '" alias', alias)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\playsound.py", line 31, in winCommand
    raise PlaysoundException(exceptionMessage)
playsound.PlaysoundException:
    Error 275 for command:
        open "output1.mp3" alias playsound_0.8842337577803419
    Cannot find the specified file.  Make sure the path and filename are correct.

Вот код, который я использую, прокомментируйте, если вам нужно, чтобы я дал вам больше информации:

    #!/usr/bin/env python3
import boto3                               # used to 'pythonize' Amazon Polly TTS
import speech                              # speech recognition
from playsound import playsound as play    # for playing sound files
import sys                                 # basically only for exiting
#  import locator                          # for determining the location of the user based on IP address
import locator2                            # for confirming auto-detected location
#  import locator3                         # for definitely confirming auto-detection location
import question                            # module for answering any question

from datetime import datetime              # for displaying the date and time
#  from time import sleep                  # sleep (wai()t for) function
from os import popen as read               # for reading command outputs "read('COMMAND').read()"


def tts(text):
    polly = boto3.client("polly")
    spoken_text = polly.synthesize_speech(Text=str(text),
                                          OutputFormat='mp3',
                                          VoiceId='Brian')
    with open('output11.mp3', 'wb') as f:
        f.write(spoken_text['AudioStream'].read())
        f.close()
    play('output11.mp3')


def ask(query):
    question.question(query)
    response = question.answer
    print(response)
    tts(response)
    ai()


def time():
    now = datetime.now()
    print("Current date and time: ")
    print(now.strftime("%H:%M") + "\n")
    tts("It is " + now.strftime("%H:%M"))
    ai()


def weather():
    response = "Based on your IP address, I've detected that you're located in %s. Is that correct?" % locator2.city
    print(response)
    tts(response)
    speech.speech()
    if 'yes' in speech.x:
        z = read('weather "%s"' % locator2.city).read()
        print(z)
        tts(z)
        ai()
    else:
        response = 'Please say the name of the city you would like the weather information for. \n'
        print(response)
        tts(response)
        speech.speech()
        city = speech.x
        wdr = read('weather "%s"' % city).read()
        print(wdr)
        tts(wdr)
        ai()


def thank():
    response = "You're very welcome! \n"
    print(response)
    tts(response)
    ai()


def ext():
    response = "Goodbye!"
    print(response)
    tts(response)
    sys.exit()


def error():
    response = "Invalid request detected, please try again...\n"
    print(response)
    tts(response)
    ai()


def ai():

    print('Started listening - Speak!')
    speech.speech()
    spoken = speech.x

    # TODO new commands should be written above this, and their trigger words below :)
    question_words = ['?', 'what', 'where', 'when', 'who', 'how', 'why']

    if 'time' in spoken:
        time()

    elif 'weather' in spoken:
        weather()

    elif any(word in spoken for word in question_words):
        ask(spoken)

    elif 'thank' in spoken:
        thank()

    elif 'exit' or 'quit' or 'deactivate' in spoken:
        ext()

    else:
        error()


def start():
    say = "Hello! My name is Dave, and I'm your personal assistant. How may I help you today? \n"
    print(say)
    tts(say)
    ai()


if __name__ == '__main__':
    try:
        start()
    except KeyboardInterrupt:
        ext()

Синтезатор речи — Amazon Polly. Кстати, я использовал PyCharm в качестве IDE и работал на Windows 10. Когда я переключаюсь на свою машину с Linux, часть распознавания речи ломается...

ОБНОВЛЕНИЕ: я немного подправил код, и мне удалось исправить ошибку pyaudio, но в процессе я получил еще одну, на этот раз она касалась разрешений. Вот журнал ошибок:

Traceback (most recent call last):
  File "C:/Users/Despot/Desktop/DAv3/main3.py", line 123, in <module>
    start()
  File "C:/Users/Despot/Desktop/DAv3/main3.py", line 118, in start
    ai()
  File "C:/Users/Despot/Desktop/DAv3/main3.py", line 96, in ai
    time()
  File "C:/Users/Despot/Desktop/DAv3/main3.py", line 39, in time
    tts("It is " + now.strftime("%H:%M"))
  File "C:/Users/Despot/Desktop/DAv3/main3.py", line 21, in tts
    with open('output11.mp3', 'wb') as f:
PermissionError: [Errno 13] Permission denied: 'output11.mp3'

ОБНОВЛЕНИЕ 2: я занимался тикерством и обнаружил, что проблема присутствует только на моем компьютере с Windows 10, программа отлично работает на Linux.


person Desamax1    schedule 03.02.2019    source источник
comment
Это то, что вы показываете в файле main3.py? Какие строки 117 и 123 в вашем коде? Начните с этого.   -  person lurker    schedule 03.02.2019
comment
Да, это main3.py. Строки 117 и 123 просто указывают на функцию tts() (которую я использую для синтеза речи). И что меня больше всего беспокоит, так это то, что он просто перестал работать без видимой причины...   -  person Desamax1    schedule 03.02.2019


Ответы (5)


В playsound libs есть каталоги Windows. Если это не удается только в Linux, вы должны установить библиотеку playsound на машину с Linux, а затем скопировать на нее только main3.py.

person o2ma    schedule 03.02.2019
comment
Добро пожаловать в SO, обратите внимание, что запросы на разъяснения от ОП следует делать только в комментариях, поскольку ответы зарезервированы для... ответов. Вам придется подождать, пока вы не наберете необходимую репутацию (50), чтобы иметь возможность комментировать. До тех пор вы можете отвечать на вопросы, которые не требуют дополнительных разъяснений! - person Thierry Lathuille; 03.02.2019
comment
Я изменил это на ответ - person o2ma; 03.02.2019
comment
Я не уверен, что мы понимаем друг друга, потому что проблема не в воспроизведении звука - это работает нормально, - а в отказе python записывать новые данные в файл (и в отдельном вопросе, что библиотека распознавания речи Python просто зависает и отказывается для совместной работы на моей машине с Linux вы можете найти это здесь) - person Desamax1; 03.02.2019
comment
Проверьте свою трассировку - сразу после этой строки: Файл main3.py, строка 24, в tts он пытается получить доступ к C:\Program Files (x86)\Python36-32\lib\site-packages\playsound.py, который явно может не будет доступа на Linux-машине, так как это каталог Windows. это сообщение об ошибке от библиотек playsound, это означает, что библиотеки содержат плохие каталоги и должны быть заменены. - person o2ma; 03.02.2019
comment
Вы скопировали библиотеки playsound с компьютера с Windows на компьютер с Linux? - person o2ma; 03.02.2019
comment
Нет, я установил playsound через pip3 на свой Linux-компьютер. Я немного подправил код и смог исправить эту ошибку, но получил другую. Я опубликую это как обновление в вопросе. - person Desamax1; 03.02.2019

Ответ для UPDATE2: Скопируйте output11.mp3 в другое место и измените путь к новому местоположению:

with open('CHANGE-THIS-PATH', 'wb') as f:

Также убедитесь, что Python запущен от имени администратора.

person o2ma    schedule 05.02.2019
comment
Я только что попробовал это, но не повезло. Я удалил файл output11.mp3, и он отлично работал при первой записи, но выдавал ту же ошибку при попытке записи во второй раз. Я даже запускал его из cmd, который запускал от имени администратора. - person Desamax1; 05.02.2019
comment
Ваш python использует файл, когда вы пытаетесь его написать? - person o2ma; 05.02.2019
comment
Я не думаю, что это так. Как я уже говорил, код через некоторое время просто перестал работать. Раньше работал нормально... - person Desamax1; 15.02.2019

У меня была похожая проблема в самом начале моего изучения пакета playsound. Я собирался запустить основной первый шаг кода playsound, а именно:


from playsound import playsound

playsound('sample.wav')

Примечание: sample.wav — это мой аудиофайл, который нужно воспроизвести.

Я пытался запустить его, но я столкнулся с той же ошибкой, что и вы раньше. Через несколько минут я просто переименовал аудиофайл из sample.wav в sample, а затем запустил его как playsound('sample.wav')

К счастью! Он побежал. Затем я узнал, что раньше он хранился как sample.wav.wav.

Поэтому давайте сохраним имя вашего аудиофайла как output.wav и попробуем запустить его как playsound('output.wav.wav') или переименовать его в output и запустить как playsound('output.wav') аналогично для другие аудиоформаты.

Надеюсь, вы получили ответ!

person the_blossom    schedule 31.10.2019

Попробуйте использовать абсолютный путь (полный путь) аудиофайла вместо относительного пути.

Например: «C:/Users/Adam/Desktop/dolphin.wav» вместо «dolphin.wav».

Это сработало для меня.

person Martin Medro    schedule 01.03.2020

Я решил эту проблему, переместив файлы .py и .wav в папку менее глубоко внутри файловой системы.

person Robin Andrews    schedule 25.09.2020