编辑 wav 文件 headers 以便在 python 中与 QSound/pyqt5 一起使用(Watson Text To Speech TTS)
Edit wav file headers for use with QSound/pyqt5 from within python (Watson Text To Speech TTS)
pyqt5 的 QSound 一直给我带来麻烦,一些 wav 文件运行良好。其他导致 Qt 应用程序出错而不是 运行。我通过研究将罪魁祸首缩小到 wav 文件的 headers。
如果我在 Audacity 中打开 wav 文件并将其导出为 wav 文件...导出的 wav 文件可以完美运行。但是,我需要 python 脚本中 运行 的解决方案。
我正在从 Watson 的 Text-To-Speech api 获取我的 wav 文件,不确定我是否可以控制 headers 它包含的内容。
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtCore import Qt
from PyQt5.QtMultimedia import QSound
from ibm_watson import TextToSpeechV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
def list_to_speech(text, language='ja-JP_EmiV3Voice'):
api_key = "my_api_key"
url = "url"
# Set up service
authenticator = IAMAuthenticator(api_key)
# Now TTS service
tts = TextToSpeechV1(authenticator=authenticator)
# Set Service URL
tts.set_service_url(url)
with open('text_to_speech.wav', 'wb') as audio_file:
res = tts.synthesize(text, accept='audio/wav', voice=language).get_result()
audio_file.write(res.content)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.sound = QSound("text_to_speech.wav")
self.sound.play()
label = QLabel("This PyQt5 window will (try to) play the wav file!")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
if __name__ == "__main__":
# the file saved by list_to_speech won't play as QSound(text_to_speech.wav).play()
# (instead it crashes the app before opening)
#
# if I open the text_to_speech.wav file in Audacity and export it with empty headers,
# then comment out next line, it works.
list_to_speech("ありがとう")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
一个可能的解决方案是不使用 QSound,而是使用允许处理其他编解码器的 QMediaPlayer:
import os
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
# ...
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
filename = os.path.join(CURRENT_DIR, "text_to_speech.wav")
self.player = QMediaPlayer()
url = QUrl.fromLocalFile(filename)
self.player.setMedia(QMediaContent(url))
self.player.play()
label = QLabel("This PyQt5 window will (try to) play the wav file!")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
# ...
注意:另一种选择是使用另一种格式,如 mp3。
pyqt5 的 QSound 一直给我带来麻烦,一些 wav 文件运行良好。其他导致 Qt 应用程序出错而不是 运行。我通过研究将罪魁祸首缩小到 wav 文件的 headers。
如果我在 Audacity 中打开 wav 文件并将其导出为 wav 文件...导出的 wav 文件可以完美运行。但是,我需要 python 脚本中 运行 的解决方案。
我正在从 Watson 的 Text-To-Speech api 获取我的 wav 文件,不确定我是否可以控制 headers 它包含的内容。
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtCore import Qt
from PyQt5.QtMultimedia import QSound
from ibm_watson import TextToSpeechV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
def list_to_speech(text, language='ja-JP_EmiV3Voice'):
api_key = "my_api_key"
url = "url"
# Set up service
authenticator = IAMAuthenticator(api_key)
# Now TTS service
tts = TextToSpeechV1(authenticator=authenticator)
# Set Service URL
tts.set_service_url(url)
with open('text_to_speech.wav', 'wb') as audio_file:
res = tts.synthesize(text, accept='audio/wav', voice=language).get_result()
audio_file.write(res.content)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.sound = QSound("text_to_speech.wav")
self.sound.play()
label = QLabel("This PyQt5 window will (try to) play the wav file!")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
if __name__ == "__main__":
# the file saved by list_to_speech won't play as QSound(text_to_speech.wav).play()
# (instead it crashes the app before opening)
#
# if I open the text_to_speech.wav file in Audacity and export it with empty headers,
# then comment out next line, it works.
list_to_speech("ありがとう")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
一个可能的解决方案是不使用 QSound,而是使用允许处理其他编解码器的 QMediaPlayer:
import os
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
# ...
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
filename = os.path.join(CURRENT_DIR, "text_to_speech.wav")
self.player = QMediaPlayer()
url = QUrl.fromLocalFile(filename)
self.player.setMedia(QMediaContent(url))
self.player.play()
label = QLabel("This PyQt5 window will (try to) play the wav file!")
label.setAlignment(Qt.AlignCenter)
self.setCentralWidget(label)
# ...
注意:另一种选择是使用另一种格式,如 mp3。