传奇开心果微博系列
- 系列微博目录
- Python微项目技术点案例示例系列
- 微博目录
- 一、微项目目标和背景
- 二、雏形示例代码
- 三、扩展思路
- 四、用户自定义输入示例代码
- 五、故事选择示例代码
- 六、语音控制示例代码
- 七、播放控制示例代码
- 八、文本转换语音示例代码
- 九、微项目雏形核心部分示例代码
- 十、添加音效和背景音乐示例代码
- 十一、创建图形界面示例代码
- 十二、使用tkinter.ttk重写更加漂亮美观的图形化界面
- 十三、多语言支持示例代码
系列微博目录
Python微项目技术点案例示例系列
微博目录
一、微项目目标和背景
现在听读博文很火,特别是用有声故事书听故事更是小朋友晚上睡觉前的最爱,小朋友听着听着就进入了甜蜜的梦乡。于是我就有了自己弄个有声读物的念头。要使用Python实现中文有声故事书,你可以使用文本转语音(Text-to-Speech,TTS)库来将故事文本转换为语音。然后使用百度AI开放平台的语音合成接口实现中文有声故事书。
二、雏形示例代码
以下是一个实现步骤和示例代码:
首先,你需要安装百度AI开放平台的Python SDK,可以使用以下命令安装:
pip install baidu-aip
然后,你需要在百度AI开放平台注册并创建一个应用,获取到API Key和Secret Key。将这些信息填入代码中的相应位置。
接着完成示例代码,如下所示:
from aip import AipSpeech
# 设置百度AI开放平台的API Key和Secret Key
APP_ID = 'your_app_id'
API_KEY = 'your_api_key'
SECRET_KEY = 'your_secret_key'
# 创建AipSpeech对象
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 故事文本
story_text = """
这是一个中文故事的文本
你可以在这里添加你的故事内容。
"""
# 将故事文本转换为语音
result = client.synthesis(story_text, 'zh', 1, {
'vol': 5, # 音量,取值范围 0-15,默认为 5
'spd': 5, # 语速,取值范围 0-9,默认为 5
'pit': 5, # 音调,取值范围 0-9,默认为 5
'per': 4 # 发音人选择,0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为0
})
# 将语音保存到文件
if not isinstance(result, dict):
with open('story.mp3', 'wb') as f:
f.write(result)
print('故事已保存为 story.mp3 文件。')
else:
print('语音合成失败:', result)
在上述代码中,首先导入了AipSpeech
类,然后设置了API Key和Secret Key。接下来,定义了故事的文本内容,并使用client.synthesis
方法将文本转换为语音。最后,将语音保存为story.mp3
文件。
请注意,上述代码使用的是百度AI开放平台的语音合成接口,你需要替换为自己的API Key和Secret Key。此外,你还可以根据需要调整音量、语速、音调和发音人等参数。
最后你可以将故事文本放入代码示例中进行语音合成,生成《小红帽》的中文有声故事书。
以下是《小红帽》的中文故事文本示例:
从前有一个小女孩,大家都叫她小红帽,因为她总是戴着一顶红色的帽子。有一天,小红帽的妈妈给她准备了一篮子好吃的东西,让她送给奶奶。
小红帽高高兴兴地拿着篮子,踏上了去奶奶家的路。她要穿过一片大森林才能到达奶奶家。在森林里,她遇到了一只大灰狼。
“你好,小红帽,你要去哪里?”灰狼问道。
“我要去奶奶家,给她送东西。”小红帽回答道。
灰狼咧嘴一笑,心想:“这是个好机会。”于是,他悄悄地跑到奶奶家,先把奶奶吃掉了,然后穿上奶奶的衣服躺在床上。
不久,小红帽来到了奶奶家。她敲了敲门,灰狼装作奶奶的声音说:“进来吧。”
小红帽推开门,走进了屋子。她看到奶奶躺在床上,但是奶奶看起来有些奇怪。“奶奶,你为什么有这么大的眼睛?”小红帽问道。
“为了更好地看你,我的孩子。”灰狼回答道。
“奶奶,你为什么有这么大的耳朵?”小红帽又问道。
“为了更好地听你,我的孩子。”灰狼继续回答道。
“奶奶,你为什么有这么大的牙齿?”小红帽又问道。
“为了更好地吃你!”灰狼一下子扑了出来,想要吃掉小红帽。
但是,就在这时,一位好心的猎人经过奶奶家,听到了小红帽的尖叫声。他赶紧冲进屋子,用枪把灰狼打死了。
小红帽和奶奶都非常感激猎人的帮助。从那以后,小红帽学会了更加小心,不再随便相信陌生人。她明白了,要保护自己和身边的人,就要保持警惕。
故事讲完了,小朋友们都很喜欢听,他们明白了小红帽的经历给他们的启示:在面对陌生人时要保持警惕,不要随便相信别人。
三、扩展思路
当你已经实现了基本的中文有声故事书功能后,你可以进一步扩展代码以提供更多的功能和交互性。以下是一些扩展思路:
-
用户输入:允许用户输入故事文本,可以通过终端输入或者读取文本文件的方式获取故事内容。这样用户可以根据自己的需求输入不同的故事。
-
故事选择:提供一个故事列表或分类,让用户可以选择他们想要听的故事。你可以创建一个故事库,将不同的故事存储在其中,并根据用户选择播放相应的故事。
-
语音控制:引入语音识别功能,让用户可以通过语音命令控制故事的播放。例如,用户可以说出“下一个”来播放下一篇故事,或者说出“停止”来停止故事的播放。
-
播放控制:提供基本的播放控制功能,例如暂停、继续、快进、快退等。你可以使用音频处理库来实现这些功能,例如
pydub
或pygame
。 -
音效和背景音乐:为故事添加音效和背景音乐,增强故事的表现力。你可以使用音频处理库来混合音频文件,将故事的语音和音效/背景音乐合成在一起。
-
图形界面:创建一个图形用户界面(GUI),使用户可以更直观地选择故事、控制播放,并显示故事的文本内容。你可以使用GUI库,例如
Tkinter
、PyQt
或wxPython
。 -
多语言支持:除了中文,你还可以通过修改语音合成的参数和使用其他语言的TTS库,实现其他语言的有声故事书。
-
保存和分享:允许用户保存故事的语音文件,并提供分享功能,让用户可以将故事分享给其他人。
这些扩展思路可以根据你的需求和技术能力进行实现。记得在扩展代码时保持良好的代码组织和模块化,这样可以更容易地添加新功能或进行维护。祝你成功实现更多功能丰富的中文有声故事书!
四、用户自定义输入示例代码
下面是一个示例代码,演示如何通过终端输入或读取文本文件的方式获取用户输入的故事文本:
def get_story_from_user():
print("请输入故事文本(以空行结束):")
lines = []
while True:
line = input()
if line.strip() == "":
break
lines.append(line)
story = "\n".join(lines)
return story
def get_story_from_file(filename):
with open(filename, "r", encoding="utf-8") as file:
story = file.read()
return story
# 通过终端输入获取故事文本
user_story = get_story_from_user()
print("用户输入的故事文本:")
print(user_story)
# 通过读取文本文件获取故事文本
file_story = get_story_from_file("story.txt")
print("从文件中读取的故事文本:")
print(file_story)
在这个示例代码中,我们定义了两个函数:get_story_from_user()
和 get_story_from_file(filename)
。get_story_from_user()
函数通过终端输入的方式获取用户输入的故事文本,用户可以逐行输入故事内容,以空行结束输入。get_story_from_file(filename)
函数通过读取文本文件的方式获取故事文本,传入文件名作为参数。
你可以根据需要选择其中一种方式来获取故事文本。在示例代码中,我们分别演示了从终端输入和从文本文件读取故事文本的情况,并将获取到的故事文本打印出来。
你可以根据这个示例代码,将 user_story
或 file_story
作为输入,传递给语音合成接口,生成对应的语音文件。
五、故事选择示例代码
下面是一个示例代码,演示如何创建一个故事库并提供故事选择功能:
class StoryLibrary:
def __init__(self):
self.stories = {
"1": "从前有一个小女孩,大家都叫她小红帽...",
"2": "从前有一个勇敢的小木偶,他叫匹诺曹...",
"3": "从前有一个国王,他非常喜欢音乐...",
# 添加更多故事...
}
def get_story(self, story_id):
return self.stories.get(story_id)
def display_story_menu(story_library):
print("请选择要听的故事:")
for story_id in story_library.stories:
print(f"{story_id}: 故事 {story_id}")
print("0: 退出")
print()
def play_story(story_library):
while True:
display_story_menu(story_library)
choice = input("请输入故事编号:")
if choice == "0":
print("谢谢使用,再见!")
break
story = story_library.get_story(choice)
if story:
print("正在播放故事:")
print(story)
# 调用语音合成接口,将故事转换为语音并播放
# 播放代码...
print("故事播放完毕!")
else:
print("无效的故事编号,请重新选择。")
# 创建故事库对象
story_library = StoryLibrary()
# 播放故事
play_story(story_library)
在这个示例代码中,我们创建了一个 StoryLibrary
类来表示故事库。在故事库中,我们使用字典来存储不同故事的编号和内容。每个故事都有一个唯一的编号,用户可以通过输入编号来选择要听的故事。
display_story_menu()
函数用于显示故事选择菜单,遍历故事库中的故事,并打印出每个故事的编号和标题。
play_story()
函数是主要的播放故事功能。它使用一个循环来接受用户的选择,并根据选择播放相应的故事。当用户输入 0
时,循环结束,程序退出。
在示例代码中,我们只是打印故事的内容,你可以根据需要调用语音合成接口,将故事转换为语音并播放。
你可以根据这个示例代码,创建一个故事库对象,并添加不同的故事。然后,用户可以根据故事编号选择要听的故事。
六、语音控制示例代码
要实现语音控制功能,你需要使用语音识别和语音合成两个API。语音识别API将用户的语音命令转换为文本,然后你可以根据文本来控制故事的播放。语音合成API将故事文本转换为语音,进行播放。
由于语音识别和语音合成API的具体实现可能因供应商而异,我无法直接提供完整的示例代码。不过,我可以给你一个整体的思路,帮助你实现这个功能。
-
集成语音识别API:首先,你需要选择一个语音识别API供应商,并按照他们的文档进行集成。API供应商通常会提供相应的Python库和示例代码。你需要将用户的语音输入传递给语音识别API,并获取识别结果(文本)。
-
解析语音命令:获取到语音识别的文本后,你需要解析用户的语音命令。例如,如果用户说出“下一个”,你可以解析出对应的指令。
-
控制故事播放:根据用户的语音命令,你可以执行相应的操作来控制故事的播放。例如,如果用户说出“下一个”,你可以播放下一篇故事;如果用户说出“停止”,你可以停止故事的播放。
-
集成语音合成API:当你需要播放故事时,你需要将故事文本传递给语音合成API,生成对应的语音文件。然后,你可以使用适当的库或工具来播放生成的语音文件。
下面是一个简单的示例代码,演示了如何使用语音识别和语音合成API的框架:
import speech_recognition as sr
import pyttsx3
def recognize_speech():
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("请说出您的命令:")
audio = recognizer.listen(source)
try:
text = recognizer.recognize_google(audio, language="zh-CN")
return text
except sr.UnknownValueError:
print("无法识别语音")
except sr.RequestError:
print("无法连接到语音识别服务")
return ""
def play_story(story_text):
engine = pyttsx3.init()
engine.setProperty("rate", 150)
engine.say(story_text)
engine.runAndWait()
def process_command(command):
# 解析语音命令并执行相应的操作
if "下一个" in command:
print("播放下一篇故事")
# 播放下一篇故事的代码...
elif "停止" in command:
print("停止故事播放")
# 停止故事播放的代码...
else:
print("无效的命令")
# 主循环
while True:
command = recognize_speech()
print("识别到的命令:", command)
process_command(command)
在这个示例代码中,我们使用了 speech_recognition
库来实现语音识别,并使用 pyttsx3
库来实现语音合成。你需要安装这两个库,并按照它们的文档进行配置和使用。
recognize_speech()
函数用于进行语音识别,它使用麦克风作为音频源,将用户的语音命令转换为文本。
play_story()
函数用于播放故事,它使用 pyttsx3
库来将故事文本转换为语音并播放。
process_command()
函数用于解析语音命令并执行相应的操作。在示例代码中,我们只是简单地判断命令中是否包含特定关键词,并打印相应的信息。你可以根据需要扩展该函数,实现更复杂的控制逻辑。
在主循环中,我们不断进行语音识别,并根据识别到的命令调用 process_command()
函数来执行相应的操作。
请注意,这只是一个基本的框架示例,实际的实现可能因具体的语音识别和语音合成API而有所不同。你需要根据你选择的API供应商的文档进行集成和调整。
七、播放控制示例代码
以下是整合了之前的代码和添加了快进和快退功能的示例代码:
from pydub import AudioSegment
from pydub.playback import play
from pynput import keyboard
# 全局变量,用于控制播放状态和当前位置
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
else:
resume()
is_playing = True
elif key == keyboard.Key.right:
fast_forward()
elif key == keyboard.Key.left:
rewind()
except AttributeError:
pass
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()
函数将播放位置设置为新的位置。
请注意,这只是一个示例代码,实际的实现可能因具体的音频处理库和播放器而有所不同。你需要根据你选择的库和播放器的文档进行集成和调整。
八、文本转换语音示例代码
当你需要将故事文本传递给语音合成API并生成对应的语音文件时,你可以按照以下步骤进行操作:
-
选择一个适合你的语音合成API。常见的语音合成API包括Google Text-to-Speech、Microsoft Azure Speech、IBM Watson Text to Speech等。你需要在相应的API提供商网站上注册账号并获取API密钥或凭据。
-
安装相应的Python库或SDK,以便与所选的语音合成API进行集成。不同的API可能有不同的Python库或SDK可供使用。你可以查阅所选API的文档以获取详细的集成指南和示例代码。
-
在你的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等。你可以选择适合你需求的库,并根据其文档来实现播放功能。
九、微项目雏形核心部分示例代码
以下是一个完整的示例代码,包括故事库、故事选择、语音合成、语音播放、基本的播放控制功能和语音识别的集成:
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
这个示例代码整合了之前的代码,并在主循环中添加了语音识别的功能。它包括故事库、故事选择、语音合成、语音播放、基本的播放控制功能和语音识别的集成。你可以根据需要进行修改和扩展。
请注意,实际的语音识别功能需要安装SpeechRecognition
库,并根据需要配置适当的语音识别引擎。在示例代码中,我们使用了Google的语音识别引擎。
十、添加音效和背景音乐示例代码
要为故事添加音效和背景音乐,你可以使用音频处理库,如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
方法将它们混合在一起。最后,我们播放混合后的音频。
请确保将音效文件和背景音乐文件放在正确的路径下,并根据实际情况修改文件路径。
十一、创建图形界面示例代码
以下是一个使用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重写更加漂亮美观的图形化界面
使用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
,你可以根据需要进一步定制界面的外观和样式,例如使用不同的主题、调整颜色和字体等。
十三、多语言支持示例代码
要实现多语言支持,你可以使用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()
在这个示例代码中,我们使用gettext
模块来处理文本翻译。首先,我们设置默认语言为英语(en_US
),然后使用gettext.translation
函数加载翻译文件。翻译文件通常存储在locales
目录下,根据不同的语言环境创建对应的翻译文件。在story_library
中的文本内容使用_()
函数进行翻译。
你需要根据实际情况创建对应的翻译文件,并将其放置在locales
目录下。例如,对于英语,可以创建一个名为en_US.po
的翻译文件,并将其放置在locales/en_US/LC_MESSAGES
目录下。翻译文件的格式是.po
文件,你可以使用工具如gettext
来编辑和管理翻译文件。
希望这个示例代码帮助你实现多语言支持!