第五篇【传奇开心果系列】Python微项目技术点案例示例:中文有声故事书

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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值