wzpan / wukong-robot

🤖 wukong-robot 是一个简单、灵活、优雅的中文语音对话机器人/智能音箱项目,支持ChatGPT多轮对话能力,还可能是首个支持脑机交互的开源智能音箱项目。
https://wukong.hahack.com/
MIT License
6.23k stars 1.33k forks source link

升级到最新的之后 怎么感觉唤醒之后 的语音识别速度慢了好多 #252

Closed jwister closed 1 year ago

jwister commented 1 year ago

确认已寻找过答案

我已确认在 Github issue 页、常见问题页、文档 中都查找过,没有找到类似问题和资料。我也没有 google / bing/ 百度 / duckduckgo 到相关解答。

安装方式

手动安装

操作系统

Raspbian

离线唤醒相关

如果是离线唤醒相关的问题,是否已确保 arecord temp.wavaplay temp.wav (Linux) 或 rec temp.wavplay temp.wav (Mac)已正常工作?(注意要求不能带任何其他参数)如果不能,请先配置好麦克风和音响再尝试。

—— 我已确保录音、播放都正常工作才尝试 wukong-robot 。

问题描述

升级版本之后,感觉唤醒之后的语音转文字速度慢了好多,是换了话筒的原因么?

jwister commented 1 year ago

找到原因了。 换了respeaker 之后 录音出来的电流声好大。。。。 怎么破?

jwister commented 1 year ago

我发现我用arecord 录音然后用aplay 播放 杂音很大, 用rec录音 play播放 没任何杂音。 我现在也不知道咋回事。但是就是感觉用wukong唤醒之后 说的话 识别速度变慢了好多。我先前以为是杂音。现在也不确定了,悟空唤醒说的话有录音文件保存么?我想听听有没有杂音。

jwister commented 1 year ago

image

RizhaoCai commented 1 year ago

Same. Feeling that the ASR process is very slow. I am using RaspBerry Pi

2DIPW commented 1 year ago

我发现我用arecord 录音然后用aplay 播放 杂音很大, 用rec录音 play播放 没任何杂音。 我现在也不知道咋回事。但是就是感觉用wukong唤醒之后 说的话 识别速度变慢了好多。我先前以为是杂音。现在也不确定了,悟空唤醒说的话有录音文件保存么?我想听听有没有杂音。

arecord默认会以8bit 8000hz采样率录音,所以听起来杂音很大,你可以加参数让它和rec使用一样的位深和采样率,这样听起来应该是一样的。如果你用的snowboy唤醒,悟空对唤醒后录音保存的相关代码在snowboy/snowboydecoder.py的saveMessage方法中,你可以在其中加一段代码把录音另存试听。 另外你是从哪个版本升级到最新版的,我大概一周前开始用悟空,那个时候我的ASR过程就非常缓慢,我用的是科大讯飞的ASR,我一直以为是讯飞API自己的问题。

RizhaoCai commented 1 year ago

我发现我用arecord 录音然后用aplay 播放 杂音很大, 用rec录音 play播放 没任何杂音。 我现在也不知道咋回事。但是就是感觉用wukong唤醒之后 说的话 识别速度变慢了好多。我先前以为是杂音。现在也不确定了,悟空唤醒说的话有录音文件保存么?我想听听有没有杂音。

arecord默认会以8bit 8000hz采样率录音,所以听起来杂音很大,你可以加参数让它和rec使用一样的位深和采样率,这样听起来应该是一样的。如果你用的snowboy唤醒,悟空对唤醒后录音保存的相关代码在snowboy/snowboydecoder.py的saveMessage方法中,你可以在其中加一段代码把录音另存试听。 另外你是从哪个版本升级到最新版的,我大概一周前开始用悟空,那个时候我的ASR过程就非常缓慢,我用的是科大讯飞的ASR,我一直以为是讯飞API自己的问题。

我的也是。ASR过程非常缓慢。并且播放声音后有一段时间没有响应(不能接受我的snowboy唤醒)。 而且有时候会莫名其妙接受我的其他话作为ASR的输入

RizhaoCai commented 1 year ago

找到原因了。 换了respeaker 之后 录音出来的电流声好大。。。。 怎么破?

@jwister 你好,请问你找到了识别速度很慢的原因了吗? 怎么解决呢

prairiewolf11 commented 1 year ago

录音完到识别用3秒,命中技能用3秒,2个字的回答结果合成语音用了5秒,读取语音并开始播放用0.5秒。

wzpan commented 1 year ago

3.5.2 相比 3.5.1 仅仅只是加了 VITSClient 。看不出来哪里会导致变慢。

diff --git a/README.md b/README.md
index fd079e6..036552e 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@
 </p>

 * 模块化。功能插件、语音识别、语音合成、对话机器人都做到了高度模块化,第三方插件单独维护,方便继承和开发自己的插件。
-* 中文支持。集成百度、科大讯飞、阿里、腾讯、OpenAI Whisper、Apple、微软Edge等多家中文语音识别和语音合成技术,且可以继续扩展。
+* 中文支持。集成百度、科大讯飞、阿里、腾讯、OpenAI Whisper、Apple、微软Edge、VITS声音克隆TTS 等多家中文语音识别和语音合成技术,且可以继续扩展。
 * 对话机器人支持。支持基于 [AnyQ](https://wukong.hahack.com/#/anyq) 的本地对话机器人,并支持接入图灵机器人、ChatGPT 等在线对话机器人。
 * 全局监听,离线唤醒。支持 [Porcupine](https://github.com/Picovoice/porcupine) 和 [snowboy](https://github.com/Kitt-AI/snowboy) 两套离线语音指令唤醒引擎,并支持 Muse [脑机唤醒](https://wukong.hahack.com/#/bci) 以及行空板摇一摇唤醒等其他唤醒方式。
 * 灵活可配置。支持定制机器人名字,支持选择语音识别和合成的插件。
@@ -93,7 +93,7 @@ wukong-robot 被唤醒后,用户的语音指令先经过 ASR 引擎进行 ASR

 ### Python 版本 ###

-wukong-robot 只支持 Python 3.7+,不支持 Python 2.x 。
+wukong-robot 只支持 Python >= 3.7 且 < 3.10 ,不支持 Python 2.x 。

 ### 设备要求 ###

diff --git a/VERSION b/VERSION
index d5c0c99..87ce492 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.5.1
+3.5.2
diff --git a/docker/DockerfileArm b/docker/DockerfileArm
index 0bbdb75..72f42a7 100644
--- a/docker/DockerfileArm
+++ b/docker/DockerfileArm
@@ -20,6 +20,7 @@ RUN apt-get update && apt-get install -y \
     libpcre3 \
     libpcre3-dev \
     libatlas-base-dev \
+    libffi-dev \
     build-essential \
     && rm -rf /var/lib/apt/lists/*

diff --git a/robot/TTS.py b/robot/TTS.py
index 32fe58b..4bfb88b 100644
--- a/robot/TTS.py
+++ b/robot/TTS.py
@@ -16,7 +16,7 @@ from pathlib import Path
 from pypinyin import lazy_pinyin
 from pydub import AudioSegment
 from abc import ABCMeta, abstractmethod
-from .sdk import TencentSpeech, AliSpeech, XunfeiSpeech, atc
+from .sdk import TencentSpeech, AliSpeech, XunfeiSpeech, atc, VITSClient
 import requests
 from xml.etree import ElementTree

@@ -348,7 +348,7 @@ class EdgeTTS(AbstractTTS):

     SLUG = "edge-tts"

-    def __init__(self, voice="Tingting", **args):
+    def __init__(self, voice="zh-CN-XiaoxiaoNeural", **args):
         super(self.__class__, self).__init__()
         self.voice = voice

@@ -408,6 +408,37 @@ class MacTTS(AbstractTTS):
         else:
             logger.critical(f"{self.SLUG} 合成失败!", stack_info=True)

+class VITS(AbstractTTS):
+    """
+    VITS 语音合成
+    需要自行搭建vits-simple-api服务器:https://github.com/Artrajz/vits-simple-api
+    server_url : 服务器url,如http://127.0.0.1:23456
+    api_key : 若服务器配置了API Key,在此填入
+    speaker_id : 说话人ID,由所使用的模型决定
+    length : 调节语音长度,相当于调节语速,该数值越大语速越慢。
+    noise : 噪声
+    noisew : 噪声偏差
+    max : 分段阈值,按标点符号分段,加起来大于max时为一段文本。max<=0表示不分段。
+    timeout: 响应超时时间,根据vits-simple-api服务器性能不同配置合理的超时时间。
+    """
+
+    SLUG = "VITS"
+
+    def __init__(self, server_url, api_key, speaker_id, length, noise, noisew, max, timeout, **args):
+        super(self.__class__, self).__init__()
+        self.server_url, self.api_key, self.speaker_id, self.length, self.noise, self.noisew, self.max, self.timeout = (
+            server_url, api_key, speaker_id, length, noise, noisew, max, timeout)
+
+    @classmethod
+    def get_config(cls):
+        return config.get("VITS", {})
+
+    def get_speech(self, phrase):
+        result = VITSClient.tts(phrase, self.server_url, self.api_key, self.speaker_id, self.length, self.noise,
+                                self.noisew, self.max, self.timeout)
+        tmpfile = utils.write_temp_file(result, ".wav")
+        logger.info(f"{self.SLUG} 语音合成成功,合成路径:{tmpfile}")
+        return tmpfile

 def get_engine_by_slug(slug=None):
     """
diff --git a/robot/sdk/VITSClient.py b/robot/sdk/VITSClient.py
new file mode 100644
index 0000000..164978f
--- /dev/null
+++ b/robot/sdk/VITSClient.py
@@ -0,0 +1,24 @@
+# coding: utf-8
+# !/usr/bin/env python3
+
+"""VITS TTS API"""
+
+import requests
+
+
+def tts(text, server_url, api_key, speaker_id, length, noise, noisew, max, timeout):
+    data = {
+        "text": text,
+        "id": speaker_id,
+        "format": "wav",
+        "lang": "auto",
+        "length": length,
+        "noise": noise,
+        "noisew": noisew,
+        "max": max
+    }
+    headers = {"X-API-KEY": api_key}
+    url = f"{server_url}/voice"
+    res = requests.post(url=url, data=data, headers=headers, timeout=timeout)
+    res.raise_for_status()
+    return res.content
diff --git a/robot/utils.py b/robot/utils.py
index 71c5563..d49f299 100644
--- a/robot/utils.py
+++ b/robot/utils.py
@@ -300,10 +300,10 @@ def validyaml(filename):
     :returns: True: 正确; False: 不正确
     """
     try:
-        f = open(filename)
-        str = f.read()
-        yaml.safe_load(str)
-        return True
+        with open(filename) as f:
+            str = f.read()
+            yaml.safe_load(str)
+            return True
     except Exception:
         return False

diff --git a/static/default.yml b/static/default.yml
index 463fd40..5570858 100755
--- a/static/default.yml
+++ b/static/default.yml
@@ -97,6 +97,7 @@ lru_cache:
 # azure-tts     - 微软语音合成
 # mac-tts       - macOS 系统自带TTS(mac 系统推荐)
 # edge-tts      - 基于 Edge 的 TTS(推荐)
+# VITS          - 基于 VITS 的AI语音合成
 tts_engine: edge-tts

 # 语音识别服务配置
@@ -179,6 +180,26 @@ edge-tts:
     # 中文推荐 `zh` 开头的音色
     voice: zh-CN-XiaoxiaoNeural

+# 基于 VITS 的AI语音合成
+VITS:
+    # 需要自行搭建vits-simple-api服务器:https://github.com/Artrajz/vits-simple-api
+    #    server_url: 服务器url(格式为http://{IP地址}:{端口},不带最后的斜杠),如http://127.0.0.1:23456
+    #    api_key: 若服务器配置了API Key,在此填入
+    #    speaker_id: 说话人ID,由所使用的模型决定
+    #    length: 调节语音长度,相当于调节语速,该数值越大语速越慢。
+    #    noise: 噪声
+    #    noisew: 噪声偏差
+    #    max: 分段阈值,按标点符号分段,加起来大于max时为一段文本。max<=0表示不分段。
+    #    timeout: 响应超时时间(秒),根据vits-simple-api服务器性能不同配置合理的超时时间。
+    server_url: "http://127.0.0.1:23456"
+    api_key: "api_key"
+    speaker_id: 0
+    length: 1.0
+    noise: 0.667
+    noisew: 0.8
+    max: 50
+    timeout: 60
+
 # NLU 引擎
 # 可选值:
 # unit      - 百度 UNIT

觉得慢的可以通过 profiling 参数来找到瓶颈。

python wukong.py profiling
wzpan commented 1 year ago

久未回复,先关闭本 issue 。