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

传奇开心果微博系列

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】操作库 —— 表的操作 -- 详解

一、增加表 1、创建表 mysql> create database [if not exists] table_name ( -> field1 datatype, -> field2 datatype, -> field3 datatype -> ) character set 字符集 collate 校验规则 engine 存储引擎; 注意 :最后一行也可以写成&#x…

枚举知识点解析

枚举是什么?枚举就是列举, 将东西一一列举出来。 生活中有许多地方需要用到枚举, 比如一年有12个月,一星期有7天, 这些都需要进行枚举。 那么, 如何进行枚举的定义呢? 如下 枚举中的值是一种…

【教3妹学编程-算法题】将数组分成最小总代价的子数组 I

2哥 : 叮铃铃,3妹,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。 3妹:切,我妈张罗着要给我相亲呢。 2哥 : 相亲?哈哈哈哈 3妹:别笑了,我妈说跟我年龄相等的人都已经孩子上小…

BossPlayerCTF

靶场环境问题 靶场下载之后,可能会出现扫描不到IP的情况,需要进行调整,参考: Vulnhub靶机检测不到IP地址_vulnhub靶机nmap扫不到-CSDN博客 该靶机没有vim,需要使用vi命令去修改;改成当前网卡即可&#x…

【QT+QGIS跨平台编译】之四十:【gsl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、GSL介绍二、GSL下载三、文件分析四、pro文件五、编译实践一、GSL介绍 GSL(GNU Scientific Library)是一个开源的数值计算库,用于提供一系列常用的数学函数和算法。它为科学计算和数据分析提供了高效、可靠的工具。 GSL库提供了丰富的功能,包括数值积分、数值…

[职场] 事业单位医疗岗常见的面试题目 #微信#微信#微信

事业单位医疗岗常见的面试题目 面试是步入社会以及就业过程中必须经历的一个首要阶段,也是实现就业必经的之道,可以说面试是双向选择和考试考核评价的过程,是企业选择应聘者的同时也应聘者也在选择企业。 一.常见的面试题目 1.对医学基础知…

每日OJ题_递归②_力扣21. 合并两个有序链表

目录 力扣21. 合并两个有序链表 解析代码 力扣21. 合并两个有序链表 21. 合并两个有序链表 难度 简单 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4]…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第二套(完善程序题)

CCF认证CSP-J入门组模拟测试题第二套 三、完善程序题 第一题 菲波拉契数列 菲波拉契数列为1,1,2,3,5,8,13,21,…,其元素产生的规则是前两个数为1,从第三个数开始每个数等于它前面两个数之和。已知任意一个正整数可以表示为若干个互不相同的菲波拉契数之和。例如:3621132。 …

图像处理之《寻找和隐藏:通过深度强化学习的对抗隐写术》论文阅读

一、文章摘要 图像隐写术的目的是将一个完整大小的图像(称为秘密)隐藏到另一个图像(称为封面)中。以往的图像隐写算法只能在一个封面中隐藏一个秘密。在这篇论文中,我们提出了一个自适应局部图像隐写(AdaSteg)系统,允许缩放和位置自适应图像隐写。该系统…

2024.2.14

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…

【无标题】Matlab 之axes函数——创建笛卡尔坐标区

**基本用法&#xff1a;**axes 在当前图窗中创建默认的笛卡尔坐标区&#xff0c;并将其设置为当前坐标区。 应用场景1&#xff1a;在图窗中放置两个 Axes 对象&#xff0c;并为每个对象添加一个绘图。 要求1&#xff1a;指定第一个 Axes 对象的位置&#xff0c;使其左下角位于…

【AIGC】Stable Diffusion的ControlNet插件

ControlNet 介绍 ControlNet 插件是 Stable Diffusion 中的一个重要组件&#xff0c;用于提供对模型的控制和调整。以下是 ControlNet 插件的主要特点和功能&#xff1a; 模型控制&#xff1a; ControlNet 允许用户对 Stable Diffusion 中的模型进行精细的控制和调整。用户可以…

单片机学习笔记---LCD1602功能函数代码

目录 LCD1602.c 模拟写指令的时序 模拟写数据的时序 初始化 显示字符 显示字符串 显示数字 显示有符号的数字 显示16进制数字 显示二进制数 LCD1602.h main.c 上一篇讲了LCD1602的工作原理&#xff0c;这一节开始代码演示&#xff01; 新创建工程&#xff1a;LCD1…

Linux内核-时间子系统(时钟中断)专题汇总

文章目录 概要一、专题汇总1.1、优秀系列博文1.2、时间子系统1.3、高精度定时器hrtimer1.4、RTC硬件芯片驱动 概要 中断机制是计算机系统的重要组成部分&#xff0c;在Linux中也不例外&#xff0c;中断按照来源分为硬中断和软中断&#xff0c;而硬中断根据硬件范围分为外中断和…

MySQL数据库基础(一):数据库概述

文章目录 数据库概述 一、数据库介绍 二、数据库分类 1、关系型数据库 2、非关系型数据库NoSQL 三、常见数据库介绍 1、关系型数据库 2、非关系型数据库 数据库概述 一、数据库介绍 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;按照特定的…

AI算法参数个数本身优化空间

一、背景 AI算法的参数数量并非越多越好&#xff0c;也不是越少越好。参数的数量与模型的复杂度密切相关&#xff1a; 1. 参数多&#xff08;高复杂度模型&#xff09;&#xff1a; - 优点&#xff1a;模型具有更强的表达能力和拟合能力&#xff0c;对于复杂的、非线性的数据分…

Backtrader 文档学习- Plotting -Plotting on the same axis

Backtrader 文档学习- Plotting -Plotting on the same axis 1.概述 在同一轴上绘图&#xff0c;绘图是在同一空间上绘制原始数据和稍微(随机)修改的数据&#xff0c;但不是在同一轴上。 核心代码&#xff0c;data数据正负50点。 # The filter which changes the close pri…

PR:视频编辑播放速度技巧

想要视频片段加速或者减速&#xff0c;可以在片段上右击&#xff0c;选择“速度/持续时间...” 速度&#xff1a;可以更改百分比&#xff0c;如改成200%就是加速一倍&#xff0c;改成50%就是减速一倍。 注&#xff1a;如果源视频是正常速度录制的&#xff0c;比如每秒25帧&…

npm使用国内淘宝镜像(最新地址)

目录 前言 一、命令配置 二、使用cnpm安装 三、常见包地址 四、总结 往期回顾 前言 我们前端程序员在使用国外的镜像源速度很慢并且容易下载失败&#xff0c;有时候需要尝试多次才有可能下载成功&#xff0c;很麻烦&#xff0c;但是可以切换为国内镜像源&#xff0c;下…

Docker 在window 2024版笔记 下载 安装 操作 配置

---Docker 前言--- Docker windows版官方版是一款专业开源的应用容器引擎&#xff0c;可以加快用户构建、共享和运行现代应用程序的速度&#xff0c;支持运行Linux和Windows Docker容器。 Docker 在容器的基础上&#xff0c;进行了进一步的封装&#xff0c;从文件系统、网络互…