def on_release(key):
if key == keyboard.Key.esc:
# 停止监听键盘事件
return False
def pause():
# 暂停播放
global current_position
current_position = play.tell()
play.stop_playback()
def resume():
# 恢复播放
global current_position
play.seek(current_position)
play()
def fast_forward():
# 快进播放
global current_position
current_position += 5000 # 5秒快进
play.seek(current_position)
def rewind():
# 快退播放
global current_position
current_position -= 5000 # 5秒快退
play.seek(current_position)
创建键盘监听器
listener = keyboard.Listener(
on_press=on_press,
on_release=on_release)
listener.start()
播放故事
play_story(“从前有一个小女孩,大家都叫她小红帽…”)
主循环
while True:
if not is_playing:
# 暂停状态下等待键盘事件
listener.join()
break
这个示例代码整合了之前的代码,并添加了快进和快退功能。在 `pause()` 函数中,我们使用 `play.tell()` 函数获取当前的播放位置,并将其保存到 `current_position` 变量中。在 `resume()` 函数中,我们使用 `play.seek()` 函数将播放位置设置为之前保存的位置,以实现恢复播放的功能。在 `fast_forward()` 和 `rewind()` 函数中,我们通过增加或减少 `current_position` 变量的值来实现快进和快退功能,然后使用 `play.seek()` 函数将播放位置设置为新的位置。
请注意,这只是一个示例代码,实际的实现可能因具体的音频处理库和播放器而有所不同。你需要根据你选择的库和播放器的文档进行集成和调整。
### 八、文本转换语音示例代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/c8fa815df7f44fa682ead73283161efe.jpg)当你需要将故事文本传递给语音合成API并生成对应的语音文件时,你可以按照以下步骤进行操作:
1. 选择一个适合你的语音合成API。常见的语音合成API包括Google Text-to-Speech、Microsoft Azure Speech、IBM Watson Text to Speech等。你需要在相应的API提供商网站上注册账号并获取API密钥或凭据。
2. 安装相应的Python库或SDK,以便与所选的语音合成API进行集成。不同的API可能有不同的Python库或SDK可供使用。你可以查阅所选API的文档以获取详细的集成指南和示例代码。
3. 在你的Python代码中,使用所选的API库或SDK来调用语音合成API。根据API的要求,传递故事文本作为输入,并获取生成的语音文件作为输出。通常,你需要将故事文本作为字符串参数传递给相应的API函数,并将返回的语音文件保存到本地文件。
以下是一个示例,演示了如何使用Google Text-to-Speech API将故事文本转换为语音文件:
from google.cloud import texttospeech
def text_to_speech(text):
# 创建 Text-to-Speech 客户端
client = texttospeech.TextToSpeechClient()
# 设置语音合成参数
synthesis_input = texttospeech.SynthesisInput(text=text)
voice = texttospeech.VoiceSelectionParams(
language_code="en-US", # 设置语言代码
ssml_gender=texttospeech.SsmlVoiceGender.FEMALE # 设置语音性别
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.MP3 # 设置音频编码格式
)
# 调用语音合成API,生成语音文件
response = client.synthesize_speech(
input=synthesis_input,
voice=voice,
audio_config=audio_config
)
# 将生成的语音文件保存到本地
with open("story\_audio.mp3", "wb") as f:
f.write(response.audio_content)
调用示例
story_text = “从前有一个小女孩,大家都叫她小红帽…”
text_to_speech(story_text)
在这个示例中,我们使用Google Cloud的Text-to-Speech客户端库来调用Google Text-to-Speech API。我们设置了语音合成的参数,包括语言代码、语音性别和音频编码格式。然后,我们调用`client.synthesize_speech()`函数,将故事文本传递给API,并获取生成的语音文件。最后,我们将语音文件保存到本地文件`story_audio.mp3`中。
请注意,这只是一个使用Google Text-to-Speech API的示例。实际的实现可能因所选的API而有所不同。你需要根据所选API的文档进行集成和调整。
完成语音合成后,你可以使用适当的库或工具来播放生成的语音文件。常见的Python库包括pydub、playsound、pygame等。你可以选择适合你需求的库,并根据其文档来实现播放功能。
### 九、微项目雏形核心部分示例代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/4aea51b6526c4338830e2937e5ed44fc.jpg)以下是一个完整的示例代码,包括故事库、故事选择、语音合成、语音播放、基本的播放控制功能和语音识别的集成:
from pydub import AudioSegment
from pydub.playback import play
from pynput import keyboard
import speech_recognition as sr
故事库
story_library = {
1: “从前有一个小女孩,大家都叫她小红帽…”,
2: “从前有一个勇敢的王子,他踏上了拯救公主的征程…”,
3: “从前有一个神奇的魔法师,他拥有无穷的魔力…”,
}
全局变量,用于控制播放状态和当前位置
is_playing = True
current_position = 0
def play_story(story_text):
# 将故事文本转换为语音文件
audio = text_to_speech(story_text)
# 播放语音文件
play(audio)
def text_to_speech(text):
# 调用语音合成接口,将文本转换为语音文件
# 返回一个 AudioSegment 对象
# 实际的语音合成代码…
# 这里使用随机生成的示例音频
return AudioSegment.from_file(“example_audio.wav”)
def on_press(key):
global is_playing, current_position
try:
if key == keyboard.Key.space:
if is_playing:
pause()
is_playing = False
print("已暂停")
else:
resume()
is_playing = True
print("已恢复播放")
elif key == keyboard.Key.right:
fast_forward()
elif key == keyboard.Key.left:
rewind()
except AttributeError:
# 处理空格键按下时的事件
if is_playing:
pause()
is_playing = False
print("已暂停")
else:
resume()
is_playing = True
print("已恢复播放")
def on_release(key):
if key == keyboard.Key.esc:
# 停止监听键盘事件
return False
def pause():
# 暂停播放
global current_position
current_position = play.tell()
play.stop_playback()
def resume():
# 恢复播放
global current_position
play.seek(current_position)
play()
def fast_forward():
# 快进播放
global current_position
current_position += 5000 # 5秒快进
play.seek(current_position)
def rewind():
# 快退播放
global current_position
current_position -= 5000 # 5秒快退
play.seek(current_position)
def select_story():
# 选择要听的故事
print(“请选择要听的故事编号:”)
for story_id, story_text in story_library.items():
print(f"{story_id}. {story_text}")
while True:
try:
story_id = int(input("请输入故事编号:"))
if story_id in story_library:
return story_id
else:
print("无效的故事编号,请重新输入。")
except ValueError:
print("无效的输入,请重新输入。")
def speech_to_text():
# 语音识别,获取用户的语音命令
r = sr.Recognizer()
with sr.Microphone() as source:
print(“请说出您的命令:”)
audio = r.listen(source)
try:
command = r.recognize_google(audio, language="zh-CN")
print("识别结果:" + command)
return command
except sr.UnknownValueError:
print("无法识别语音")
return ""
except sr.RequestError:
print("无法连接到语音识别服务")
return ""
创建键盘监听器
listener = keyboard.Listener(
on_press=on_press,
on_release=on_release)
listener.start()
选择故事
story_id = select_story()
story_text = story_library[story_id]
播放故事
play_story(story_text)
主循环
while True:
if not is_playing:
# 暂停状态下等待键盘事件
listener.join()
else:
# 播放状态下等待语音命令
command = speech_to_text()
if command == “继续”:
resume()
is_playing = True
elif command == “暂停”:
pause()
is_playing = False
elif command == “快进”:
fast_forward()
elif command == “快退”:
rewind()
elif command == “退出”:
break
![在这里插入图片描述](https://img-blog.csdnimg.cn/772ccb62576047abaee4d69b29eca417.jpg#pic_center)这个示例代码整合了之前的代码,并在主循环中添加了语音识别的功能。它包括故事库、故事选择、语音合成、语音播放、基本的播放控制功能和语音识别的集成。你可以根据需要进行修改和扩展。
请注意,实际的语音识别功能需要安装`SpeechRecognition`库,并根据需要配置适当的语音识别引擎。在示例代码中,我们使用了Google的语音识别引擎。
### 十、添加音效和背景音乐示例代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/33b9a61a0acb45c88496d58a9e14dd6e.png)要为故事添加音效和背景音乐,你可以使用音频处理库,如`pydub`来混合音频文件。以下是一个示例代码,演示如何将故事的语音、音效和背景音乐合成在一起:
from pydub import AudioSegment
from pydub.playback import play
from pynput import keyboard
import speech_recognition as sr
故事库
story_library = {
1: {
“text”: “从前有一个小女孩,大家都叫她小红帽…”,
“sound_effect”: “sound_effects/footsteps.wav”,
“background_music”: “background_music/fairy_tale_theme.mp3”
},
2: {
“text”: “从前有一个勇敢的王子,他踏上了拯救公主的征程…”,
“sound_effect”: “sound_effects/sword_slash.wav”,
“background_music”: “background_music/epic_adventure.mp3”
},
3: {
“text”: “从前有一个神奇的魔法师,他拥有无穷的魔力…”,
“sound_effect”: “sound_effects/magic_spell.wav”,
“background_music”: “background_music/mystical_journey.mp3”
},
}
全局变量,用于控制播放状态和当前位置
is_playing = True
current_position = 0
def play_story(story_data):
# 将故事文本转换为语音文件
story_audio = text_to_speech(story_data[“text”])
# 加载音效文件
sound_effect = AudioSegment.from_file(story_data["sound\_effect"])
# 加载背景音乐文件
background_music = AudioSegment.from_file(story_data["background\_music"])
# 混合音频
mixed_audio = background_music.overlay(story_audio) + sound_effect
# 播放混合后的音频
play(mixed_audio)
def text_to_speech(text):
# 调用语音合成接口,将文本转换为语音文件
# 返回一个 AudioSegment 对象
# 实际的语音合成代码…
# 这里使用随机生成的示例音频
return AudioSegment.from_file(“example_audio.wav”)
其他代码…
创建键盘监听器
listener = keyboard.Listener(
on_press=on_press,
on_release=on_release)
listener.start()
选择故事
story_id = select_story()
story_data = story_library[story_id]
播放故事
play_story(story_data)
其他代码…
在这个示例代码中,我们为每个故事添加了`sound_effect`和`background_music`字段,分别指定了音效文件和背景音乐文件的路径。在`play_story`函数中,我们加载了故事的语音文件、音效文件和背景音乐文件,并使用`overlay`方法将它们混合在一起。最后,我们播放混合后的音频。
请确保将音效文件和背景音乐文件放在正确的路径下,并根据实际情况修改文件路径。
### 十一、创建图形界面示例代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/5b5d7556046345bcafdca59cd90d18ee.jpg)以下是一个使用`Tkinter`库创建图形用户界面(GUI)的示例代码,可以让用户更直观地选择故事、控制播放并显示故事的文本内容:
import tkinter as tk
from pydub import AudioSegment
from pydub.playback import play
故事库
story_library = {
1: {
“text”: “从前有一个小女孩,大家都叫她小红帽…”,
“audio”: “audio/little_red_riding_hood.mp3”
},
2: {
“text”: “从前有一个勇敢的王子,他踏上了拯救公主的征程…”,
“audio”: “audio/brave_prince.mp3”
},
3: {
“text”: “从前有一个神奇的魔法师,他拥有无穷的魔力…”,
“audio”: “audio/magical_wizard.mp3”
},
}
def play_story():
# 获取选中的故事编号
selected_story = story_listbox.curselection()
if selected_story:
story_id = story_listbox.get(selected_story[0])
story_data = story_library[int(story_id)]
# 播放故事音频
audio = AudioSegment.from_file(story_data["audio"])
play(audio)
def show_story_text():
# 获取选中的故事编号
selected_story = story_listbox.curselection()
if selected_story:
story_id = story_listbox.get(selected_story[0])
story_data = story_library[int(story_id)]
# 显示故事文本内容
story_text.config(state=tk.NORMAL)
story_text.delete("1.0", tk.END)
story_text.insert(tk.END, story_data["text"])
story_text.config(state=tk.DISABLED)
创建主窗口
window = tk.Tk()
window.title(“有声中文故事书”)
window.geometry(“400x300”)
创建故事列表框
story_listbox = tk.Listbox(window)
story_listbox.pack(pady=10)
向故事列表框添加故事
for story_id in story_library:
story_listbox.insert(tk.END, str(story_id))
创建播放按钮
play_button = tk.Button(window, text=“播放”, command=play_story)
play_button.pack(pady=5)
创建文本框,用于显示故事文本内容
story_text = tk.Text(window, height=10, width=40)
story_text.pack()
创建显示故事文本按钮
show_text_button = tk.Button(window, text=“显示文本”, command=show_story_text)
show_text_button.pack(pady=5)
运行主循环
window.mainloop()
在这个示例代码中,我们使用`Tkinter`库创建了一个简单的图形用户界面。界面包括一个故事列表框,用户可以选择要播放的故事;一个播放按钮,用于播放选定故事的音频;一个文本框,用于显示故事的文本内容;以及一个显示文本按钮,用于在文本框中显示选定故事的文本。
你需要根据实际情况修改故事库中的故事文本和音频文件的路径。
### 十二、使用tkinter.ttk重写更加漂亮美观的图形化界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/7fd6085db1804d66bb05f294c7de5721.jpg)使用`tkinter.ttk`模块可以创建更漂亮的GUI界面,它提供了一些主题化的小部件。以下是使用`tkinter.ttk`重写的示例代码:
import tkinter as tk
from tkinter import ttk
from pydub import AudioSegment
from pydub.playback import play
故事库
story_library = {
1: {
“text”: “从前有一个小女孩,大家都叫她小红帽…”,
“audio”: “audio/little_red_riding_hood.mp3”
},
2: {
“text”: “从前有一个勇敢的王子,他踏上了拯救公主的征程…”,
“audio”: “audio/brave_prince.mp3”
},
3: {
“text”: “从前有一个神奇的魔法师,他拥有无穷的魔力…”,
“audio”: “audio/magical_wizard.mp3”
},
}
def play_story():
# 获取选中的故事编号
selected_story = story_listbox.curselection()
if selected_story:
story_id = story_listbox.get(selected_story[0])
story_data = story_library[int(story_id)]
# 播放故事音频
audio = AudioSegment.from_file(story_data["audio"])
play(audio)
def show_story_text():
# 获取选中的故事编号
selected_story = story_listbox.curselection()
if selected_story:
story_id = story_listbox.get(selected_story[0])
story_data = story_library[int(story_id)]
# 显示故事文本内容
story_text.config(state=tk.NORMAL)
story_text.delete("1.0", tk.END)
story_text.insert(tk.END, story_data["text"])
story_text.config(state=tk.DISABLED)
创建主窗口
window = tk.Tk()
window.title(“有声中文故事书V1.0.1”)
创建故事列表框
story_listbox = tk.Listbox(window)
story_listbox.pack(pady=10)
向故事列表框添加故事
for story_id in story_library:
story_listbox.insert(tk.END, str(story_id))
创建播放按钮
play_button = ttk.Button(window, text=“播放”, command=play_story)
play_button.pack(pady=5)
创建文本框,用于显示故事文本内容
story_text = tk.Text(window, height=10, width=40)
story_text.pack()
创建显示故事文本按钮
show_text_button = ttk.Button(window, text=“显示文本”, command=show_story_text)
show_text_button.pack(pady=5)
运行主循环
window.mainloop()
在这个示例代码中,我们将`tkinter.Button`替换为`ttk.Button`,以创建一个更具有现代感的按钮。其他部分保持不变。
通过使用`tkinter.ttk`,你可以根据需要进一步定制界面的外观和样式,例如使用不同的主题、调整颜色和字体等。
### 十三、多语言支持示例代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/96d64cd4e2134042970d1e512ceb80f6.png)要实现多语言支持,你可以使用`gettext`模块来处理文本翻译。以下是一个示例代码,演示了如何在`tkinter`应用程序中添加多语言支持:
import tkinter as tk
from tkinter import ttk
from pydub import AudioSegment
from pydub.playback import play
import gettext
设置语言环境
lang = “en_US” # 默认语言为英语
translation = gettext.translation(“messages”, localedir=“locales”, languages=[lang])
translation.install()
故事库
story_library = {
1: {
“text”: _(“Once upon a time, there was a little girl named Little Red Riding Hood…”),
“audio”: “audio/little_red_riding_hood.mp3”
},
2: {
“text”: _(“Once upon a time, there was a brave prince who embarked on a journey to rescue a princess…”),
“audio”: “audio/brave_prince.mp3”
},
3: {
“text”: _(“Once upon a time, there was a magical wizard who possessed infinite powers…”),
“audio”: “audio/magical_wizard.mp3”
},
}
def play_story():
# 获取选中的故事编号
selected_story = story_listbox.curselection()
if selected_story:
story_id = story_listbox.get(selected_story[0])
story_data = story_library[int(story_id)]
# 播放故事音频
audio = AudioSegment.from_file(story_data["audio"])
play(audio)
def show_story_text():
# 获取选中的故事编号
selected_story = story_listbox.curselection()
if selected_story:
story_id = story_listbox.get(selected_story[0])
story_data = story_library[int(story_id)]
# 显示故事文本内容
story_text.config(state=tk.NORMAL)
story_text.delete("1.0", tk.END)
story_text.insert(tk.END, story_data["text"])
story_text.config(state=tk.DISABLED)
创建主窗口
window = tk.Tk()
window.title(_(“Story Book”))
创建故事列表框
story_listbox = tk.Listbox(window)
story_listbox.pack(pady=10)
向故事列表框添加故事
for story_id in story_library:
story_listbox.insert(tk.END, str(story_id))
创建播放按钮
play_button = ttk.Button(window, text=_(“Play”), command=play_story)
play_button.pack(pady=5)
创建文本框,用于显示故事文本内容
story_text = tk.Text(window, height=10, width=40)
story_text.pack()
创建显示故事文本按钮
show_text_button = ttk.Button(window, text=_(“Show Text”), command=show_story_text)
show_text_button.pack(pady=5)
运行主循环
window.mainloop()
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!