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

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


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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


### 三、扩展思路


![在这里插入图片描述](https://img-blog.csdnimg.cn/ebb0fc9a4d574a8286f1aa8d3197b1c9.jpg)当你已经实现了基本的中文有声故事书功能后,你可以进一步扩展代码以提供更多的功能和交互性。以下是一些扩展思路:


1. 用户输入:允许用户输入故事文本,可以通过终端输入或者读取文本文件的方式获取故事内容。这样用户可以根据自己的需求输入不同的故事。
2. 故事选择:提供一个故事列表或分类,让用户可以选择他们想要听的故事。你可以创建一个故事库,将不同的故事存储在其中,并根据用户选择播放相应的故事。
3. 语音控制:引入语音识别功能,让用户可以通过语音命令控制故事的播放。例如,用户可以说出“下一个”来播放下一篇故事,或者说出“停止”来停止故事的播放。
4. 播放控制:提供基本的播放控制功能,例如暂停、继续、快进、快退等。你可以使用音频处理库来实现这些功能,例如`pydub`或`pygame`。
5. 音效和背景音乐:为故事添加音效和背景音乐,增强故事的表现力。你可以使用音频处理库来混合音频文件,将故事的语音和音效/背景音乐合成在一起。
6. 图形界面:创建一个图形用户界面(GUI),使用户可以更直观地选择故事、控制播放,并显示故事的文本内容。你可以使用GUI库,例如`Tkinter`、`PyQt`或`wxPython`。
7. 多语言支持:除了中文,你还可以通过修改语音合成的参数和使用其他语言的TTS库,实现其他语言的有声故事书。
8. 保存和分享:允许用户保存故事的语音文件,并提供分享功能,让用户可以将故事分享给其他人。


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


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


![在这里插入图片描述](https://img-blog.csdnimg.cn/ef92b74c4c2a4413b04f8bfd43a26bc9.jpg)  
 下面是一个示例代码,演示如何通过终端输入或读取文本文件的方式获取用户输入的故事文本:



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` 作为输入,传递给语音合成接口,生成对应的语音文件。


### 五、故事选择示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/ee5061d69379401fb61ec5dc746f8dc3.png)下面是一个示例代码,演示如何创建一个故事库并提供故事选择功能:



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` 时,循环结束,程序退出。


在示例代码中,我们只是打印故事的内容,你可以根据需要调用语音合成接口,将故事转换为语音并播放。


你可以根据这个示例代码,创建一个故事库对象,并添加不同的故事。然后,用户可以根据故事编号选择要听的故事。


### 六、语音控制示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/94b7bdc2ecb442cabf8881f73f7ac10a.jpg)要实现语音控制功能,你需要使用语音识别和语音合成两个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供应商的文档进行集成和调整。


### 七、播放控制示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/72ab99a8574c4fdd96ff7fe3efc9ef9b.png)以下是整合了之前的代码和添加了快进和快退功能的示例代码:



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()` 函数将播放位置设置为新的位置。


请注意,这只是一个示例代码,实际的实现可能因具体的音频处理库和播放器而有所不同。你需要根据你选择的库和播放器的文档进行集成和调整。


### 八、文本转换语音示例代码


![在这里插入图片描述](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”

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值