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

news2024/11/26 15:37:38

传奇开心果微博系列

  • 系列微博目录
    • 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。此外,你还可以根据需要调整音量、语速、音调和发音人等参数。
最后你可以将故事文本放入代码示例中进行语音合成,生成《小红帽》的中文有声故事书。

以下是《小红帽》的中文故事文本示例:

从前有一个小女孩,大家都叫她小红帽,因为她总是戴着一顶红色的帽子。有一天,小红帽的妈妈给她准备了一篮子好吃的东西,让她送给奶奶。

小红帽高高兴兴地拿着篮子,踏上了去奶奶家的路。她要穿过一片大森林才能到达奶奶家。在森林里,她遇到了一只大灰狼。

“你好,小红帽,你要去哪里?”灰狼问道。

“我要去奶奶家,给她送东西。”小红帽回答道。

灰狼咧嘴一笑,心想:“这是个好机会。”于是,他悄悄地跑到奶奶家,先把奶奶吃掉了,然后穿上奶奶的衣服躺在床上。

不久,小红帽来到了奶奶家。她敲了敲门,灰狼装作奶奶的声音说:“进来吧。”

小红帽推开门,走进了屋子。她看到奶奶躺在床上,但是奶奶看起来有些奇怪。“奶奶,你为什么有这么大的眼睛?”小红帽问道。

“为了更好地看你,我的孩子。”灰狼回答道。

“奶奶,你为什么有这么大的耳朵?”小红帽又问道。

“为了更好地听你,我的孩子。”灰狼继续回答道。

“奶奶,你为什么有这么大的牙齿?”小红帽又问道。

“为了更好地吃你!”灰狼一下子扑了出来,想要吃掉小红帽。

但是,就在这时,一位好心的猎人经过奶奶家,听到了小红帽的尖叫声。他赶紧冲进屋子,用枪把灰狼打死了。

小红帽和奶奶都非常感激猎人的帮助。从那以后,小红帽学会了更加小心,不再随便相信陌生人。她明白了,要保护自己和身边的人,就要保持警惕。

故事讲完了,小朋友们都很喜欢听,他们明白了小红帽的经历给他们的启示:在面对陌生人时要保持警惕,不要随便相信别人。

三、扩展思路

在这里插入图片描述当你已经实现了基本的中文有声故事书功能后,你可以进一步扩展代码以提供更多的功能和交互性。以下是一些扩展思路:

  1. 用户输入:允许用户输入故事文本,可以通过终端输入或者读取文本文件的方式获取故事内容。这样用户可以根据自己的需求输入不同的故事。

  2. 故事选择:提供一个故事列表或分类,让用户可以选择他们想要听的故事。你可以创建一个故事库,将不同的故事存储在其中,并根据用户选择播放相应的故事。

  3. 语音控制:引入语音识别功能,让用户可以通过语音命令控制故事的播放。例如,用户可以说出“下一个”来播放下一篇故事,或者说出“停止”来停止故事的播放。

  4. 播放控制:提供基本的播放控制功能,例如暂停、继续、快进、快退等。你可以使用音频处理库来实现这些功能,例如pydubpygame

  5. 音效和背景音乐:为故事添加音效和背景音乐,增强故事的表现力。你可以使用音频处理库来混合音频文件,将故事的语音和音效/背景音乐合成在一起。

  6. 图形界面:创建一个图形用户界面(GUI),使用户可以更直观地选择故事、控制播放,并显示故事的文本内容。你可以使用GUI库,例如TkinterPyQtwxPython

  7. 多语言支持:除了中文,你还可以通过修改语音合成的参数和使用其他语言的TTS库,实现其他语言的有声故事书。

  8. 保存和分享:允许用户保存故事的语音文件,并提供分享功能,让用户可以将故事分享给其他人。

这些扩展思路可以根据你的需求和技术能力进行实现。记得在扩展代码时保持良好的代码组织和模块化,这样可以更容易地添加新功能或进行维护。祝你成功实现更多功能丰富的中文有声故事书!

四、用户自定义输入示例代码

在这里插入图片描述
下面是一个示例代码,演示如何通过终端输入或读取文本文件的方式获取用户输入的故事文本:

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_storyfile_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的具体实现可能因供应商而异,我无法直接提供完整的示例代码。不过,我可以给你一个整体的思路,帮助你实现这个功能。

  1. 集成语音识别API:首先,你需要选择一个语音识别API供应商,并按照他们的文档进行集成。API供应商通常会提供相应的Python库和示例代码。你需要将用户的语音输入传递给语音识别API,并获取识别结果(文本)。

  2. 解析语音命令:获取到语音识别的文本后,你需要解析用户的语音命令。例如,如果用户说出“下一个”,你可以解析出对应的指令。

  3. 控制故事播放:根据用户的语音命令,你可以执行相应的操作来控制故事的播放。例如,如果用户说出“下一个”,你可以播放下一篇故事;如果用户说出“停止”,你可以停止故事的播放。

  4. 集成语音合成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并生成对应的语音文件时,你可以按照以下步骤进行操作:

  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等。你可以选择适合你需求的库,并根据其文档来实现播放功能。

九、微项目雏形核心部分示例代码

在这里插入图片描述以下是一个完整的示例代码,包括故事库、故事选择、语音合成、语音播放、基本的播放控制功能和语音识别的集成:

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_effectbackground_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来编辑和管理翻译文件。
在这里插入图片描述
希望这个示例代码帮助你实现多语言支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1451131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

情人节到了,写一份爱心程序(python)

前言 情人节到了,写一份爱心代码给喜欢的人呀 公式 首先我们介绍下爱心的公式的参数方程: x 16 s i n 3 ( t ) x 16sin^3(t) x16sin3(t) y 13 c o s ( t ) − 5 c o s ( 2 t ) − 2 c o s ( 3 t ) − c o s ( 4 t ) y 13cos(t) - 5cos(2t) - 2co…

K8S集群实践之十:虚拟机部署阶段性总结

目录 1. 说明: 2. 安装准备 2.1 每个节点设置双网卡,一卡做网桥(外部访问),一卡做NAT(集群内网访问) 2.2 准备一个可用的代理服务器 3. 由于虚拟机崩溃(停电,宿主机…

谁拿了最多奖学金——NOIP 2005 提高组

输入样例&#xff1a; 4 YaoLin 87 82 Y N 0 ChenRuiyi 88 78 N Y 1 LiXin 92 88 N N 0 ZhangQin 83 87 Y N 1 输出样例&#xff1a; ChenRuiyi 9000 28700 这道题用结构体做对吧 #include <bits/stdc.h> using namespace std; class student{public:string name;int FG…

微信小程序框架阐述

目录 一、框架 响应的数据绑定 页面管理 基础组件 丰富的 API 二、逻辑层 App Service 小程序的生命周期 注册页面 使用 Page 构造器注册页面 在页面中使用 behaviors 使用 Component 构造器构造页面 页面的生命周期 页面路由 页面栈 路由方式 注意事项 模块化…

Java的异常体系

一、体系简介 java中的Exception类的子类不仅仅只是像上图所示只包含IOException和RuntimeException这两大类&#xff0c;事实上Exception的子类很多很多&#xff0c;主要可概括为&#xff1a;运行时异常与非运行时异常。 在上述体系中&#xff0c;Error表示严重的系统错误&am…

C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;二&#xff09;】 1、结构化程序设计结构化程序设计的不足 2、面向对象的程序设计2.1、面向对象的程序设计2.2、从客观事物抽象出类2.3、对象的内存分配2.4、对象之间的运算2.5、使用类的成员变量和成员函数用法1&#x…

optee UTA加载

流程 动态TA按照存储位置的不同分为REE filesystem TA&#xff1a;存放在REE侧文件系统里的TA&#xff1b; Early TA&#xff1a;被嵌入到optee os里的在supplicant启动之前就可用了。 这里我们讲的是常规的存放在REE侧文件系统里的TA。 通过GP标准调用的与TA通信的命令(opens…

C语言学习day14:数组定义和使用

定义变量&#xff1a; 数据类型 变量 值 数组定义&#xff1a; 数据类型 数组名[元素个数]{值1,值2,值3} 代码&#xff1a; int main() {//定义变量//数据类型 变量 值//数组定义//数据类型 数组名[元素个数]{值1,值2,值3}//数组下标 数组名[小标]//数组下标是…

Java学习第十五节之回顾方法的调用

方法的调用 package oop;public class Demo03 {public static void main(String[] args) {//实际参数和形式参数的类型要对应&#xff01;int add Demo03.add(1,2);System.out.println(add);}public static int add(int a,int b){return ab;}}package oop;//值传递 public cl…

列表推导式与生成表达式的区别

列表推导式与生成式表达式的区别&#xff1a; 列表推导式 res[i for i in range(6)] print(res) 结果&#xff1a; [0, 1, 2, 3, 4, 5] 生成表达式&#xff1a; res(i for i in range(6)) print(res) 结果&#xff1a; <generator object <genexpr> at 0x0000013EAD0…

mathtype公式

Mathtype 手写板 Win11手写板按钮灰色问题解决&#xff1a;在C:\Program Files\Common Files\microsoft shared\ink目录下粘贴mip.exe&#xff0c;C:\Program Files\Common Files\microsoft shared\ink\en-US目录下添加mip.exe.mui提取码y04v 公式识别 配合免费图片公式识别…

【MySQL】:DQL查询

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DQL1.1 基本语法1.2 基础查询1.3 条件查询1.3 聚合函数 &#x1f324;️ 全篇…

IO流---字节输入输出流,字符输入输出流

IO流概述 IO流&#xff0c;即输入输出流&#xff08;Input Output Stream&#xff09;&#xff0c;是一种抽象概念&#xff0c;用来处理设备之间的数据传输问题&#xff0c;例如文件复制、文件上传、文件下载等。在Java中&#xff0c;对数据的操作通常是通过流的方式进行的&…

qml中解决Page控件头部元素Margin不生效的问题

0、想要的效果 1、问题描述 经测试&#xff1a;Page的头部无法完美的进行左右边距设置&#xff0c;leftMargin可以&#xff0c;rightMargin不可以。。。。 Page {// ...header: Frame {id: headerheight: 70// 必须首先锚定位&#xff0c;然后设置边距才生效padding: 0anchor…

轻松掌握Jenkins执行远程window的Jmeter接口脚本

Windows环境&#xff1a;10.1.2.78 新建与配置节点 【系统管理】—【管理节点】—【新建节点】输入节点名称&#xff0c;勾选“dumb slave”&#xff0c;点击ok 按如上配置&#xff1a; 说明&#xff1a; Name&#xff1a;定义slave的唯一名称标识&#xff0c;可以是任意字…

【动态规划】【记忆化搜索】【状态压缩】1681. 最小不兼容性

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 状态压缩 记忆化搜索 1681. 最小不兼容性 给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中&#xff0c;使得同一…

函数式编程的技巧

14.1.2 科里化 给出科里化的理论定义之前&#xff0c;让我们先来看一个例子。应用程序通常都会有国际化的需求将一套单位转换到另一套单位是经常碰到的问题。 单位转换通常都会涉及转换因子以及基线调整因子的问题。比如&#xff0c;将摄氏度转换到华氏度的公式是CtoF(x)x*9/…

(2024|ICLR,SVD,软加权正则化,推理时文本嵌入优化)文本到图像扩散模型的图像内容抑制

Get What You Want, Not What You Dont- Image Content Suppression for Text-to-Image Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. 方…

IIC--集成电路总线

目录 一、IIC基础知识 1、设计IIC电路的原因&#xff1a; 2、上拉电阻阻值怎么确定 3、IIC分类 4、IIC协议 二、单片机使用IIC读写数据 1、 IIC发送一个字节数据&#xff1a; 2、IIC读取一个字节数据&#xff1a; 一、IIC基础知识 1、设计IIC电路的原因&#xff1a; (…

【JavaEE】_Fiddler抓包HTTP请求与响应

目录 1. Fiddler简介 2. Fiddler安装步骤 3. 抓包结果举例&#xff08;sogou.com&#xff09; 1. Fiddler简介 1. 要查看HTTP的请求和响应&#xff0c;需要使用抓包工具进行抓包&#xff1b; 抓包即获取网卡上经过的数据并显示出来&#xff0c;常用的抓包工具有wireshark和…