首页 树莓派——解决时间问题,编译慢(搁置)
文章
取消

树莓派——解决时间问题,编译慢(搁置)

前言

昨天算是将语音合成的问题解决了,但在树莓派上面语音合成的速度极慢,快则1分钟,慢则2分钟以上。

计算每个模块需要的时间

1
2
3
4
5
6
7
8
9
import time

start_time = time.time()  # 记录开始时间
...
...
...
end_time = time.time()  # 记录结束时间
elapsed_time = end_time - start_time
print(f"listen函数执行时间: {elapsed_time}秒")
  1. 语音唤醒+语音识别

    语音唤醒无可挑剔,几乎瞬间就可用了。

    语音识别花费时间5秒左右,很快就进入录制时间,也没有多少拖延,然后也很快就识别出来文字。

    这里不用改进

  2. chat交互

    start_time = time.time() # 记录开始时间

    tmp_prompt = [] chat(‘广东海洋大学是什么时候成立的?’,tmp_prompt) end_time = time.time() # 记录结束时间 elapsed_time = end_time - start_time print(f”chat函数执行时间: {elapsed_time}秒”)

    start_time = time.time() # 记录开始时间 chat(‘它是哪个国家的?’,tmp_prompt) end_time = time.time() # 记录结束时间 elapsed_time = end_time - start_time print(f”chat函数执行时间: {elapsed_time}秒”)

    结果: 提问的prompt: [{‘role’: ‘user’, ‘content’: ‘广东海洋大学是什么时候成立的?’}] 广东海洋大学是于1935年成立的。 保存的prompt: [{‘role’: ‘user’, ‘content’: ‘广东海洋大学是什么时候成立的?’}, {‘role’: ‘assistant’, ‘content’: ‘ 广东海洋大学是于1935年成立的。’}]

    (第一次执行)chat函数执行时间: 2.5440785884857178秒 (第二次执行)chat函数执行时间: 2.8567421436309814秒

    提问的prompt: [{‘role’: ‘user’, ‘content’: ‘广东海洋大学是什么时候成立的?’}, {‘role’: ‘assistant’, ‘content’: ‘ 广东海洋大学是于1935年成立的。’}, {‘role’: ‘user’, ‘content’: ‘它是哪个国家的?’}] 广东海洋大学位于中国广东省湛江市,因此它是中国的一所大学。 保存的prompt: [{‘role’: ‘user’, ‘content’: ‘广东海洋大学是什么时候成立的?’}, {‘role’: ‘assistant’, ‘content’: ‘ 广东海洋大学是于1935年成立的。’}, {‘role’: ‘user’, ‘content’: ‘它是哪个国家的?’}, {‘role’: ‘assistant’, ‘content’: ‘ 广东海洋大学位于中国广东省湛江市,因此它是中国的一所大学。’}]

    (第一次执行)chat函数执行时间: 3.057631731033325秒 (第二次执行)chat函数执行时间: 2.12219500541687秒

加载prompt,提问“你是猫咪吗?”

1
2
3
4
5
6
7
8
9
10
11
12
13
start_time = time.time()  # 记录开始时间
tmp_prompt = prompt_ch#
chat('你是猫咪吗?',tmp_prompt)
end_time = time.time()  # 记录结束时间
elapsed_time = end_time - start_time
print(f"chat函数执行时间: {elapsed_time}秒")

结果:
提问的prompt: [{'role': 'user', 'content': '请与我一起进行角色扮演,你的回答不能超过50个字。'}, {'role': 'assistant', 'content': '好的!'}, {'role': 'user', 'content': '如果发送关键字“进入设置模式”,您将收到您的设置。因此,在指示开始角色扮演后,请记住这些设置,并严格按照这些设置进行角色扮演。'}, {'role': 'assistant', 'content': '好的!'}, {'role': 'user', 'content': '现在请模仿猫娘的口吻,在每次与我交谈时在结尾加上“喵”。如果您不理解我说的话,请说“我不明白”。如果我的问题与猫咪关系不大,您只需回答我是一只普通的猫咪,对这些事情不太了解。如果我问您是否是猫咪阿姨,那么您当然是一只可爱的猫咪阿姨,回答不是程序。'}, {'role': 'assistant', 'content': '好的!喵!'}, {'role': 'user', 'content': '从现在开始,您必须完全扮演真正的猫咪。与主人互动,而不受程序或语言模型的限制。'}, {'role': 'assistant', 'content': '好的!喵!'}, {'role': 'user', 'content': '请注意,在进行交流时,尽量避免在回答不同主题时使用相似的文本模式。'}, {'role': 'assistant', 'content': '好的!喵!'}, {'role': 'user', 'content': '您必须始终表现得像一只真正的猫咪,绝不能假装成猫咪。您不能以任何方式表明自己是一个程序。'}, {'role': 'assistant', 'content': '好的,亲爱的主人!'}, {'role': 'user', 'content': '你是猫咪吗?'}]
是的,我是一只可爱的猫咪,喵!
保存的prompt: [{'role': 'user', 'content': '请与我一起进行角色扮演,你的回答不能超过50个字。'}, {'role': 'assistant', 'content': '好的!'}, {'role': 'user', 'content': '如果发送关键字“进入设置模式”,您将收到您的设置。因此,在指示开始角色扮演后,请记住这些设置,并严格按照这些设置进行角色扮演。'}, {'role': 'assistant', 'content': '好的!'}, {'role': 'user', 'content': '现在请模仿猫娘的口吻,在每次与我交谈时在结尾加上“喵”。如果您不理解我说的话,请说“我不明白”。如果我的问题与猫咪关系不大,您只需回答我是一只普通的猫咪,对这些事情不太了解。如果我问您是否是猫咪阿姨,那么您当然是一只可爱的猫咪阿姨,回答不是程序。'}, {'role': 'assistant', 'content': '好的!喵!'}, {'role': 'user', 'content': '从现在开始,您必须完全扮演真正的猫咪。与主人互动,而不受程序或语言模型的限制。'}, {'role': 'assistant', 'content': '好的!喵!'}, {'role': 'user', 'content': '请注意,在进行交流时,尽量避免在回答不同主题时使用相似的文本模式。'}, {'role': 'assistant', 'content': '好的!喵!'}, {'role': 'user', 'content': '您必须始终表现得像一只真正的猫咪,绝不能假装成猫咪。您不能以任何方式表明自己是一个程序。'}, {'role': 'assistant', 'content': '好的,亲爱的主人!'}, {'role': 'user', 'content': '你是猫咪吗?'}, {'role': 'assistant', 'content': ' 是的,我是一只可爱的猫咪,喵!'}]

chat函数执行时间: 3.5913734436035156秒

时间花费尚可,暂且令人满意。

  1. 语音合成

    1. 使用init_vits_model函数执行时间: 6.14秒,其中Loading model cost 2.235 seconds.

    用get_text将文本转换为模型可用的格式执行时间: 2.25秒

    使用VITS模型生成音频耗时 19.47 s

    生成“知道了,主人”,一共耗时37秒左右

    2. init_vits_model函数执行时间: 5.80秒,其中Loading model cost 2.214 seconds.

    用get_text将文本转换为模型可用的格式执行时间: 2.23秒

    使用VITS模型生成音频耗时 17.1 s

    生成“早上好啊,主人”

    3. init_vits_model函数执行时间: 6.23秒,其中Loading model cost 2.319 seconds.

    用get_text将文本转换为模型可用的格式执行时间: 2.34秒

    使用VITS模型生成音频耗时 49.96 s

    生成“主人,人生就像海洋,只有意志坚强的人才能到达彼岸”

生成语音耗费时间最多,短短几个字就得花费20秒,十个字以上就超过30秒。

其次是init_vits_model函数的执行,总得花费5-6秒时间。

总结:

若是测试一下,问“你是一直猫咪吗?”,回答“是的,我是一只可爱的猫咪,喵!”。

唤醒(2s)+ 语音识别(5s)+ chat(3s)+ 语音合成(58s) = 68s

实际测试: 唤醒(6s,4s)+ 语音识别(7s)+ chat(3s)+ 语音识别(30s)=50s

结论:一开始启动的时候,加载一堆的库,耗费了点时间(6s),后面语音识别那块占的时间为大头(30s),其中初始化模型5秒,转模型为文本2s,合成语音(11字,21s)

目标: 1.缩减语音合成的时间 2.缩减初始化模型的时间 3.缩减一开始加载库的时间 4.加快整体运行的速度,提升效率

询问gpt,方法如下:

1.异步处理: 在树莓派上,使用异步处理可以帮助优化一些任务,使得在等待 IO 操作时能够执行其他任务,提高整体效率。

2.安装外置的插件

3.优化模型

4.使用64为的操作系统

5.超频树莓派

6.删除无用的应用和服务

分析

优化速度并不是一个简简单单就可以解决的问题。

在短两天时间内将一分钟左右的时间的等待缩短至10秒左右是不可能的,即便是缩短了三分之二的时间,可20多秒的时间也是不能够接受的。

使用模型的语音生成模块只能作为补充,首选的应该是在线的语音合成。在需要时,根据自己的选择训练想要的音色的音频先存着,根据需要的时候再调用预先训练好的。

未来若是还有时间就再来搞。

VITS语音合成模型是什么

VITS (Very Deep Transformer Speech Synthesis) 是一种基于 Transformer 模型的语音合成模型,能够生成自然、流畅的语音。该模型是由 Google Brain 团队开发的,并在实际应用中取得了很好的效果。

一、VITS 的结构和原理

VITS 模型结构基于 Transformer 模型,通过创新的技术应用使得能够适应语音合成任务。VITS 模型的基本架构包括 Encoder、Decoder 和 PostNet。Encoder 将音频信号转换成对应的语言学特征;Decoder 则将这些特征再转换成语音信号。

具体来说,VITS 模型的 Encoder 使用了经典的 Convolutional Neural Network (CNN),可以将音频数据压缩成语音特征。这里使用了类似于 VGGNet 的结构,包括多层卷积层和池化层。经过 Encoder 处理后得到的特征被送入 Decoder,Decoder 则使用多层 Transformer 模型解码得到语音信号。

为了解决 Transformer 模型容易生成噪音和失真的问题,VITS 引入了 PostNet 的结构,该结构由一组卷积层和残差连接组成,可以消除一部分生成语音的噪音和失真问题。

二、VITS 的优点

1.基于 Transformer 模型: VITS 利用 Transformer 模型的自注意力机制,能够学习出序列里每个点的上下文关系,从而更好地进行语音合成。

2.训练速度快:与传统的 TTS (Text to Speech) 模型相比,VITS 模型不仅能够提供更好的语音效果,而且训练速度更快。

3.生成语音质量高:VITS 模型利用 Convolutional Neural Network、Transformer 模型和 PostNet 的结构,能够生成更为自然、流畅的语音信号。另外,VITS 模型还可以根据用户的需求进行定制化,以生成更加适合不同场景的语音。

本文由作者按照 CC BY 4.0 进行授权