From 0200c99b195d489b29e961179ace3ec5dc213e5e Mon Sep 17 00:00:00 2001 From: root Date: Mon, 19 Jun 2023 06:19:47 +0000 Subject: [PATCH 01/17] =?UTF-8?q?set=20proxy=20=E5=B9=B6=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=9C=A8SocketServer.py=E8=84=9A=E6=9C=AC=E7=9A=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=B8=AD=E4=BD=93=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run-gpt3.5-api.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run-gpt3.5-api.bat b/run-gpt3.5-api.bat index 81c5049..28ffbcf 100644 --- a/run-gpt3.5-api.bat +++ b/run-gpt3.5-api.bat @@ -7,4 +7,4 @@ set CHARACTER=paimon set MODEL=gpt-3.5-turbo -.\venv\Scripts\python.exe %SCRIPT_NAME% --chatVer %CHATVER% --stream %STREAM% --character %CHARACTER% --model %MODEL% +.\venv\Scripts\python.exe %SCRIPT_NAME% --chatVer %CHATVER% --proxy %PROXY% --stream %STREAM% --character %CHARACTER% --model %MODEL% From 308f3ce7b3805432adf36f2e9203ae1c1f516639 Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 30 Jun 2023 18:10:51 +0800 Subject: [PATCH 02/17] Update readme.md add huggingface model path --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index f05c1f3..0c26859 100644 --- a/readme.md +++ b/readme.md @@ -31,6 +31,8 @@ git clone https://github.com/zixiiu/Digital_Life_Server.git --recursive 4. Download models [百度网盘](https://pan.baidu.com/s/1EnHDPADNdhDl71x_DHeElg?pwd=75gr) + [HuggingFace](https://huggingface.co/mike1999/models-for-Digital-Life-Server) + ASR Model: to `/ASR/resources/models` Sentiment Model: From d8ac2bf4009aa4d608ef23f3aac284361d051ea0 Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 30 Jun 2023 18:15:37 +0800 Subject: [PATCH 03/17] Update readme.md --- readme.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/readme.md b/readme.md index 0c26859..88fa8c7 100644 --- a/readme.md +++ b/readme.md @@ -26,8 +26,15 @@ git clone https://github.com/zixiiu/Digital_Life_Server.git --recursive cd "TTS/vits/monotonic_align" mkdir monotonic_align python setup.py build_ext --inplace + ``` + Windows系统的话, 执行 + ``` cp monotonic_align/*.pyd . ``` + Linux系统的话, 执行 + ``` + cp monotonic_align/*.so . + ``` 4. Download models [百度网盘](https://pan.baidu.com/s/1EnHDPADNdhDl71x_DHeElg?pwd=75gr) From 36d92aab68dfa56c883786d9dca6714c218b059e Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 4 Aug 2023 14:34:34 +0800 Subject: [PATCH 04/17] no tmp folder may cause crash --- tmp/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tmp/.gitignore diff --git a/tmp/.gitignore b/tmp/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/tmp/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore From e9f0d4312160d0d3434036b550d012b1931ba4fd Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 27 Aug 2023 13:58:47 +0800 Subject: [PATCH 05/17] =?UTF-8?q?fix=20=E5=9C=A8=E6=9C=AA=E8=B5=8B?= =?UTF-8?q?=E5=80=BC=E4=B9=8B=E5=89=8D=E5=BC=95=E7=94=A8=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GPT/machine_id.py | 1 + 1 file changed, 1 insertion(+) diff --git a/GPT/machine_id.py b/GPT/machine_id.py index 14c85cf..06c0f1d 100644 --- a/GPT/machine_id.py +++ b/GPT/machine_id.py @@ -6,6 +6,7 @@ import uuid def get_machine_unique_identifier(): + mac_address = None if platform.system() == "Windows": # Use the Windows Management Instrumentation (WMI) interface import wmi From 3a587430f058e67bfd8a9b52816c5a98ef494a8f Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 27 Aug 2023 14:16:10 +0800 Subject: [PATCH 06/17] =?UTF-8?q?0.0.0.0#=20=E6=89=80=E6=9C=89=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E4=B8=8A=E9=9D=A2=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SocketServer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketServer.py b/SocketServer.py index c546e01..76ddab1 100644 --- a/SocketServer.py +++ b/SocketServer.py @@ -62,7 +62,7 @@ def __init__(self, args): self.addr = None self.conn = None logging.info('Initializing Server...') - self.host = socket.gethostbyname(socket.gethostname()) + self.host = "0.0.0.0"# 所有地址上面监听 self.port = 38438 self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) From e009b85795d9d90e23cc7b3a95eb49497cee6245 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 15 Nov 2023 16:39:54 +0000 Subject: [PATCH 07/17] =?UTF-8?q?TTS=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=9C=89?= =?UTF-8?q?=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TTS-flask-paimon.py | 76 +++++ TTS-flask-peppa.py | 78 ++++++ TTS-flask-peppa2.py | 76 +++++ TTS-flask-peppa3.py | 75 +++++ check-post-detail.py | 47 ++++ text/LICENSE | 19 ++ text/__init__.py | 60 ++++ text/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2493 bytes text/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2344 bytes text/__pycache__/cleaners.cpython-310.pyc | Bin 0 -> 4968 bytes text/__pycache__/cleaners.cpython-37.pyc | Bin 0 -> 5450 bytes text/__pycache__/english.cpython-310.pyc | Bin 0 -> 4702 bytes text/__pycache__/english.cpython-37.pyc | Bin 0 -> 4932 bytes text/__pycache__/japanese.cpython-310.pyc | Bin 0 -> 4140 bytes text/__pycache__/japanese.cpython-37.pyc | Bin 0 -> 4599 bytes text/__pycache__/korean.cpython-310.pyc | Bin 0 -> 5588 bytes text/__pycache__/korean.cpython-37.pyc | Bin 0 -> 5746 bytes text/__pycache__/mandarin.cpython-310.pyc | Bin 0 -> 5994 bytes text/__pycache__/mandarin.cpython-37.pyc | Bin 0 -> 7511 bytes text/__pycache__/sanskrit.cpython-310.pyc | Bin 0 -> 1685 bytes text/__pycache__/sanskrit.cpython-37.pyc | Bin 0 -> 1627 bytes text/__pycache__/symbols.cpython-310.pyc | Bin 0 -> 480 bytes text/__pycache__/symbols.cpython-37.pyc | Bin 0 -> 417 bytes text/__pycache__/thai.cpython-310.pyc | Bin 0 -> 1449 bytes text/__pycache__/thai.cpython-37.pyc | Bin 0 -> 1410 bytes text/cantonese.py | 59 ++++ text/cleaners.py | 129 +++++++++ text/english.py | 188 +++++++++++++ text/japanese.py | 153 ++++++++++ text/korean.py | 210 ++++++++++++++ text/mandarin.py | 326 ++++++++++++++++++++++ text/ngu_dialect.py | 30 ++ text/sanskrit.py | 62 ++++ text/shanghainese.py | 64 +++++ text/symbols.py | 76 +++++ text/thai.py | 44 +++ 36 files changed, 1772 insertions(+) create mode 100644 TTS-flask-paimon.py create mode 100644 TTS-flask-peppa.py create mode 100644 TTS-flask-peppa2.py create mode 100644 TTS-flask-peppa3.py create mode 100644 check-post-detail.py create mode 100644 text/LICENSE create mode 100644 text/__init__.py create mode 100644 text/__pycache__/__init__.cpython-310.pyc create mode 100644 text/__pycache__/__init__.cpython-37.pyc create mode 100644 text/__pycache__/cleaners.cpython-310.pyc create mode 100644 text/__pycache__/cleaners.cpython-37.pyc create mode 100644 text/__pycache__/english.cpython-310.pyc create mode 100644 text/__pycache__/english.cpython-37.pyc create mode 100644 text/__pycache__/japanese.cpython-310.pyc create mode 100644 text/__pycache__/japanese.cpython-37.pyc create mode 100644 text/__pycache__/korean.cpython-310.pyc create mode 100644 text/__pycache__/korean.cpython-37.pyc create mode 100644 text/__pycache__/mandarin.cpython-310.pyc create mode 100644 text/__pycache__/mandarin.cpython-37.pyc create mode 100644 text/__pycache__/sanskrit.cpython-310.pyc create mode 100644 text/__pycache__/sanskrit.cpython-37.pyc create mode 100644 text/__pycache__/symbols.cpython-310.pyc create mode 100644 text/__pycache__/symbols.cpython-37.pyc create mode 100644 text/__pycache__/thai.cpython-310.pyc create mode 100644 text/__pycache__/thai.cpython-37.pyc create mode 100644 text/cantonese.py create mode 100644 text/cleaners.py create mode 100644 text/english.py create mode 100644 text/japanese.py create mode 100644 text/korean.py create mode 100644 text/mandarin.py create mode 100644 text/ngu_dialect.py create mode 100644 text/sanskrit.py create mode 100644 text/shanghainese.py create mode 100644 text/symbols.py create mode 100644 text/thai.py diff --git a/TTS-flask-paimon.py b/TTS-flask-paimon.py new file mode 100644 index 0000000..eaf3c39 --- /dev/null +++ b/TTS-flask-paimon.py @@ -0,0 +1,76 @@ +from flask import Flask, request, send_file +from pydub import AudioSegment +import sys +import time +import os +import torch +import logging +import soundfile + +sys.path.append('TTS/vits') +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +app = Flask(__name__) + +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + +cfg_path = "TTS/models/paimon6k.json" +model_path = "TTS/models/paimon6k_390k.pth" + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).cuda() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + +# initialize TTService with appropriate arguments +tts = TTService(cfg=cfg_path, model=model_path, char="char_var", speed=1.0) + +@app.route('/v1/audio/speech', methods=['POST']) +def post_text_to_audio(): + text = request.json['input'] + audio = tts.read(text) + soundfile.write('audio.wav', audio, 44100) # You may need to adjust the sample rate + sound = AudioSegment.from_wav("audio.wav") + sound.export("audio.mp3", format="mp3") + return send_file('audio.mp3', mimetype='audio/mp3') + +if __name__ == '__main__': + app.run(host="0.0.0.0", port=5000) diff --git a/TTS-flask-peppa.py b/TTS-flask-peppa.py new file mode 100644 index 0000000..a69d3f4 --- /dev/null +++ b/TTS-flask-peppa.py @@ -0,0 +1,78 @@ +from flask import Flask, request, send_file +from pydub import AudioSegment +import sys +import time +import os +import torch +import logging +import soundfile + +sys.path.append('TTS/vits') +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +app = Flask(__name__) + +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + +cfg_path = "TTS/models/peppa_9k.json" +model_path = "TTS/models/peppa_9k.pth" + + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + n_speakers=self.hps.data.n_speakers, + **self.hps.model).cuda() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + +# initialize TTService with appropriate arguments +tts = TTService(cfg=cfg_path, model=model_path, char="char_var", speed=1.0) + +@app.route('/v1/audio/speech', methods=['POST']) +def post_text_to_audio(): + text = request.json['input'] + audio = tts.read(text) + soundfile.write('audio.wav', audio, 44100) # You may need to adjust the sample rate + sound = AudioSegment.from_wav("audio.wav") + sound.export("audio.mp3", format="mp3") + return send_file('audio.mp3', mimetype='audio/mp3') + +if __name__ == '__main__': + app.run(host="0.0.0.0", port=5000) diff --git a/TTS-flask-peppa2.py b/TTS-flask-peppa2.py new file mode 100644 index 0000000..6db9014 --- /dev/null +++ b/TTS-flask-peppa2.py @@ -0,0 +1,76 @@ +from flask import Flask, request, send_file +from pydub import AudioSegment +import sys +import time +import os +import torch +import logging +import soundfile + +sys.path.append('TTS/vits') +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +app = Flask(__name__) + +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + +cfg_path = "TTS/models/peppa_9k.json" +model_path = "TTS/models/peppa_9k.pth" + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.symbols, [] if is_symbol else hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + n_speakers=self.hps.data.n_speakers, + **self.hps.model).cuda() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + +tts = TTService(cfg=cfg_path, model=model_path, char="char_var", speed=1.0) + +@app.route('/v1/audio/speech', methods=['POST']) +def post_text_to_audio(): + text = request.json['input'] + audio = tts.read(text) + soundfile.write('audio.wav', audio, 44100) + sound = AudioSegment.from_wav("audio.wav") + sound.export("audio.mp3", format="mp3") + return send_file('audio.mp3', mimetype='audio/mp3') + +if __name__ == '__main__': + app.run(host="0.0.0.0", port=5000) diff --git a/TTS-flask-peppa3.py b/TTS-flask-peppa3.py new file mode 100644 index 0000000..fdd1f64 --- /dev/null +++ b/TTS-flask-peppa3.py @@ -0,0 +1,75 @@ +from flask import Flask, request, send_file +from pydub import AudioSegment +import sys +import time +import os +import torch +import logging +import soundfile + +sys.path.append('TTS/vits') +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +#from TTS.vits.text import text_to_sequence +from text import text_to_sequence, _clean_text + +app = Flask(__name__) + +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + +cfg_path = "TTS/models/peppa_9k.json" +model_path = "TTS/models/peppa_9k.pth" + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.symbols, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(self.hps.symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).cuda() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + +tts = TTService(cfg=cfg_path, model=model_path, char="char_var", speed=1.0) + +@app.route('/v1/audio/speech', methods=['POST']) +def post_text_to_audio(): + text = request.json['input'] + audio = tts.read(text) + soundfile.write('audio.wav', audio, 44100) + sound = AudioSegment.from_wav("audio.wav") + sound.export("audio.mp3", format="mp3") + return send_file('audio.mp3', mimetype='audio/mp3') + +if __name__ == '__main__': + app.run(host="0.0.0.0", port=5000) diff --git a/check-post-detail.py b/check-post-detail.py new file mode 100644 index 0000000..323cee0 --- /dev/null +++ b/check-post-detail.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +""" +License: MIT License +Copyright (c) 2023 Miel Donkers +Very simple HTTP server in python for logging requests +Usage:: + ./server.py [] +""" +from http.server import BaseHTTPRequestHandler, HTTPServer +import logging + +class S(BaseHTTPRequestHandler): + def _set_response(self): + self.send_response(200) + self.send_header('Content-type', 'text/html') + self.end_headers() + + def do_GET(self): + print("----->GET request:\n---->Path:\n %s\n---->Headers:\n%s\n", str(self.path), str(self.headers)) + self._set_response() + print("--->write") + self.wfile.write("-->GET request for {}".format(self.path).encode('utf-8')) + print("--->do_GET end") + + def do_POST(self): + content_length = int(self.headers['Content-Length']) # <--- Gets the size of data + post_data = self.rfile.read(content_length) # <--- Gets the data itself + print("----->POST request:\n----->Path: %s\n----->Headers:\n%s\n----->Body:\n%s\n", + str(self.path), str(self.headers), post_data.decode('utf-8')) + print("--->write") + self._set_response() + self.wfile.write("-->POST request for {}".format(self.path).encode('utf-8')) + print("--->do_POST end") + + +def run(server_class=HTTPServer, handler_class=S, port=5000): + server_address = ('', port) + httpd = server_class(server_address, handler_class) + logging.info('Starting httpd...Port Number:' + str(port)) + try: + httpd.serve_forever() + except KeyboardInterrupt: + pass + httpd.server_close() + logging.info('Stopping httpd...\n') + +run() diff --git a/text/LICENSE b/text/LICENSE new file mode 100644 index 0000000..91483e2 --- /dev/null +++ b/text/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 Keith Ito + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/text/__init__.py b/text/__init__.py new file mode 100644 index 0000000..e6798ed --- /dev/null +++ b/text/__init__.py @@ -0,0 +1,60 @@ +""" from https://github.com/keithito/tacotron """ +from text import cleaners +from text.symbols import symbols + + +# Mappings from symbol to numeric ID and vice versa: +_symbol_to_id = {s: i for i, s in enumerate(symbols)} +_id_to_symbol = {i: s for i, s in enumerate(symbols)} + + +def text_to_sequence(text, symbols, cleaner_names): + '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. + Args: + text: string to convert to a sequence + cleaner_names: names of the cleaner functions to run the text through + Returns: + List of integers corresponding to the symbols in the text + ''' + sequence = [] + symbol_to_id = {s: i for i, s in enumerate(symbols)} + clean_text = _clean_text(text, cleaner_names) + print(clean_text) + print(f" length:{len(clean_text)}") + for symbol in clean_text: + if symbol not in symbol_to_id.keys(): + continue + symbol_id = symbol_to_id[symbol] + sequence += [symbol_id] + print(f" length:{len(sequence)}") + return sequence + + +def cleaned_text_to_sequence(cleaned_text, symbols): + '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. + Args: + text: string to convert to a sequence + Returns: + List of integers corresponding to the symbols in the text + ''' + symbol_to_id = {s: i for i, s in enumerate(symbols)} + sequence = [symbol_to_id[symbol] for symbol in cleaned_text if symbol in symbol_to_id.keys()] + return sequence + + +def sequence_to_text(sequence): + '''Converts a sequence of IDs back to a string''' + result = '' + for symbol_id in sequence: + s = _id_to_symbol[symbol_id] + result += s + return result + + +def _clean_text(text, cleaner_names): + for name in cleaner_names: + cleaner = getattr(cleaners, name) + if not cleaner: + raise Exception('Unknown cleaner: %s' % name) + text = cleaner(text) + return text diff --git a/text/__pycache__/__init__.cpython-310.pyc b/text/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2523766248756e22dae0f02779ff079f193725f1 GIT binary patch literal 2493 zcmd5;&2J+$6t_K-WRgynZVF|KggPLQHY_B|1yEE~pq2yDY7Z1H71bymyXmOOOkz9B zHgYbs63Y=GP6%l^_FwXW3nwmI_Qr|#JV`q(tk~mPvd5p#@8kD=p1j#?5GbGg^_BR! zM#vvHC>IX~pF&j}8cy~Jr<@Jxi0w0qeQ)TE{Cyw#KChe;Q4#(b-6dyqzsjpOW@@~~ zgLASU@H%h6x6W612;T;8@>}p-;jiqG_Ui0jbR_dpbgcDQ^}5|bs*k6Kog^Q1PXzQ+ zop*IV$+gV0=uc3Kw5bh}q3CBqD(KhL>F6*Ys)XX=qM#u@)E%hL)}cv>AqTZ@*qqLp zVTS(1CTx#f5Lto63(vC7eM?hIm78$Q-ye2mp6l*z3OeAeQyb8aLHcBKan>uH^&rH4|2+uJPM(3|w2JzX z(lX5kQGOJm|012^oR~~SmI$2vVpl~;E~QZ8Jma_(w&-IKEg~JInH%EiP9uWynH;E| z>qSmxZ+QnCOp1%IU$fY|fKi4QnHB@U=?mKf!u}H|dk{m35iMchd60M&w;?2E@1TofoySY}cD9Cj z(jThr&J|E+K{OQEKp*$o6lxBZ9Uj&{S$Gj+JW_PMI!8M z^O`4Zu)NQPMa)o#l-ov0VzpSY^~H{qmrO%=+tr)eV;ZSD(D*@%HfTUwP(#XG+oC>| z8?cyQ(k%;Wx2)5i|oN>TpgCeL|iRpc^9D6QHaO@}r|{2a-0Gw_$IaNn~01Iy4tl zzJ`4iCLMelTSLe~$Hi@!RCrZHW-p@a)j=woaIEdwuxz3Oy>xlz?tA0%(mUmCWly|? zDqzO8Y7VJyLid^{Fu4(_J5bfz&~OS~07M=%<_t)i0o{6r8V|^pPJBZFqilAsjL{n$ zde~1+7PRLW*W%OJggkV5xmUC8J1cAz$aXr^5|c~Tv2k`?IdgTH(Rdc~@&i;8{p_;< z@~?r}hc;fzKD6ob8M+Sx1Ahw#YiJKVJ^1i=##6W9;egRP4k*C3=7R*RQl=YF)ZLJ83ykV5Q1zSFX zs*o%T8^Xd8TzS|IZ7q&@p2Tq>(%lrI^_|62Q~&`X0*)uM@JGP?OfyTE9r3M g-C%2!^XX7*!$V0Fs_&B!n62dl!+F7a5Qg=C0MWQuF#rGn literal 0 HcmV?d00001 diff --git a/text/__pycache__/__init__.cpython-37.pyc b/text/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fefc959a48283e047f64dfd10b000d282fa8470a GIT binary patch literal 2344 zcmd5;Pj4GV6rY)0@2(v?4QYu|)Waf$ilvdm0fb~lQ6S-fgnDQMm8?W7XJ_K9V(;2B zY&$S+?*3M2h)#szrW|H@JE(GwY z&UbVt$+gV0@GmfnMAQUHPjoUN74W{g>YwI4l~7!ShEBN951^|JASo%x$?7qi&X}0`iCZPiNE0=3;;hpbsukLgwF{I@*TS<=mgqFk6iSezg=(-t=A-VpmGwmEk<8{se3>eZg3?Tj zE`aj2{Q+UGK;{T?_#dcU;NrC)a}TAJ2pw->2xFbcv+y@}dwJ67slDa`(&HfPiL9&7 zTT#VSMKZ1qJ5s)I)LsCycH8NagW`6H5N_f0FOZxcoT;uaAChmqs?BUJ?^qW5 zF6zcIN&HnR5j1mL;4Grn;^HAN9MEw20C910Z^9r342quv?}h`Vj}B{3Au50sHh#2> zm0K09eMUC{kcrQfX0?hl^DTd)l~m3_pS zYjIzv@&U{xm{n}()BI8R2nLtU0-ouUhv*MH1^5s+g`>9M5rEMK+<@=EzXERp8G7I$ z03%|L$9KQVF0%ZaY*rsz;d=@mOus91M{6ljp{ag;nTP>aO>pTB%*ZvIcCo;={W2x; z7BD2<-jAWHIuHV0)Tm4A@UttAqq_0qnCD3xmm*P9yN=#BO8_ccYb1t2zK!G^BzWa* ner-UktR>ADld_rwyZxMxdSVa%G$^#!YIoP^x)W>!D?#;doi{md literal 0 HcmV?d00001 diff --git a/text/__pycache__/cleaners.cpython-310.pyc b/text/__pycache__/cleaners.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..544c9badb7159237ca1825705b1b9cbef066ac0c GIT binary patch literal 4968 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 literal 0 HcmV?d00001 diff --git a/text/__pycache__/english.cpython-310.pyc b/text/__pycache__/english.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c8f61b217025afe19af42550b2be4a6725743a6 GIT binary patch literal 4702 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 literal 0 HcmV?d00001 diff --git a/text/__pycache__/japanese.cpython-37.pyc b/text/__pycache__/japanese.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b555d5d3310eed956b44850695afa3e3d091f60 GIT binary patch literal 4599 zcmc&1O>Y~=b!K--E+vwpB}JAJM{t`o&{~y5NlscBu0IkLNQ**1688fXDPqN0iWHZ- z)aeC+Xk_JvnGmpg@CO(gL;GU$CblI{DO7FTS+z%`Pd5P7xGM zVG=X*-pst2_ujm(eKnmPBJjKO_k(h7oRCvQx<3_wThP4UK*tE9Hp%0t*t9|Ol!kLk zUa`ob%G4v8*CeC?6k{@^DA+l0Iq*7U21O$c^?3Y4h*+k@O zh`cP3S6-3ZR#>rJTHpA;UQnhe6#Nuu323iD^In2(i}<8Cy-x)>q>T8K(J3-PjwnFN z6saf&%8mwFQQOMbJdUS4!p=|vg^7P;+d_0c7tq~b6RyMZosF6Vx7&)dfl#$3#r^bH&R4hpi6?$~jFgq|#NQ+QowicDg24CX z_JK>0LH z<@$j9D8gEw{LRed4bj?tM@shXK*mP~LB-~Or zw#iTus9tLmc4!#(f*7~9tleOkTTR<6TMf$*1ED1t`<#Mn>b?fM;v(T|N6J0Q zKlC9}*H!)_7?p1jI8Q%J!W!L=0re74$0F(%fjYjQ0O}#8`iUduaG2pf-Pc*Hp5Ts8 zeEkrzGsCqM`+vzc?V!_oaQKhCs^WD4XC z`2Zf`AkQ=#*-tssy%V3<2lu6X;Jl8~=lxUHBoJC&ez-pAw1hMxwBxK!t%s|;|gojb?e?jxw@Duy=j$eO>6Fs zS#||?o%yP0*a3M=FSk>LxtaBi!ff%1QJ9Sq9~f%Q&Z|wc6)5Fu6sZHni@*-d+5vr| zon5$nZKg1Hb3He=Qk(_)cCs)#Q(zL*BXHr-zu+f}0~vQApgqD&79j^lR@!jrAu+FM z*F-SVbDUDcPOD*Y5Hg50Oi`|azjd9gRIZxbEDMW!!EkfWZCcK@ zFztGN4EzljN|lyvmt9BtU)%$I0ex(XyRBxBi2N{6YmNw1+j2N^X{7nHFyxaS_$NMq zhxZ~&v=->y$slf# zxZ5zdYo(vS+m_678Secq?DlRzM--i=;IGjM@O~ZsLjaA!n5CnNqD%lbK`+y|qR>mq zI2}?Zp=Bk_CCV|%_F~2V5aLoLZkcw;bL%bF39FsE51~|O+A36L1tc1}PDrKmSA<`0|;5Q7@SnMvu zVN4Z5i{f!C93id5`_c;R?@KG+jQl^o)>h}|=R=42*+=cv%(_`?S#HrNEY9}yg@rff zg}0!|l;x8{h}uW8W@nJHx_E~&brMR}iJv=kLmQuXNw*Q5+){3cqFawkz$AOzDIf~dL;Gy zBb^iWOvI7%A}*cj;R~hB4oJK7F0k%lO^xDWERdpp8}Oc}XcPGTBI|+g0dQVauvD;4 z$c+@gtmT+sde3r`@J&73vs|?06ibJ8EX$qD8rI=5J^bZ&VV3BGHTU}gy&|E%-G5A9 z2%%rKusT80efZ!h+AhBhTzmj6G~2HZXm$BXyKP|tn3=hGZNo2k28_b<#l!dg^?Fkj zjj(tuES`L9XdIP4VBg?DNIw_~2VZmfJ!Gl-nv>FeGnBs$v&Lv>CFr7j4m*5O{&nnT zu$#p0RqW83`M0pUi5=F4q0jX!kfSMteB#-CY{^)S#Uprk!(}box`E~+LkVUbUDIe> W#g>U>vhde4x*pdJXmNd5PyQR%Q3&$@ literal 0 HcmV?d00001 diff --git a/text/__pycache__/korean.cpython-310.pyc b/text/__pycache__/korean.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c18ebbd311515a2e82dfd3ee60ae14dab14b6090 GIT binary patch literal 5588 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 literal 0 HcmV?d00001 diff --git a/text/__pycache__/korean.cpython-37.pyc b/text/__pycache__/korean.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9eb67ffcee7e16d875dd3c6c873c77e5abc5ad0 GIT binary patch literal 5746 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 XB}uGZSG&G;RX7+9MPCZnha>+5R0ZnR literal 0 HcmV?d00001 diff --git a/text/__pycache__/mandarin.cpython-310.pyc b/text/__pycache__/mandarin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df68a069183a22f3dc9a3882796d46cf810418a0 GIT binary patch literal 5994 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 literal 0 HcmV?d00001 diff --git a/text/__pycache__/sanskrit.cpython-310.pyc b/text/__pycache__/sanskrit.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d691ac684bfc7217ce9baf40e7098fba9c4ce0bf GIT binary patch literal 1685 zcmZXU&2Jk;6u@U@*B?n7pp|G;4hV@7*a)0f;=mz_h#G_{p&UrXAv8E^&(_&y?R95o ztJHFks-)t8Div`;6;do>Duh6AB9Ram$RR0z!JJ$;^}?+et5SIHjcdEG){NhK^LuaJ zyxn>6fi z%g(Si2T7b|SH&0Nx`4n=Q@oZajPwX6PZ*&BldHtFMi>RC7S9{L`5jYvSngezRdK9m z7sG0({iyUocr_?32kJ(kN|iLxacx!yn|c;=+)$w|Hg1~nxhPCD2At1Ahy*j8W(sTN z&A1Nzp~qOe-+yk3`X_^Zejqo!HgqG| zy6LrHM*DY&lp`d`mXssp!Dp}ol+JKX8EP9FtAV0DtF~E7BIJ-j(Gt=U4I&yt0!2$S zEKw$+JS0%GMA;HI)oIuq&Wr^(yhne>+k+Z>(-aBit7zruxBg1>=bkE%qv7jz>03|q z`0EB@_4ubfKCI)mdKt)Pt{Hw?__8j-NSZLU*e={;DcWL-X}&A)4!2m_>1!F89no@w zHD?zn?Oe;i$P%4fWUCWb#1`KY7^lTs!g^kxrnq@ICdYSRKcrg>uI|JVeOKMi-E<5x z>F#~m-TSfIxs&46x{}OvJ9{vnGrUOa14~o9`AUk1AWJ93a=cOWK8B01I`eS9^UQ&< zDd06(hLN0u$sV{3Jw=M!&`G2-Wo>SoPeJpV!ql=$wxyiFqh10pg@rSG1{zqVs^YZa zafR)Qx{96f3?@Gp`L(k2=jT96@D1l#mWvYsBTxVCN%K`1-0iWOgpZZ^7Z{sn}z*OMR(eE@b@E2eR?w+_p yy#-5N#%B0pSeId?G@4x)*C}V^0Y~u2me`P0ziPEurcp4DZ!1B29yfFg#eV_AmAcaa literal 0 HcmV?d00001 diff --git a/text/__pycache__/sanskrit.cpython-37.pyc b/text/__pycache__/sanskrit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..131f9ac8f7638c1168ce59dc10a49a9a20a062e7 GIT binary patch literal 1627 zcmZXU&1)M+6u@U@^<~EnB&2bCXei{PT~kC3IR#_t#HHk-LmgUB<=QLFR^E6eZDwbK zBjiA^Lk}g8&{GKoi&_mOv^1yKP51(%z#*sI4C6-2ti(FP9&&ce6`Bfbct%35sc>;~6tn@iT>l25bK ztj$3a)9fqpNZd+6P^T#_#0sOlLg5M{ly9;m$xD?j>kC_|6riyttP*F!%m^_}cK4 z48g##Zw(0;N80cPO&WHx zM%>z8_kM%m7!=i2BGwLnMZ8Kxbx5FUi7FEPl!zVWG zO$&8KAk_O%2cdtkc7Hr;iu#v>eSRi4y)two-MZ6Vlu@k;J*&1^OCscuK-Ch`5)l#6kU-TEktNDRl!pYWmMB}|jyeIG!tj;d5rPC#`!8Zg( zYVnq^zPAdW+t@idCdap6PxNRpxS+=h^jUQ~50f#-rn~cPcjuRG=Rtxus}#?4J3AoH z8=j~2fu$)vd@sR+kfoDMfcin+{Q~a6(#+9rXK-M=_IN`UVZ`S_*aNqrYe;b)dWCeR ztS!~%Q_z~GFs)3%HjV$_QPbe1uyBUYKzmA8RU?U9uCO6d->?GnH@Vr+tCgiUHw!cB z5{x&`N&mK2_o|)>mUUw}h`ju4*r<46JO_&9-JHoPKMK8yuP|TZ#7SAN2P-kLDIM>Xfm%035+18)Ac1{TkI8 TG70@Td^a(^#2lYU9nb#{Dh#V` literal 0 HcmV?d00001 diff --git a/text/__pycache__/symbols.cpython-310.pyc b/text/__pycache__/symbols.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18bf0070c98cc839ef485608a801b9a459d4f442 GIT binary patch literal 480 zcmYjNJ#Q015Z&E7-#I3sgoa`fRZy@gDF`2mDUeVEGSx}2INq^yaK1g=?k08$1d3!K zpmCrhtS`d zI2oQ3H(bf41CAmzcOp5CFeee=UgXXCfO{BxAlvvXa_r4GszBvK!2ORn3VEf47K5$j zS`)f)3X-aIpb``nT`GtDHIYcFC2$(2RKY+w&a|RR91ZpbhooM!m}$2uTB@JFe(7oX zY@#1HwR*3;#-ZC=j~_ot`l-mI(i@wD;g%UsC&hL#o_;pp%~$i*yf;6myXKwwW>TVJ{P^?AOv>lKirq&KFI-&Sf3g3%9PN~&H|1zd4>4U`tlE$fq84w@De*nX+tmH)fXBK}eHEa49b0;zv|) zAWkIW(m2dY`~iDh{t73v!h3n&_g?Z|^1k=RTU(Pr*~R5ozPA~Gq}O(ml$c)tP) zFrW}a8pAQFVU58h$aEH~zz(2Tix|gQ{H%%U=MX1od=_*!Z4M>VtYF%VBeBd7X976| z#LLA+$KuH2j3U!Uf|Z0~*AqxMzl}wQGAoq~Ao0{zpf}Yy(zg|E*S$GaWoB}Vloghi z&6QQFXge+!-ugzVyeVsqx?k~Yjca)?Z{@K(mCua_c_Q!Rm3;E|QPv&p>K#X-A0fgggSXb0-d-yid%^5*?HmRgz4DWAQlsX zt?@v&OfG`NpP(Ra+LV>BF*`jrF-fMOkk zSTBMgdeB4>QShKBZ2pxwEqLzbc-DN(0Z{Gagn>X)`J2H|d@Lm2hZPrtS z{6et(V*su~^Twg$gj1VTaAY=hScOqyvQ<*ixW-c*!qbyvl~z(b!?PVyN%I`v1!IQO zDWd0p0|P1RRA$S8Gd*uuHHs4Tp`k3a>(IPW=<1|J?(J(+pL8iFEz0R3a*+6Bf%O<5 zc8JWe7i^IMwYI`edIH&gW2bA92~%ckuG6$^Q|52oEZ@0%c;t^a9zJRY1J*?u&cMNIkP%tiX~H2Yk}vxPSH1){h|-<7Mc%be%!V^ABjsj*zTd% zqeKj$)x$tejUWT_sQ)MmzapMZaQG$)eMFV?%3L$S;alb5VnQE+J3pfE6K)ZTD6#k<>OV)RH*l0MDDoB8E5#Kk{5}f%xW1(D zC$;_{ID&qM5YTTCgdJ}Jf)92-Mq#o^;ME2D2agAitSc`bDtCeMJM2L#D`F3*4rv^3;nqX81)Gq=QD*t*~AWNy!I(*-U;Y9 z?Gm4MnXk1-H^o_xcGFODw8vIy5B}JcBykCB&~ti5rWRbQA+<)}$h}Z*v!%tA1GAqocZPZMi#(|0JBI)pHkhyW&aAvttI*s07!k-{3M}fHNyVbZZ z#%;G|*j}lysi`voZwZl_7tBJvr?7JaS=N_TD)spEby9zinHVL Wz&1;mSRNK%4lHG~-CFM0u=Woc1EjnF literal 0 HcmV?d00001 diff --git a/text/__pycache__/thai.cpython-37.pyc b/text/__pycache__/thai.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..903b8ba8a1b5b968ae015f7cc7fce3fb35b5fdc8 GIT binary patch literal 1410 zcmZWp&1(}u6rY*RSJMxqltLAIC|bK(W5HVqiP{$N62S(9kW!M&Hcj1R)7jmch6L0G zEY?dw5Itz3l%mjsqOkc__O#&1f1xMe+e|-FH_Y4ly?yhW-@JJ*4~B=M1fI0FUnm9$ z`Ger(VKBJ|!;FLBgj1bl@Xd5uW*J6_#&$?X;R+A52oElj9hwR75D&LVCdeav0Nx=^ zmx&tv3k)QsQa7Bk%jxx8sX);K4{j2Mu>ixo38qLIWM!&JEz+i(G$^MNWSm%JgLN1n zHbK_dKHCfctx{*#O@T~*(Wr{cgyx0|M!8zjH8=X`Ve0XdrG@*;ODc0&Y|f>%Z$u10 z=<(R%e0Hm3nORG#Sy>Ad#j4xK(YRhREnJ_7K$MB%LPQKA`DNgsIXeV%ulvGtju7X2 z*!k!=zY!NC-jkS1{7zy`;vToo(EG?KvIvRxWx!px2OeujF>s9(F!Sg_}Kk2ju+noI_k9 zBvEh2uU_{pddtimO!Ya^@2BQ(hBkBMo(ojpYW{bR%cE!J;tisv8zsRnHYPmHKJ% zi@#^E@7+jT&z18$m$-pyV37J%pk1|$Rlg_Vx>3mKW+HYHr!oP56U0?aI}hy~!1lRF zI(Uv@8hNpe2o-n0o~A(ofW72r_Zm!UlNMPdE8|(#q)mniY0w74JU7W^=qY3z5 2: + return match + ' dollars' # Unexpected format + dollars = int(parts[0]) if parts[0] else 0 + cents = int(parts[1]) if len(parts) > 1 and parts[1] else 0 + if dollars and cents: + dollar_unit = 'dollar' if dollars == 1 else 'dollars' + cent_unit = 'cent' if cents == 1 else 'cents' + return '%s %s, %s %s' % (dollars, dollar_unit, cents, cent_unit) + elif dollars: + dollar_unit = 'dollar' if dollars == 1 else 'dollars' + return '%s %s' % (dollars, dollar_unit) + elif cents: + cent_unit = 'cent' if cents == 1 else 'cents' + return '%s %s' % (cents, cent_unit) + else: + return 'zero dollars' + + +def _expand_ordinal(m): + return _inflect.number_to_words(m.group(0)) + + +def _expand_number(m): + num = int(m.group(0)) + if num > 1000 and num < 3000: + if num == 2000: + return 'two thousand' + elif num > 2000 and num < 2010: + return 'two thousand ' + _inflect.number_to_words(num % 100) + elif num % 100 == 0: + return _inflect.number_to_words(num // 100) + ' hundred' + else: + return _inflect.number_to_words(num, andword='', zero='oh', group=2).replace(', ', ' ') + else: + return _inflect.number_to_words(num, andword='') + + +def normalize_numbers(text): + text = re.sub(_comma_number_re, _remove_commas, text) + text = re.sub(_pounds_re, r'\1 pounds', text) + text = re.sub(_dollars_re, _expand_dollars, text) + text = re.sub(_decimal_number_re, _expand_decimal_point, text) + text = re.sub(_ordinal_re, _expand_ordinal, text) + text = re.sub(_number_re, _expand_number, text) + return text + + +def mark_dark_l(text): + return re.sub(r'l([^aeiouæɑɔəɛɪʊ ]*(?: |$))', lambda x: 'ɫ'+x.group(1), text) + + +def english_to_ipa(text): + text = unidecode(text).lower() + text = expand_abbreviations(text) + text = normalize_numbers(text) + phonemes = ipa.convert(text) + phonemes = collapse_whitespace(phonemes) + return phonemes + + +def english_to_lazy_ipa(text): + text = english_to_ipa(text) + for regex, replacement in _lazy_ipa: + text = re.sub(regex, replacement, text) + return text + + +def english_to_ipa2(text): + text = english_to_ipa(text) + text = mark_dark_l(text) + for regex, replacement in _ipa_to_ipa2: + text = re.sub(regex, replacement, text) + return text.replace('...', '…') + + +def english_to_lazy_ipa2(text): + text = english_to_ipa(text) + for regex, replacement in _lazy_ipa2: + text = re.sub(regex, replacement, text) + return text diff --git a/text/japanese.py b/text/japanese.py new file mode 100644 index 0000000..7430cec --- /dev/null +++ b/text/japanese.py @@ -0,0 +1,153 @@ +import re +from unidecode import unidecode +import pyopenjtalk + + +# Regular expression matching Japanese without punctuation marks: +_japanese_characters = re.compile( + r'[A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]') + +# Regular expression matching non-Japanese characters or punctuation marks: +_japanese_marks = re.compile( + r'[^A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]') + +# List of (symbol, Japanese) pairs for marks: +_symbols_to_japanese = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('%', 'パーセント') +]] + +# List of (romaji, ipa) pairs for marks: +_romaji_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('ts', 'ʦ'), + ('u', 'ɯ'), + ('j', 'ʥ'), + ('y', 'j'), + ('ni', 'n^i'), + ('nj', 'n^'), + ('hi', 'çi'), + ('hj', 'ç'), + ('f', 'ɸ'), + ('I', 'i*'), + ('U', 'ɯ*'), + ('r', 'ɾ') +]] + +# List of (romaji, ipa2) pairs for marks: +_romaji_to_ipa2 = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('u', 'ɯ'), + ('ʧ', 'tʃ'), + ('j', 'dʑ'), + ('y', 'j'), + ('ni', 'n^i'), + ('nj', 'n^'), + ('hi', 'çi'), + ('hj', 'ç'), + ('f', 'ɸ'), + ('I', 'i*'), + ('U', 'ɯ*'), + ('r', 'ɾ') +]] + +# List of (consonant, sokuon) pairs: +_real_sokuon = [(re.compile('%s' % x[0]), x[1]) for x in [ + (r'Q([↑↓]*[kg])', r'k#\1'), + (r'Q([↑↓]*[tdjʧ])', r't#\1'), + (r'Q([↑↓]*[sʃ])', r's\1'), + (r'Q([↑↓]*[pb])', r'p#\1') +]] + +# List of (consonant, hatsuon) pairs: +_real_hatsuon = [(re.compile('%s' % x[0]), x[1]) for x in [ + (r'N([↑↓]*[pbm])', r'm\1'), + (r'N([↑↓]*[ʧʥj])', r'n^\1'), + (r'N([↑↓]*[tdn])', r'n\1'), + (r'N([↑↓]*[kg])', r'ŋ\1') +]] + + +def symbols_to_japanese(text): + for regex, replacement in _symbols_to_japanese: + text = re.sub(regex, replacement, text) + return text + + +def japanese_to_romaji_with_accent(text): + '''Reference https://r9y9.github.io/ttslearn/latest/notebooks/ch10_Recipe-Tacotron.html''' + text = symbols_to_japanese(text) + sentences = re.split(_japanese_marks, text) + marks = re.findall(_japanese_marks, text) + text = '' + for i, sentence in enumerate(sentences): + if re.match(_japanese_characters, sentence): + if text != '': + text += ' ' + labels = pyopenjtalk.extract_fullcontext(sentence) + for n, label in enumerate(labels): + phoneme = re.search(r'\-([^\+]*)\+', label).group(1) + if phoneme not in ['sil', 'pau']: + text += phoneme.replace('ch', 'ʧ').replace('sh', + 'ʃ').replace('cl', 'Q') + else: + continue + # n_moras = int(re.search(r'/F:(\d+)_', label).group(1)) + a1 = int(re.search(r"/A:(\-?[0-9]+)\+", label).group(1)) + a2 = int(re.search(r"\+(\d+)\+", label).group(1)) + a3 = int(re.search(r"\+(\d+)/", label).group(1)) + if re.search(r'\-([^\+]*)\+', labels[n + 1]).group(1) in ['sil', 'pau']: + a2_next = -1 + else: + a2_next = int( + re.search(r"\+(\d+)\+", labels[n + 1]).group(1)) + # Accent phrase boundary + if a3 == 1 and a2_next == 1: + text += ' ' + # Falling + elif a1 == 0 and a2_next == a2 + 1: + text += '↓' + # Rising + elif a2 == 1 and a2_next == 2: + text += '↑' + if i < len(marks): + text += unidecode(marks[i]).replace(' ', '') + return text + + +def get_real_sokuon(text): + for regex, replacement in _real_sokuon: + text = re.sub(regex, replacement, text) + return text + + +def get_real_hatsuon(text): + for regex, replacement in _real_hatsuon: + text = re.sub(regex, replacement, text) + return text + + +def japanese_to_ipa(text): + text = japanese_to_romaji_with_accent(text).replace('...', '…') + text = re.sub( + r'([aiueo])\1+', lambda x: x.group(0)[0]+'ː'*(len(x.group(0))-1), text) + text = get_real_sokuon(text) + text = get_real_hatsuon(text) + for regex, replacement in _romaji_to_ipa: + text = re.sub(regex, replacement, text) + return text + + +def japanese_to_ipa2(text): + text = japanese_to_romaji_with_accent(text).replace('...', '…') + text = get_real_sokuon(text) + text = get_real_hatsuon(text) + for regex, replacement in _romaji_to_ipa2: + text = re.sub(regex, replacement, text) + return text + + +def japanese_to_ipa3(text): + text = japanese_to_ipa2(text).replace('n^', 'ȵ').replace( + 'ʃ', 'ɕ').replace('*', '\u0325').replace('#', '\u031a') + text = re.sub( + r'([aiɯeo])\1+', lambda x: x.group(0)[0]+'ː'*(len(x.group(0))-1), text) + text = re.sub(r'((?:^|\s)(?:ts|tɕ|[kpt]))', r'\1ʰ', text) + return text diff --git a/text/korean.py b/text/korean.py new file mode 100644 index 0000000..d6368c1 --- /dev/null +++ b/text/korean.py @@ -0,0 +1,210 @@ +import re +from jamo import h2j, j2hcj +import ko_pron + + +# This is a list of Korean classifiers preceded by pure Korean numerals. +_korean_classifiers = '군데 권 개 그루 닢 대 두 마리 모 모금 뭇 발 발짝 방 번 벌 보루 살 수 술 시 쌈 움큼 정 짝 채 척 첩 축 켤레 톨 통' + +# List of (hangul, hangul divided) pairs: +_hangul_divided = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('ㄳ', 'ㄱㅅ'), + ('ㄵ', 'ㄴㅈ'), + ('ㄶ', 'ㄴㅎ'), + ('ㄺ', 'ㄹㄱ'), + ('ㄻ', 'ㄹㅁ'), + ('ㄼ', 'ㄹㅂ'), + ('ㄽ', 'ㄹㅅ'), + ('ㄾ', 'ㄹㅌ'), + ('ㄿ', 'ㄹㅍ'), + ('ㅀ', 'ㄹㅎ'), + ('ㅄ', 'ㅂㅅ'), + ('ㅘ', 'ㅗㅏ'), + ('ㅙ', 'ㅗㅐ'), + ('ㅚ', 'ㅗㅣ'), + ('ㅝ', 'ㅜㅓ'), + ('ㅞ', 'ㅜㅔ'), + ('ㅟ', 'ㅜㅣ'), + ('ㅢ', 'ㅡㅣ'), + ('ㅑ', 'ㅣㅏ'), + ('ㅒ', 'ㅣㅐ'), + ('ㅕ', 'ㅣㅓ'), + ('ㅖ', 'ㅣㅔ'), + ('ㅛ', 'ㅣㅗ'), + ('ㅠ', 'ㅣㅜ') +]] + +# List of (Latin alphabet, hangul) pairs: +_latin_to_hangul = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ + ('a', '에이'), + ('b', '비'), + ('c', '시'), + ('d', '디'), + ('e', '이'), + ('f', '에프'), + ('g', '지'), + ('h', '에이치'), + ('i', '아이'), + ('j', '제이'), + ('k', '케이'), + ('l', '엘'), + ('m', '엠'), + ('n', '엔'), + ('o', '오'), + ('p', '피'), + ('q', '큐'), + ('r', '아르'), + ('s', '에스'), + ('t', '티'), + ('u', '유'), + ('v', '브이'), + ('w', '더블유'), + ('x', '엑스'), + ('y', '와이'), + ('z', '제트') +]] + +# List of (ipa, lazy ipa) pairs: +_ipa_to_lazy_ipa = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ + ('t͡ɕ','ʧ'), + ('d͡ʑ','ʥ'), + ('ɲ','n^'), + ('ɕ','ʃ'), + ('ʷ','w'), + ('ɭ','l`'), + ('ʎ','ɾ'), + ('ɣ','ŋ'), + ('ɰ','ɯ'), + ('ʝ','j'), + ('ʌ','ə'), + ('ɡ','g'), + ('\u031a','#'), + ('\u0348','='), + ('\u031e',''), + ('\u0320',''), + ('\u0339','') +]] + + +def latin_to_hangul(text): + for regex, replacement in _latin_to_hangul: + text = re.sub(regex, replacement, text) + return text + + +def divide_hangul(text): + text = j2hcj(h2j(text)) + for regex, replacement in _hangul_divided: + text = re.sub(regex, replacement, text) + return text + + +def hangul_number(num, sino=True): + '''Reference https://github.com/Kyubyong/g2pK''' + num = re.sub(',', '', num) + + if num == '0': + return '영' + if not sino and num == '20': + return '스무' + + digits = '123456789' + names = '일이삼사오육칠팔구' + digit2name = {d: n for d, n in zip(digits, names)} + + modifiers = '한 두 세 네 다섯 여섯 일곱 여덟 아홉' + decimals = '열 스물 서른 마흔 쉰 예순 일흔 여든 아흔' + digit2mod = {d: mod for d, mod in zip(digits, modifiers.split())} + digit2dec = {d: dec for d, dec in zip(digits, decimals.split())} + + spelledout = [] + for i, digit in enumerate(num): + i = len(num) - i - 1 + if sino: + if i == 0: + name = digit2name.get(digit, '') + elif i == 1: + name = digit2name.get(digit, '') + '십' + name = name.replace('일십', '십') + else: + if i == 0: + name = digit2mod.get(digit, '') + elif i == 1: + name = digit2dec.get(digit, '') + if digit == '0': + if i % 4 == 0: + last_three = spelledout[-min(3, len(spelledout)):] + if ''.join(last_three) == '': + spelledout.append('') + continue + else: + spelledout.append('') + continue + if i == 2: + name = digit2name.get(digit, '') + '백' + name = name.replace('일백', '백') + elif i == 3: + name = digit2name.get(digit, '') + '천' + name = name.replace('일천', '천') + elif i == 4: + name = digit2name.get(digit, '') + '만' + name = name.replace('일만', '만') + elif i == 5: + name = digit2name.get(digit, '') + '십' + name = name.replace('일십', '십') + elif i == 6: + name = digit2name.get(digit, '') + '백' + name = name.replace('일백', '백') + elif i == 7: + name = digit2name.get(digit, '') + '천' + name = name.replace('일천', '천') + elif i == 8: + name = digit2name.get(digit, '') + '억' + elif i == 9: + name = digit2name.get(digit, '') + '십' + elif i == 10: + name = digit2name.get(digit, '') + '백' + elif i == 11: + name = digit2name.get(digit, '') + '천' + elif i == 12: + name = digit2name.get(digit, '') + '조' + elif i == 13: + name = digit2name.get(digit, '') + '십' + elif i == 14: + name = digit2name.get(digit, '') + '백' + elif i == 15: + name = digit2name.get(digit, '') + '천' + spelledout.append(name) + return ''.join(elem for elem in spelledout) + + +def number_to_hangul(text): + '''Reference https://github.com/Kyubyong/g2pK''' + tokens = set(re.findall(r'(\d[\d,]*)([\uac00-\ud71f]+)', text)) + for token in tokens: + num, classifier = token + if classifier[:2] in _korean_classifiers or classifier[0] in _korean_classifiers: + spelledout = hangul_number(num, sino=False) + else: + spelledout = hangul_number(num, sino=True) + text = text.replace(f'{num}{classifier}', f'{spelledout}{classifier}') + # digit by digit for remaining digits + digits = '0123456789' + names = '영일이삼사오육칠팔구' + for d, n in zip(digits, names): + text = text.replace(d, n) + return text + + +def korean_to_lazy_ipa(text): + text = latin_to_hangul(text) + text = number_to_hangul(text) + text=re.sub('[\uac00-\ud7af]+',lambda x:ko_pron.romanise(x.group(0),'ipa').split('] ~ [')[0],text) + for regex, replacement in _ipa_to_lazy_ipa: + text = re.sub(regex, replacement, text) + return text + + +def korean_to_ipa(text): + text = korean_to_lazy_ipa(text) + return text.replace('ʧ','tʃ').replace('ʥ','dʑ') diff --git a/text/mandarin.py b/text/mandarin.py new file mode 100644 index 0000000..6cad78f --- /dev/null +++ b/text/mandarin.py @@ -0,0 +1,326 @@ +import os +import sys +import re +from pypinyin import lazy_pinyin, BOPOMOFO +import jieba +import cn2an +import logging + + +# List of (Latin alphabet, bopomofo) pairs: +_latin_to_bopomofo = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ + ('a', 'ㄟˉ'), + ('b', 'ㄅㄧˋ'), + ('c', 'ㄙㄧˉ'), + ('d', 'ㄉㄧˋ'), + ('e', 'ㄧˋ'), + ('f', 'ㄝˊㄈㄨˋ'), + ('g', 'ㄐㄧˋ'), + ('h', 'ㄝˇㄑㄩˋ'), + ('i', 'ㄞˋ'), + ('j', 'ㄐㄟˋ'), + ('k', 'ㄎㄟˋ'), + ('l', 'ㄝˊㄛˋ'), + ('m', 'ㄝˊㄇㄨˋ'), + ('n', 'ㄣˉ'), + ('o', 'ㄡˉ'), + ('p', 'ㄆㄧˉ'), + ('q', 'ㄎㄧㄡˉ'), + ('r', 'ㄚˋ'), + ('s', 'ㄝˊㄙˋ'), + ('t', 'ㄊㄧˋ'), + ('u', 'ㄧㄡˉ'), + ('v', 'ㄨㄧˉ'), + ('w', 'ㄉㄚˋㄅㄨˋㄌㄧㄡˋ'), + ('x', 'ㄝˉㄎㄨˋㄙˋ'), + ('y', 'ㄨㄞˋ'), + ('z', 'ㄗㄟˋ') +]] + +# List of (bopomofo, romaji) pairs: +_bopomofo_to_romaji = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('ㄅㄛ', 'p⁼wo'), + ('ㄆㄛ', 'pʰwo'), + ('ㄇㄛ', 'mwo'), + ('ㄈㄛ', 'fwo'), + ('ㄅ', 'p⁼'), + ('ㄆ', 'pʰ'), + ('ㄇ', 'm'), + ('ㄈ', 'f'), + ('ㄉ', 't⁼'), + ('ㄊ', 'tʰ'), + ('ㄋ', 'n'), + ('ㄌ', 'l'), + ('ㄍ', 'k⁼'), + ('ㄎ', 'kʰ'), + ('ㄏ', 'h'), + ('ㄐ', 'ʧ⁼'), + ('ㄑ', 'ʧʰ'), + ('ㄒ', 'ʃ'), + ('ㄓ', 'ʦ`⁼'), + ('ㄔ', 'ʦ`ʰ'), + ('ㄕ', 's`'), + ('ㄖ', 'ɹ`'), + ('ㄗ', 'ʦ⁼'), + ('ㄘ', 'ʦʰ'), + ('ㄙ', 's'), + ('ㄚ', 'a'), + ('ㄛ', 'o'), + ('ㄜ', 'ə'), + ('ㄝ', 'e'), + ('ㄞ', 'ai'), + ('ㄟ', 'ei'), + ('ㄠ', 'au'), + ('ㄡ', 'ou'), + ('ㄧㄢ', 'yeNN'), + ('ㄢ', 'aNN'), + ('ㄧㄣ', 'iNN'), + ('ㄣ', 'əNN'), + ('ㄤ', 'aNg'), + ('ㄧㄥ', 'iNg'), + ('ㄨㄥ', 'uNg'), + ('ㄩㄥ', 'yuNg'), + ('ㄥ', 'əNg'), + ('ㄦ', 'əɻ'), + ('ㄧ', 'i'), + ('ㄨ', 'u'), + ('ㄩ', 'ɥ'), + ('ˉ', '→'), + ('ˊ', '↑'), + ('ˇ', '↓↑'), + ('ˋ', '↓'), + ('˙', ''), + (',', ','), + ('。', '.'), + ('!', '!'), + ('?', '?'), + ('—', '-') +]] + +# List of (romaji, ipa) pairs: +_romaji_to_ipa = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ + ('ʃy', 'ʃ'), + ('ʧʰy', 'ʧʰ'), + ('ʧ⁼y', 'ʧ⁼'), + ('NN', 'n'), + ('Ng', 'ŋ'), + ('y', 'j'), + ('h', 'x') +]] + +# List of (bopomofo, ipa) pairs: +_bopomofo_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('ㄅㄛ', 'p⁼wo'), + ('ㄆㄛ', 'pʰwo'), + ('ㄇㄛ', 'mwo'), + ('ㄈㄛ', 'fwo'), + ('ㄅ', 'p⁼'), + ('ㄆ', 'pʰ'), + ('ㄇ', 'm'), + ('ㄈ', 'f'), + ('ㄉ', 't⁼'), + ('ㄊ', 'tʰ'), + ('ㄋ', 'n'), + ('ㄌ', 'l'), + ('ㄍ', 'k⁼'), + ('ㄎ', 'kʰ'), + ('ㄏ', 'x'), + ('ㄐ', 'tʃ⁼'), + ('ㄑ', 'tʃʰ'), + ('ㄒ', 'ʃ'), + ('ㄓ', 'ts`⁼'), + ('ㄔ', 'ts`ʰ'), + ('ㄕ', 's`'), + ('ㄖ', 'ɹ`'), + ('ㄗ', 'ts⁼'), + ('ㄘ', 'tsʰ'), + ('ㄙ', 's'), + ('ㄚ', 'a'), + ('ㄛ', 'o'), + ('ㄜ', 'ə'), + ('ㄝ', 'ɛ'), + ('ㄞ', 'aɪ'), + ('ㄟ', 'eɪ'), + ('ㄠ', 'ɑʊ'), + ('ㄡ', 'oʊ'), + ('ㄧㄢ', 'jɛn'), + ('ㄩㄢ', 'ɥæn'), + ('ㄢ', 'an'), + ('ㄧㄣ', 'in'), + ('ㄩㄣ', 'ɥn'), + ('ㄣ', 'ən'), + ('ㄤ', 'ɑŋ'), + ('ㄧㄥ', 'iŋ'), + ('ㄨㄥ', 'ʊŋ'), + ('ㄩㄥ', 'jʊŋ'), + ('ㄥ', 'əŋ'), + ('ㄦ', 'əɻ'), + ('ㄧ', 'i'), + ('ㄨ', 'u'), + ('ㄩ', 'ɥ'), + ('ˉ', '→'), + ('ˊ', '↑'), + ('ˇ', '↓↑'), + ('ˋ', '↓'), + ('˙', ''), + (',', ','), + ('。', '.'), + ('!', '!'), + ('?', '?'), + ('—', '-') +]] + +# List of (bopomofo, ipa2) pairs: +_bopomofo_to_ipa2 = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('ㄅㄛ', 'pwo'), + ('ㄆㄛ', 'pʰwo'), + ('ㄇㄛ', 'mwo'), + ('ㄈㄛ', 'fwo'), + ('ㄅ', 'p'), + ('ㄆ', 'pʰ'), + ('ㄇ', 'm'), + ('ㄈ', 'f'), + ('ㄉ', 't'), + ('ㄊ', 'tʰ'), + ('ㄋ', 'n'), + ('ㄌ', 'l'), + ('ㄍ', 'k'), + ('ㄎ', 'kʰ'), + ('ㄏ', 'h'), + ('ㄐ', 'tɕ'), + ('ㄑ', 'tɕʰ'), + ('ㄒ', 'ɕ'), + ('ㄓ', 'tʂ'), + ('ㄔ', 'tʂʰ'), + ('ㄕ', 'ʂ'), + ('ㄖ', 'ɻ'), + ('ㄗ', 'ts'), + ('ㄘ', 'tsʰ'), + ('ㄙ', 's'), + ('ㄚ', 'a'), + ('ㄛ', 'o'), + ('ㄜ', 'ɤ'), + ('ㄝ', 'ɛ'), + ('ㄞ', 'aɪ'), + ('ㄟ', 'eɪ'), + ('ㄠ', 'ɑʊ'), + ('ㄡ', 'oʊ'), + ('ㄧㄢ', 'jɛn'), + ('ㄩㄢ', 'yæn'), + ('ㄢ', 'an'), + ('ㄧㄣ', 'in'), + ('ㄩㄣ', 'yn'), + ('ㄣ', 'ən'), + ('ㄤ', 'ɑŋ'), + ('ㄧㄥ', 'iŋ'), + ('ㄨㄥ', 'ʊŋ'), + ('ㄩㄥ', 'jʊŋ'), + ('ㄥ', 'ɤŋ'), + ('ㄦ', 'əɻ'), + ('ㄧ', 'i'), + ('ㄨ', 'u'), + ('ㄩ', 'y'), + ('ˉ', '˥'), + ('ˊ', '˧˥'), + ('ˇ', '˨˩˦'), + ('ˋ', '˥˩'), + ('˙', ''), + (',', ','), + ('。', '.'), + ('!', '!'), + ('?', '?'), + ('—', '-') +]] + + +def number_to_chinese(text): + numbers = re.findall(r'\d+(?:\.?\d+)?', text) + for number in numbers: + text = text.replace(number, cn2an.an2cn(number), 1) + return text + + +def chinese_to_bopomofo(text): + text = text.replace('、', ',').replace(';', ',').replace(':', ',') + words = jieba.lcut(text, cut_all=False) + text = '' + for word in words: + bopomofos = lazy_pinyin(word, BOPOMOFO) + if not re.search('[\u4e00-\u9fff]', word): + text += word + continue + for i in range(len(bopomofos)): + bopomofos[i] = re.sub(r'([\u3105-\u3129])$', r'\1ˉ', bopomofos[i]) + if text != '': + text += ' ' + text += ''.join(bopomofos) + return text + + +def latin_to_bopomofo(text): + for regex, replacement in _latin_to_bopomofo: + text = re.sub(regex, replacement, text) + return text + + +def bopomofo_to_romaji(text): + for regex, replacement in _bopomofo_to_romaji: + text = re.sub(regex, replacement, text) + return text + + +def bopomofo_to_ipa(text): + for regex, replacement in _bopomofo_to_ipa: + text = re.sub(regex, replacement, text) + return text + + +def bopomofo_to_ipa2(text): + for regex, replacement in _bopomofo_to_ipa2: + text = re.sub(regex, replacement, text) + return text + + +def chinese_to_romaji(text): + text = number_to_chinese(text) + text = chinese_to_bopomofo(text) + text = latin_to_bopomofo(text) + text = bopomofo_to_romaji(text) + text = re.sub('i([aoe])', r'y\1', text) + text = re.sub('u([aoəe])', r'w\1', text) + text = re.sub('([ʦsɹ]`[⁼ʰ]?)([→↓↑ ]+|$)', + r'\1ɹ`\2', text).replace('ɻ', 'ɹ`') + text = re.sub('([ʦs][⁼ʰ]?)([→↓↑ ]+|$)', r'\1ɹ\2', text) + return text + + +def chinese_to_lazy_ipa(text): + text = chinese_to_romaji(text) + for regex, replacement in _romaji_to_ipa: + text = re.sub(regex, replacement, text) + return text + + +def chinese_to_ipa(text): + text = number_to_chinese(text) + text = chinese_to_bopomofo(text) + text = latin_to_bopomofo(text) + text = bopomofo_to_ipa(text) + text = re.sub('i([aoe])', r'j\1', text) + text = re.sub('u([aoəe])', r'w\1', text) + text = re.sub('([sɹ]`[⁼ʰ]?)([→↓↑ ]+|$)', + r'\1ɹ`\2', text).replace('ɻ', 'ɹ`') + text = re.sub('([s][⁼ʰ]?)([→↓↑ ]+|$)', r'\1ɹ\2', text) + return text + + +def chinese_to_ipa2(text): + text = number_to_chinese(text) + text = chinese_to_bopomofo(text) + text = latin_to_bopomofo(text) + text = bopomofo_to_ipa2(text) + text = re.sub(r'i([aoe])', r'j\1', text) + text = re.sub(r'u([aoəe])', r'w\1', text) + text = re.sub(r'([ʂɹ]ʰ?)([˩˨˧˦˥ ]+|$)', r'\1ʅ\2', text) + text = re.sub(r'(sʰ?)([˩˨˧˦˥ ]+|$)', r'\1ɿ\2', text) + return text diff --git a/text/ngu_dialect.py b/text/ngu_dialect.py new file mode 100644 index 0000000..cb1831d --- /dev/null +++ b/text/ngu_dialect.py @@ -0,0 +1,30 @@ +import re +import opencc + + +dialects = {'SZ': 'suzhou', 'WX': 'wuxi', 'CZ': 'changzhou', 'HZ': 'hangzhou', + 'SX': 'shaoxing', 'NB': 'ningbo', 'JJ': 'jingjiang', 'YX': 'yixing', + 'JD': 'jiading', 'ZR': 'zhenru', 'PH': 'pinghu', 'TX': 'tongxiang', + 'JS': 'jiashan', 'HN': 'xiashi', 'LP': 'linping', 'XS': 'xiaoshan', + 'FY': 'fuyang', 'RA': 'ruao', 'CX': 'cixi', 'SM': 'sanmen', + 'TT': 'tiantai', 'WZ': 'wenzhou', 'SC': 'suichang', 'YB': 'youbu'} + +converters = {} + +for dialect in dialects.values(): + try: + converters[dialect] = opencc.OpenCC(dialect) + except: + pass + + +def ngu_dialect_to_ipa(text, dialect): + dialect = dialects[dialect] + text = converters[dialect].convert(text).replace('-','').replace('$',' ') + text = re.sub(r'[、;:]', ',', text) + text = re.sub(r'\s*,\s*', ', ', text) + text = re.sub(r'\s*。\s*', '. ', text) + text = re.sub(r'\s*?\s*', '? ', text) + text = re.sub(r'\s*!\s*', '! ', text) + text = re.sub(r'\s*$', '', text) + return text diff --git a/text/sanskrit.py b/text/sanskrit.py new file mode 100644 index 0000000..bf39b6c --- /dev/null +++ b/text/sanskrit.py @@ -0,0 +1,62 @@ +import re +from indic_transliteration import sanscript + + +# List of (iast, ipa) pairs: +_iast_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('a', 'ə'), + ('ā', 'aː'), + ('ī', 'iː'), + ('ū', 'uː'), + ('ṛ', 'ɹ`'), + ('ṝ', 'ɹ`ː'), + ('ḷ', 'l`'), + ('ḹ', 'l`ː'), + ('e', 'eː'), + ('o', 'oː'), + ('k', 'k⁼'), + ('k⁼h', 'kʰ'), + ('g', 'g⁼'), + ('g⁼h', 'gʰ'), + ('ṅ', 'ŋ'), + ('c', 'ʧ⁼'), + ('ʧ⁼h', 'ʧʰ'), + ('j', 'ʥ⁼'), + ('ʥ⁼h', 'ʥʰ'), + ('ñ', 'n^'), + ('ṭ', 't`⁼'), + ('t`⁼h', 't`ʰ'), + ('ḍ', 'd`⁼'), + ('d`⁼h', 'd`ʰ'), + ('ṇ', 'n`'), + ('t', 't⁼'), + ('t⁼h', 'tʰ'), + ('d', 'd⁼'), + ('d⁼h', 'dʰ'), + ('p', 'p⁼'), + ('p⁼h', 'pʰ'), + ('b', 'b⁼'), + ('b⁼h', 'bʰ'), + ('y', 'j'), + ('ś', 'ʃ'), + ('ṣ', 's`'), + ('r', 'ɾ'), + ('l̤', 'l`'), + ('h', 'ɦ'), + ("'", ''), + ('~', '^'), + ('ṃ', '^') +]] + + +def devanagari_to_ipa(text): + text = text.replace('ॐ', 'ओम्') + text = re.sub(r'\s*।\s*$', '.', text) + text = re.sub(r'\s*।\s*', ', ', text) + text = re.sub(r'\s*॥', '.', text) + text = sanscript.transliterate(text, sanscript.DEVANAGARI, sanscript.IAST) + for regex, replacement in _iast_to_ipa: + text = re.sub(regex, replacement, text) + text = re.sub('(.)[`ː]*ḥ', lambda x: x.group(0) + [:-1]+'h'+x.group(1)+'*', text) + return text diff --git a/text/shanghainese.py b/text/shanghainese.py new file mode 100644 index 0000000..9b2cd22 --- /dev/null +++ b/text/shanghainese.py @@ -0,0 +1,64 @@ +import re +import cn2an +import opencc + + +converter = opencc.OpenCC('zaonhe') + +# List of (Latin alphabet, ipa) pairs: +_latin_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ + ('A', 'ᴇ'), + ('B', 'bi'), + ('C', 'si'), + ('D', 'di'), + ('E', 'i'), + ('F', 'ᴇf'), + ('G', 'dʑi'), + ('H', 'ᴇtɕʰ'), + ('I', 'ᴀi'), + ('J', 'dʑᴇ'), + ('K', 'kʰᴇ'), + ('L', 'ᴇl'), + ('M', 'ᴇm'), + ('N', 'ᴇn'), + ('O', 'o'), + ('P', 'pʰi'), + ('Q', 'kʰiu'), + ('R', 'ᴀl'), + ('S', 'ᴇs'), + ('T', 'tʰi'), + ('U', 'ɦiu'), + ('V', 'vi'), + ('W', 'dᴀbɤliu'), + ('X', 'ᴇks'), + ('Y', 'uᴀi'), + ('Z', 'zᴇ') +]] + + +def _number_to_shanghainese(num): + num = cn2an.an2cn(num).replace('一十','十').replace('二十', '廿').replace('二', '两') + return re.sub(r'((?:^|[^三四五六七八九])十|廿)两', r'\1二', num) + + +def number_to_shanghainese(text): + return re.sub(r'\d+(?:\.?\d+)?', lambda x: _number_to_shanghainese(x.group()), text) + + +def latin_to_ipa(text): + for regex, replacement in _latin_to_ipa: + text = re.sub(regex, replacement, text) + return text + + +def shanghainese_to_ipa(text): + text = number_to_shanghainese(text.upper()) + text = converter.convert(text).replace('-','').replace('$',' ') + text = re.sub(r'[A-Z]', lambda x: latin_to_ipa(x.group())+' ', text) + text = re.sub(r'[、;:]', ',', text) + text = re.sub(r'\s*,\s*', ', ', text) + text = re.sub(r'\s*。\s*', '. ', text) + text = re.sub(r'\s*?\s*', '? ', text) + text = re.sub(r'\s*!\s*', '! ', text) + text = re.sub(r'\s*$', '', text) + return text diff --git a/text/symbols.py b/text/symbols.py new file mode 100644 index 0000000..651d481 --- /dev/null +++ b/text/symbols.py @@ -0,0 +1,76 @@ +''' +Defines the set of symbols used in text input to the model. +''' + +# japanese_cleaners +# _pad = '_' +# _punctuation = ',.!?-' +# _letters = 'AEINOQUabdefghijkmnoprstuvwyzʃʧ↓↑ ' + + +'''# japanese_cleaners2 +_pad = '_' +_punctuation = ',.!?-~…' +_letters = 'AEINOQUabdefghijkmnoprstuvwyzʃʧʦ↓↑ ' +''' + + +'''# korean_cleaners +_pad = '_' +_punctuation = ',.!?…~' +_letters = 'ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㄲㄸㅃㅆㅉㅏㅓㅗㅜㅡㅣㅐㅔ ' +''' + +'''# chinese_cleaners +_pad = '_' +_punctuation = ',。!?—…' +_letters = 'ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩˉˊˇˋ˙ ' +''' + +# # zh_ja_mixture_cleaners +# _pad = '_' +# _punctuation = ',.!?-~…' +# _letters = 'AEINOQUabdefghijklmnoprstuvwyzʃʧʦɯɹəɥ⁼ʰ`→↓↑ ' + + +'''# sanskrit_cleaners +_pad = '_' +_punctuation = '।' +_letters = 'ँंःअआइईउऊऋएऐओऔकखगघङचछजझञटठडढणतथदधनपफबभमयरलळवशषसहऽािीुूृॄेैोौ्ॠॢ ' +''' + +'''# cjks_cleaners +_pad = '_' +_punctuation = ',.!?-~…' +_letters = 'NQabdefghijklmnopstuvwxyzʃʧʥʦɯɹəɥçɸɾβŋɦː⁼ʰ`^#*=→↓↑ ' +''' + +'''# thai_cleaners +_pad = '_' +_punctuation = '.!? ' +_letters = 'กขฃคฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลวศษสหฬอฮฯะัาำิีึืุูเแโใไๅๆ็่้๊๋์' +''' + +# # cjke_cleaners2 +_pad = '_' +_punctuation = ',.!?-~…' +_letters = 'NQabdefghijklmnopstuvwxyzɑæʃʑçɯɪɔɛɹðəɫɥɸʊɾʒθβŋɦ⁼ʰ`^#*=ˈˌ→↓↑ ' + + +'''# shanghainese_cleaners +_pad = '_' +_punctuation = ',.!?…' +_letters = 'abdfghiklmnopstuvyzøŋȵɑɔɕəɤɦɪɿʑʔʰ̩̃ᴀᴇ15678 ' +''' + +'''# chinese_dialect_cleaners +_pad = '_' +_punctuation = ',.!?~…─' +_letters = '#Nabdefghijklmnoprstuvwxyzæçøŋœȵɐɑɒɓɔɕɗɘəɚɛɜɣɤɦɪɭɯɵɷɸɻɾɿʂʅʊʋʌʏʑʔʦʮʰʷˀː˥˦˧˨˩̥̩̃̚ᴀᴇ↑↓∅ⱼ ' +''' + +# Export all symbols: +symbols = [_pad] + list(_punctuation) + list(_letters) + +# Special symbol ids +SPACE_ID = symbols.index(" ") diff --git a/text/thai.py b/text/thai.py new file mode 100644 index 0000000..0a42324 --- /dev/null +++ b/text/thai.py @@ -0,0 +1,44 @@ +import re +from num_thai.thainumbers import NumThai + + +num = NumThai() + +# List of (Latin alphabet, Thai) pairs: +_latin_to_thai = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ + ('a', 'เอ'), + ('b','บี'), + ('c','ซี'), + ('d','ดี'), + ('e','อี'), + ('f','เอฟ'), + ('g','จี'), + ('h','เอช'), + ('i','ไอ'), + ('j','เจ'), + ('k','เค'), + ('l','แอล'), + ('m','เอ็ม'), + ('n','เอ็น'), + ('o','โอ'), + ('p','พี'), + ('q','คิว'), + ('r','แอร์'), + ('s','เอส'), + ('t','ที'), + ('u','ยู'), + ('v','วี'), + ('w','ดับเบิลยู'), + ('x','เอ็กซ์'), + ('y','วาย'), + ('z','ซี') +]] + + +def num_to_thai(text): + return re.sub(r'(?:\d+(?:,?\d+)?)+(?:\.\d+(?:,?\d+)?)?', lambda x: ''.join(num.NumberToTextThai(float(x.group(0).replace(',', '')))), text) + +def latin_to_thai(text): + for regex, replacement in _latin_to_thai: + text = re.sub(regex, replacement, text) + return text From 66687f1232cf66f74bb899edb1ea9674b3691aaa Mon Sep 17 00:00:00 2001 From: root Date: Wed, 15 Nov 2023 17:35:22 +0000 Subject: [PATCH 08/17] =?UTF-8?q?=E5=BA=94=E8=AF=A5=E5=9F=BA=E4=BA=8Evits?= =?UTF-8?q?=E7=9A=84vc-inference=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio.mp3 | Bin 0 -> 7541 bytes audio.wav | Bin 0 -> 78380 bytes text/LICENSE | 19 -- text/__init__.py | 60 ---- text/__pycache__/__init__.cpython-310.pyc | Bin 2493 -> 0 bytes text/__pycache__/__init__.cpython-37.pyc | Bin 2344 -> 0 bytes text/__pycache__/cleaners.cpython-310.pyc | Bin 4968 -> 0 bytes text/__pycache__/cleaners.cpython-37.pyc | Bin 5450 -> 0 bytes text/__pycache__/english.cpython-310.pyc | Bin 4702 -> 0 bytes text/__pycache__/english.cpython-37.pyc | Bin 4932 -> 0 bytes text/__pycache__/japanese.cpython-310.pyc | Bin 4140 -> 0 bytes text/__pycache__/japanese.cpython-37.pyc | Bin 4599 -> 0 bytes text/__pycache__/korean.cpython-310.pyc | Bin 5588 -> 0 bytes text/__pycache__/korean.cpython-37.pyc | Bin 5746 -> 0 bytes text/__pycache__/mandarin.cpython-310.pyc | Bin 5994 -> 0 bytes text/__pycache__/mandarin.cpython-37.pyc | Bin 7511 -> 0 bytes text/__pycache__/sanskrit.cpython-310.pyc | Bin 1685 -> 0 bytes text/__pycache__/sanskrit.cpython-37.pyc | Bin 1627 -> 0 bytes text/__pycache__/symbols.cpython-310.pyc | Bin 480 -> 0 bytes text/__pycache__/symbols.cpython-37.pyc | Bin 417 -> 0 bytes text/__pycache__/thai.cpython-310.pyc | Bin 1449 -> 0 bytes text/__pycache__/thai.cpython-37.pyc | Bin 1410 -> 0 bytes text/cantonese.py | 59 ---- text/cleaners.py | 129 --------- text/english.py | 188 ------------- text/japanese.py | 153 ---------- text/korean.py | 210 -------------- text/mandarin.py | 326 ---------------------- text/ngu_dialect.py | 30 -- text/sanskrit.py | 62 ---- text/shanghainese.py | 64 ----- text/symbols.py | 76 ----- text/thai.py | 44 --- 33 files changed, 1420 deletions(-) create mode 100644 audio.mp3 create mode 100644 audio.wav delete mode 100644 text/LICENSE delete mode 100644 text/__init__.py delete mode 100644 text/__pycache__/__init__.cpython-310.pyc delete mode 100644 text/__pycache__/__init__.cpython-37.pyc delete mode 100644 text/__pycache__/cleaners.cpython-310.pyc delete mode 100644 text/__pycache__/cleaners.cpython-37.pyc delete mode 100644 text/__pycache__/english.cpython-310.pyc delete mode 100644 text/__pycache__/english.cpython-37.pyc delete mode 100644 text/__pycache__/japanese.cpython-310.pyc delete mode 100644 text/__pycache__/japanese.cpython-37.pyc delete mode 100644 text/__pycache__/korean.cpython-310.pyc delete mode 100644 text/__pycache__/korean.cpython-37.pyc delete mode 100644 text/__pycache__/mandarin.cpython-310.pyc delete mode 100644 text/__pycache__/mandarin.cpython-37.pyc delete mode 100644 text/__pycache__/sanskrit.cpython-310.pyc delete mode 100644 text/__pycache__/sanskrit.cpython-37.pyc delete mode 100644 text/__pycache__/symbols.cpython-310.pyc delete mode 100644 text/__pycache__/symbols.cpython-37.pyc delete mode 100644 text/__pycache__/thai.cpython-310.pyc delete mode 100644 text/__pycache__/thai.cpython-37.pyc delete mode 100644 text/cantonese.py delete mode 100644 text/cleaners.py delete mode 100644 text/english.py delete mode 100644 text/japanese.py delete mode 100644 text/korean.py delete mode 100644 text/mandarin.py delete mode 100644 text/ngu_dialect.py delete mode 100644 text/sanskrit.py delete mode 100644 text/shanghainese.py delete mode 100644 text/symbols.py delete mode 100644 text/thai.py diff --git a/audio.mp3 b/audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..01e7b3615be5f4d192f3147b298fef248ff35d61 GIT binary patch literal 7541 zcmdVfyZhZj3GNgPUZe!q;_eW<#VfQFXoCbR z)?#_f{hW8L^A9{9&i*iS?KNv=_HSK#W?!>LO;H30xNA^D0|TYMdr|-ZPtzvQQA~ng z{4u|fpy0np|Fgkf!3O?U_dlVUr=!>3=ko1444yT`}JzkmP6V(;$!caU~}2Pq_S*ZKdA4Hx#G@V=_B zSMAS#W9*gg2mqkQ>p?(3=o_w^ZfAH74kjhJkt}eKcM@z|XW&A7jUUCTh_#=D7oZQ+ zDQ`Adfn*sGgsEgesk!Wjlt+y)GA>`ziR=&&eoJ1`h76W(w+2-s2P0J1v61UYoO6L0 z{K-m29J@~McMlsL%*B`g2)GBP;|%i|UZS;!`uHE}PDikm?G+evu8GPMjM&WRB;swZ z@&ah6sja^Ipppt2UXnn`C59|4&cjsJ4sVyZBf^z^7Zm0Pwh`?3Mlq2^N^lVoVaX3a2g_p<5%ol6^;-ZDrKT?a|{@>D%Gmz#Yccf#R|@{_u&^K>nwnF~SgJ&68~R8KcOh{UM2?*)m_}{#)1jOC z&(;ZNx9sVaJ*Rw>Xkwpb5wVayRa5B0$Yqk>?wWZbqf9oDA|gK@k_d>E42&oE0Ue)f z36yddvq=<{($hyPtozvJ&OUq}m74$I9VPZmPkgi9B0{R$B~|+H;LlMdOkNH3k!Ucs zVFB852O@wImk?`J9NpP_Ss2&8@Px=}vJDy2UWU#2TI07gyx>oE>gm_h(V&{$+{|z+@17kW;Im_T-`& z`C-NZMW*l@mXP4OqExfs=y!0@-TGk9MH_vIT{ATRku|w8TNb0ko(H`@JHIaSuNT4CWrJ#e`1p>U#AWcssd@107-cq+i=rF7tXa4d{cdqp;}#d=KZQxi$IH}}E9w7D}BVmFIqP29()`h(VKBCighE`-$ygH*C|0We0q zx6Q%CQAG?^$I^ce{f$%A6C_pIJ3uH zSkbGiln(;=xg$swNmUD0m16F}@ty_>9hBiJ&tWuvwr0jr`UPYe>p5q9OdRg}%{_Nt z{0>9}0Ed$YOy~Ifgi>H+W09#b#ZgU)@{dfiEm+lJqiBfAT2(WOB*XZnwX)FInUQcj zyi^5of!(2QkqW*diT0C6M;cq9SJAeiPQKmrNT~ebb^r9IC2O1Ld-~bYhKoiP)%ncc zR7wCGz~nJz_uGaA%l+SqbCp#);Q6myIwyZP4s1W+;nS9!tz zWGJ}ZYFhAp_={Z3^$7?S{@_!}2i^Cvp=S%uo#DY53cpY`ndPGoyahujDXE)QDG6C+ z9{HrmN_VOHQYK}79V{;4R{SEbNBM^un~@KZL9=W&=P>w@xi2Uu6Xu6uyBnnB?diUo z!D#D4*1ekQ(&rCC!M`X#s@I^y8HZ)>p2)#j%Y~X5dEibm7i#*A%*D-j9mFpXVEWBb zbhUo}(x-ac8^fh#{UA>RCRRS?gX|`OCq5Qfo#lQjG2O#DqqWp*LJkT8z$8=tzaThq z)PftjwxJ}1txo0y#8sH*uC&$lYtkAc|_eLgJN+{g)+;{pPfqMO53aSpnWl98iFGLR+ z(B9J(g%3Tim!y~Xj7@ys_%)Xo&1bGyv|&xXx4L{r=8-&kC1SXL7a@tSkmmmZ=_cEZ zHwmgml(}CI)1=m^lb4!if5r_k?Xd_P!yIWA+Q{rcdNuEp!av88`Z)H(M&*ewOE-%+ zo`nS-rZQ&F1yAaDetKWE#f)qnT^nmw1iWg*PGLF5!IIyK_W#MJwfVaM0<-3W+xTVh zRd)E(P>RQbtwSYs?0AuOr+dp;#BN{<2{uXf_WR#+_^@8VfQVdGLF>qtSCwI z0@Zl_+=r(xSGp^Q3NG^4PkHw8@8!1iu3gI|8`OPLH538>2#}W#@L?UZLG(f5)V%yI zn>)g&;jj1%w#0%TT+DSJMEXl=Q$;FdiB9W(Lp`Ej~k#NHZj%i8x>6Fg^9a0 zay>=+7Q&12-Kq0hSe+Z5*$8{GziDCX;^e|f@fE)x!C9{>Mt27y27okQI-wg!2ldD? z*TW>Rf<#Hhd*fpY<&?WTasmu}Z8+`S-Dv2PRQ}730?Z!l-3&3I=i?R-cb6(HdA2H~ zfoUuhQ(lCmZdkoB<46R;05C#&c_BmlXAD4Nkds2XE{z?|2M=qMQh+7fdVu%u$P`v; zcIqK%&;m{0`^CY=gA7|6(|7tq{9&rh*2aWSzMCiqwJN~ah%PkK_>@hQzKBH21Asu8 zNj|Ck9k$Td=bSYex!EF*>*E|)mk0$L?@=cZnl%Qk&Yb-_<*4Bx-a(J?Bt09Rl=_g< zq?pxlyB^{ijoNn=Kw zj)nN;XUY{(_p%6%kjW2phtRYma5ipkWoL`EnKc+ zfRO{};7_Na<23qPFW6Jc*fW(TEkk00d6Fudc z_cQ1wIY<0~`*w2N$Qal=h)P6=QMmQ}Xt0(mQK@5K;hbIcT!(FysKO?Mnx;yR>JhnP_eI5;XbucV zjPLP!((^3}q2&9zIul8HeCz84IitsybT-sgeqM2%HL%E-a8eoS=_&BH4Mz!4eK$`Z zPQ8~3WfGD|2GQcdqv)CoE^W4_L1%}gLWHNv98g@fJCHtr$aE@T3~V5zMdi_R4q-Fr zo+S338r&6lB%f61w{<~-o_jqI!{=ShfS0RNS~r*S2$h-UTKwCb1%p~FlE&QJR$1IS z@>??d{rW>Fht23>W-R6K%Dt`kM)U0NriQ}-)KLIULTH6^n!%e~F+n694!XIY;zY!H9S}uXkLUP|C)$nBF*Kg56<@pBuUqlBe$R}={-1H-m@FUo2EN3S-8j;EG(#C z;H5MvO3nzga0f6kCJkZ6SF4|nK!URV5G>(4 z#Px(L6~Y=wSQSl`$;j(ubWCL9F+ZbF7hJh?VwWa}XBICsp%I*D|CXVvW1nK{d^5`e z_+7w^zu0x(Ss-(Oj*O1h-MUknU z-v-K>H`DXU^{s)}+t_a5ft1(IDGa@Y8nm~6zVwp0CUF2&FwH)p_6r6ih$oeCNo~8L zHjA(DN7N_46F7^=lyst^pk}(+Ru#@Kswo!?NV)EQhicx-(sIP|bZs0RZwyLV&3r*K z+HynSSrbJiBbHX*n5jXz$b2EXm>EY4&)4eXe8RHQ*3X7P+YHS(bFUwV^UWf^eOG^h zjktt3`lmT^ENt^r$H_uW`>Tx0=_q;BP2ySDTqY2_f0CWp?WaV?BD$ z^!R95x~tEe8I>=W*`HeDnog;;o4((F;I#ach`!|nmsj3$LRG@0r+9Nr4lj#anEwIV zRWTB&S2xoasZ6Z53Io{(W|ay_jm5myrVGCVg}{m3qn$8<^@GkSn41`ufsGwC``5I5 z4><3U(dI&G4;WsqelZ3{%N_dLsqQuD!vz5ZgC1+9iyyg0>iHj*j^$@MS4;y&feDhK zd#~QgI;TqptUIa$-G4QG@~|M38GqTy?%-Huh;cBqXlUksXrU+2f425q3lF^Olx@!> zr2>KQ#5p=7-6k*n$SO@^)?#YYLd)^9u|5~Xv(8Ye>d{mYe2BAfFSo-9b$^e@2rZVQC;K`tF?T@;3vR$JhwYg7#s{pbU`Pzu=td?hg=h-LI|~6vxI(a z%5x$T^$q!zU=aa^iId=HVKRhy4gf}Edd?M+K`CWsX@Q19>@<%fHHpAR5-%Yogj7%* zdV8gf2c$>7gGv}n&Y?PCmFYFAcQ49zsm3jaPjmC)BUH7+$F79vw^G0#IgU_!mp=>< z&X=I-Wh48i03t>|jm=g+3D;M85DiloNbtnqv>Nnmf5BaY#>cFHp0Mnk`iwYDh|M?0 zIp6G{pmAoQo4&3vE9<+T9+ee`*NHBv3WeW)U5OVn84)k(X(#$cO0Xdg>eNepDHL? zUxWJmUwEUw%Qi=V(;xaR-+|z8V$CV9zon0j7g^2qHA{|dYSHCm!Sx5NF|&>K8GXy_ zKOZTJw3~XH!r>XfbfleAm9WIQ0FI`kO41X>eKDda@{AH6k@dZDx+K4F)0d2M3nW~& zI5H*3*w(3u1j*caw^qKOpXyihyxVfsa@ami22mf<1a4!Yq58uLERtt}fdjw{7~*-x zVt7h)a2#3=+V5Q{pksgLSC7(l03=Q3C)ck98blNse&jGzY0jc>!Q6b_G%#NHTNw5w z2RWV4r{|xtm|(HDX6$#MNC5HgIV<$K+fzpb=K46HKv=)>#h#O-D8Y9V+A3Q4^>qM% z93X~EgERpG`9#)-dDOZGdljX4pVh!uqDNx+Kl#`$S>b%3%?zS%7XSjm!x`oDncLCQ zE;nKaf4G`OMHyISfg>7r`w)cx)1B#{kZ!rCvbFZ%Cq;Pu+W3&d15Sf3VQqp4pi(Mv zdW7%VeVD}RmyObGt7IoVQKD>1eriJvy_&UFnK-J9OvruNDwoI&piix;w3n>nQ4wP0 zpP)+<4?pSF5D#PxSIx)}6$64TZBGU3n-f^*VZD-VE=Ao1k)X!Kp{UhUe?#lHyhT1K z!To-dmN0c4l%5nduG(OJhV;~@@lY{pm!TR(|1_DC3kP$}SxvL~KMkgK51D2@k{Oz5(jIbB0^^l%mew@Cvq=Nkn2%>y z(&xos$XSk@i9clrvsce#kwgh9J+t1qtd_8#E0bn`XF7g%QNw0EY@|~56+bix*-o|M{!_;E4O1ST2O+Uu z#*NLHAh<02a|eos6Q_1NjIVo^IA&lvrkPu+^+JUik*Uc;!@l7-X6b9CUrIf;L&P9; ze4?#Tw-ZyLGG=-gGu>{Qs*Rs=nEZHLJ4zVry3T>NVnw7LC@3GGs%zz z>C)05L($2`um$l$o(feuEu`LfWq%X(tn`l^=Mg9}E(=(oRt+WRBWY9ZewtP@K4JkopYEOE{0`s2r0-3@-(|<}ou^y%C z$OR5`diC=SIOf$I)^+1ZLkhaOrbGbU%UNCTUZi=J;2;!)3X_LQP?Tg zep7oePl&E6cCA7yo#V}YSloG6zUe$b{gFyn%MW@y6e>!C`u+oVWqDBg1iPjzXaiyJ zn1;4Z80uK_$}M{bA+dabZJUuKh=+4Dl||UphNF31nK&*B)SJ3fig6+OKg-oy=mJ+j zIAM>)waB8_^HqG`Y%Q*R{=pM>E>t^P757anx0r_p@s`TWe4o-stRYGZQF|yHVbPM$ zM9pyrLg0Y>qpg0*c!rDQR`(2~tdB0_*~haYaVj<^@If&Mb@1r`%5khOtd?R8?3ig|h5EF09HyjIo{`V%4OUGNP#5@;oL#Sq3%$RB_z19N|f3WLVIU(4K0rq1f;{1r>i2j@_4 z>7`pvN2D&j(FgtWVb@)y(lolZ$1E*!MC<1HW&cIk$}Rv*dReplX!l&l^Q2?}w<%R? z1C_U^EM`|hX*9`6(viu!xZpuV7S0kmyfp*%F%)~5QSY_jw0v>UMAL8)itP_uUgW_Q zuWn{xR#9#f7F7R`pagx&N>Q#!>FOR2H$+JOqJOJ8(sb>_RMt_oOq{%$1hJ6#Z1DUJ z)QAIujf+<#Elwz8u~8M|95rLhlSW>@JNu#QrA>{-6=*nRNST@2Eo>RL%uHKmW@ct)*fKLSW1!(=m~4+h|8??y z=Z}s(23flBT#ziMbL*BZld2M^N0aU?hK-$EA_O5sKxuv&q2)aZM4}KhWZ>k12*e60@RjyDVCXhUMw-0 zD_H{az5gq6>vFx~bGc>tNQ9blDZ~LmHU&mP9sGT zFMJVY$|Blier35AOQTpXf&cX-xAlL07RyZLohjn8m=l?Eu1E(m&jet#7+DDV(jXl& z6crsDtBa0;VXsG8IMc&jEnHU>of+UP1eu{&phoc>`L4XlMG5UuK)t+|H6bJ?ccpk^#3^1LqB?GUjco|)XVZz6d_iwp@6nEMU-gaST0(i)ChHDPK>Yx|Bp%) z)T99AGU^4;oQxzZ;72YlC=NK6F(hkU#CF{mU;K&4 zn@pX2J-%ok4mD#@iT~9ip&c1R zK8t;^%$**%i3Ez1pp-0@EHQG})n+j0FK}05!5L1Os1j&~q?oL$+KsAld;O zra>zpAmfCd_&cBm6-g<7Jv@Y@y6TB6#hD)bc# zy{Vx^0iO7YpMwV8K}%U6-GU+?-~)@cfK+9!WNVW>OQ47!*^}}`(#i)ad~lQtGLq%V zV?~kfW1#0M&{r4K5w%7QP*do&C8`7b8bF(}oYU|(p!z#(FY#@B9lwI(pCD&D=$XSh zkfR)hN}_7OMIz84TS_8m)Cd@o^8r85AZHFNP^p8O7PwyxHAj8WFw_&Zfj%3dCa|x8 z%E3JXSwT*AkPibC=R-d^K(_!-JAl_ea6J>G_YI_Q0q?~-@Cqn%@mM?tkHX9GL3|#r zpT}46d*D*`+ywM#0-DN$)+&Oe6MzEQKgv;o14K%&_Y@&b&iQ2B$x)hy`!aWOO@#76 zY7U@4)~f`_%mx}{337l+Hykn0Pw@XdMKqv9w(UshDGIDi1zIDD4G8U$qw8V+}R z!PWuf8CQgWSm3fUssw$91FtElG03$da4+WvYA6_bkv;uakk4!U40QSn%=vYZK20CIc_bezCP@OHcb${aia_k=PWPsI!H z6evsaHo(VCK*(dL`vvsy0pyVdRLPd&2maGRCq6)eh{HjS3DABxSi@gv5}F5F7m#)@ zGz$HT=Ax)|B+WEWr$ZE2&5V(SY7k(0&QvU-s$=a8w#384on7 z!JcKg${tciY%Wmn0Qfuu(zuBK!^iPPya>uhu$$d@9bST$;hA_9UJX_xm(x(^E@{X7G|bOZ0lGeG0B@k%@oPlTgMcq{lU+2>vXM1BFS zmI6(713AmFrzY?-6f`*yY^V}Qy$#q{2k^KuGV6n8#({A*vGFO8} zLZBD{C&{3jy5Q4g*~CGgbzv(3_7T9rMTm+68srR6Mv4S_mSZ;$@_YrY--aGPKymIaWH}aWXc(Rh_Oll5?!l)3R}Y}R?9*he$k9@^M+49xk4yw;*9IDs zGXvS{q=5&>10D(FhU*2;v+Qemu;whlt8B-5@GU=~c)+?fpjA0mT5%ZQUV(DKZ}^}k z4R~WaJdq7~w46K1k>EAh@lQa<9efC|ya3O_i-FFLxCKte3D|@+n8GynN=_+9%8-6S z`6@k^u1Hs<$I^GHP_jzj;8%eg;m)`R?uL7Vuhld4{b(= zLHlVa8@Z4T<)JL(M`}Vz*x*_Q!YGu`5*+%4K0zr!G#uxluW;@{0mQ+Tx9AaI;|2VF zL=VwvbO0Si$I%JcZ$dlKLAY`k?mk5~&}&qPywJJ_iKr~mlbAxRBDNEUiR;7|m;9%_vs+7R`Lia^VKh!SN%&Mxrzr||%shy#)bc)la8 zm0C(_iG(Ct5L3my;uvv|I9Z%4ZWQOh@c<~x#0%m>@s4;;d@kmQlvGmcB=wg@L75`$ z0ttQxnffJ% zoIM9rya8-ageSH@{Y&7TXG0_(kEekqN8{GGB5sWPgRj~F+gLmTbo&qxM?y?a15BvE zXAS^MoCIYqx{Y!{{-vSRA=(kMiG9Q?;saqPNU|n5fSf@tB)5=<$Ooj8G*ES^HdIHd zGG(TMs2Hj$l|m8J6>=`wgX~TACu@_}h`$H{{RAtX1lDx|H^oZqkUmIDr9|nycu?Fe z9upUcJ;h35E%6_5wzxvvCLV^XXT?m>A|*(rq-N4I=@eir9WdsFVNprk5I7lz{{>zy zgEqWi2VcRGvmq`-f{v0vE^dfACBPFUK(=RxyC30h4j_C99tgPXhyTX40na%=M~-Bd z@}x`BRB604TiOd~z9FrY{*gvX>!c@AzLW+%f0hKP0Uiuda4Ph>4f4)J@Numn$Loo9 z0D7wfMrslDh)%>NkWwYGE!mJvArr`<;LY0XDKy5sc z4nFq-(hzDQ1FZ+ITn9XLZ-`J~=snL`tnW=j2} z-comIkhB0~br^cjkw`26mQ5hzN8o3~qF7W7T}34b1Mw9dLvA#Z$RJ|KAH;6rIAI{? zk@v{`WOuRx*_R}#kyLl;KagAtKv+JRPA(vM;tW{fN#Z@RnFt|HKxPw*zTwX>6LFx0WHLbH69J+;S($Va3yF!uX+Zu?q9f>KE5x@W=nMFlQs^OA z*e9^J^T4MD%RbN{mBR#XBbAkUfTXNIy_u^*wtkeY1F<*=q-wTI@WkMz4B;TBmXB z=2paTh=6qgHQC_J=i(aRTh4<=YKmVMi+*yh*MDOBq2tgZx5-xVZ#J;T6&!v9b6>SPZ;BJYga;fcp~UO!5@DgzQKT0%UF?w~`yl zM6w=n1|@=Je_e5J&(ja+ z+Vpqo0ac%_s<@{3TQQ1$1p1c|unr=Oj~qiDA|9f2Tp#b3YDoWyKEcl42|VRaao4$* z+ypLzUCC}_*RiYF6!r@9jgeRfw>RJmyyf2ugTyUBS3R)9+qg2ifONzaVhL#lds{^6 zsTg`C-J2Gu!_;DGIW?aeP4%Q^Q7<10V4N{18R_4cXNT$dM|61%8A~ z=NI^)nGnxoB}NRAl7O-(sS)_evrawPiIooA&y2+*T56bBW}U$L3R8NBGNkXpzxm04*cRKb6K1z zu!YNIC$sfgHOnvwY!=guox*z9)7=eRO$6KSd^>ES4Tmp8*-P1g!l-Rirvln}L6U+)Y*|R}#~}(x*YTwg+N^9<=^1 zVE7y8F%idr_ZbDzKm{4iDu|_Tr2`N_({VYX3$Yw>+3(qLB?&UN`UA>@(j5a{Cx#-8IcA(Ji!KBSL!U*5i0Yo0$aK7>|xf%HsvO>&lm+$ z;IGMqGqsqS%rNF2(~FJa$^=I9cZ7{%wpdEamL&WXwI_}c1;lgGP3@uY(PyZ}bdn;V zAeCzsm_7nHdqBif^alO0zLZu-+aA&8+{*r z<@~+;xBR`BdTa_89`FY03z9%VoZkUe26^#_P6*m-(75nKPbQAgsWE>s9zj;X;_z?@?hKMH5%(Z|RyBx+l23!H}1Fu~b z#wN|ds#`#Absry*T;fKl0{VfX2|bZOlp&f!_AnGUI6~Yb9n^KIHZ_Q$GxS<|AvKMBLX?G;^=JrQBOMhF2#xqXTm^O#a7nPE+1YG=#_mn=&haF8!+a-w zTK`l39;P78zv+Wi3(7%GC9e}nL?n?3Gb;69yM_uhbPH{Tn<4Pm~Ub6{W$z zaUPC?agz(_i6b!UVuV?a`jDNkAZW-#pOXzJEj5!=kS~c}L>=(VZGh)!axCcjD~#k< z;BxpGWbJqPguqDF;m`Cf^=bS*{|9CtbHaDcqjWo5e|s)_C;BS-LzqtNOSS=5FYu1v zE#^oVyU-P4IoXOjMzyC`D=w%eXx3{YHNDl9G}|?)nxUGr>KW?c>O}QrRW;Q-C8s!{ zn4pLUZlrdddWbqmlb~s*o~&vH=$)*JS9MT!QuLtP zP*cb-(nxNB?ECN7N6V251M!GIJZaN3J>v?zkGW=fVC>zV2<4Oi<@=;y zp!}fPs+q5yqurqGrmL%Orys0qp`EI!t0||gsm;~wRj*fdR8>)(1@4?wB6XN-O;V&8 zIGjgxfxP7?Rzlvhj`$#55qk2Cg$51o?MkNbzs8my|BW;(;!%XcLm_JE@ z4D1Ne2RzS6Vgj*?r~u}>36l;z})ky7Uu`A)~3j5dHho(-dAMryii|WoT-c zrk|ldZ)j#%uVXY_bPaSdI)~N+`s=Rluil_8t?r>bL?=>aGLa|=mV2F?Ntj`LJ04~y z{v{&N4lxh1lO#bSJ{1$B+LBM|i&h~T?+|y2Q>CdeI!~3}!MHbHEQ|HT2r>;2FrMfN z^Ab(SQRKg*jEErOKK?27l|I7Q&nE2S%W;eS6})?0lO5BXjl5Y*UuLM6b;jDq+manM z-3z?QejU3t@S3j|hze}ywu)V`g)oC>9;8T8wo_G6Pt=6yh8f-m?FtSKc^Eu4XuZCR zc8jKkjxcmGtktP>A2eGvKh^bAbCq2cY1C~Py%v)1$g`032Ep7LB2poeKf&|Fb1<@a z&R-BhMHA$cAEgB_p3H{mu~y&$OZbxFJ{UO%Np&FSjUx(Sq+AdECf<b<=eby7PLKAxR&t zjnlkQ@6b3jdo)wj7nNtI*XWnj6%R#9Vmrj9e~4aGGio%!i0ko|z%gzE zdy?7cxA;Om|2c2kDBBgsdhaD)mUp;|a(W%ZoE==9+yPH(|1d687$Rz<68IF6LA|4Y zK&~Pwwy9z@y|lMzY@XPn%m zx{vn-rUek>$QjZzh>shI%P_Ng8RmIIVK#OtdL}jFt8io3HS8AlHRJIA>s#p7*m2=h z>i~z@v)DVz^RKhIqoK38E5g;z-P8AhTO%Y1efXo?KVoZgfa-(xG5CcB>Yu75s`{FP z`gI}Q%~wJr!vBOf3Xcm7Hg+(C>Mm(Bw2!rww5_xqbvE4$ZHlI`ics#Mh7qOFL3|Zv z<*y2R`5}TCpCQ_kn~8n6hBzfq2{Qhx+)1G-F`k@@Q-qd*@xpp(JbDE@CQCzv8vI=T zsgN)2LF0*NA`WFr_rcosOEqzpTQY#W&Jh-KB6u zI@&o-I9@ueu2%jz{0Q;4)KqLJ)RgK`rPPG(nEs04w%(>;RLj&eb&W!*gl>&|8a+2= zaKtG~$B7iGsnBfHN`R6R@b_^uutJv>jbCH8|&}sVH|}vi+#JJfqRN4&GXw+$>(CO z^OumIsGxbT{-_zGHR|gaREFdFp}HEnxVT*CHQ;jx_xY?r+$m9ikSM z0Y!IZlDdi}Pd!?FMAb>*Cx+wR(i-q|y&-?C8Bp;pgdp)h;WJ-WOhP@$MW|4W3shl$ z!C34(UlQLV4Ag$I1*!@&M>ZH6e->+t0l^@KOYd-NVlG;OyGV-#C4ZZ1#?ACCbN8_B z&wHGknDZs?nU#0$a<}lDaqV*mHnXFlPL!HvJc?= zKE$69crzMP_i#C3(SRKDWcVJ$% z2ObA`>Rr4LjfK&90PV$X#YKEhpe4k%NdY@k;5p)GQFu9bM|M=sxcr&+U$7*nqN9fO zRKcjivW~Kzw*K`@3i}s3hkegUqJ}(4$EjxME`?-UhJ<|!{cdh&iZ&WdmBQwP--$XD z6C5`%rf$R+^JC-c;0Xq+)~)WM>aCoqxImwyvS5^s&?{+-R4DcqGx$E-1OEa4IrbNL z+1kug|61;YP!YW#<`cov5&mT$2)vqKyehiI_fl^(gzOF@mj2`=Vk`1W@?7>3>9=H& zjtScW=a>e*ZJucNO-H)5R(_wH)mdk=%I0^sX`NN=dfPDDZ^s1Ldi*E-Ve*8Rh&~qeKKy~jXBua|8Wt3}Kk9sRt(g7M*2os&@s@)|Dx|CasJgPM zixMlY(aT5pMgBcf2{98OCRe-TJ zA>QZz1TOGFq5{7{J4hFGm?r4P)B&;%ISphoRU8?Jf$`OFR>4IwwAbR$6^zJPnRO_8 zb?(ywy*0X^MV>BCQJ7{g>1oScu5rhwlJB6)$EdM!Bhrh-* z;Ty7yH`mvnUBzDTE%TQ1ZtyQ>r-}kjAY!0gK)Z32xS9VExXTxcF~n0!q^Bre(Ys+b zD3q>2T|uj)2tI>t&fN9C@K5%IxLI3?g4Q{EGIReV=fvc%E6C3~oqIX=ME*7_=N#?p z#FpmD2G;U(MW?is$ftufI}NF(ZV{(r%g1ksxg0Sux@*km7)_il_HH~M8;Cv`VYQ4f zUJmMO&>FUCeVFskNWD=_jJB0(%CL&tVMtxL$Rxyzbr%sXW>9gcBDT9B@-e%@AZ~SLG zvCdCcqHtZ_uk6;D!!oC3FUkFqYsvNIyvZxH*7qcE(}W)4Qoba|vjYVc;Z@w#z6!o+ zxe`^kM75*}3EyMy$5e>D7CSO_b(Za@i?d607z_x*s@qy9ayTdiQ&czP5f7_fCNIJLC=0K^#O`(nxqG@l5JT zMA8G4r_?t!aqx1yx8f3&Mnn*^rJwvIt}GkkpX<5dC}~}mXU%$@L1!%eGcx;p?!vqa zIn}cR*%$Jk+8cWMGWP>@g>m8=;j)yE)>1xIo#0F1XXD-`4K3ZF)S8m};yc87V$a2r zu`OcO#YDs;M|}t%7B<(?Go**sp@<>xNL`&38i6U0lr zUu?`@;}$Tfo6WnNg7bDYYHkmG07U=Kkj_&&6t|eBcqN-DWYnHA2%n23^nBHwVHE^ zv$%Pno`0lQ>#YOh4U^B{claAHss4MuAWto4nEj7E$obs))0yQqGD+efvZu10GFh>a z(olWKS};q$om!xbR5#H`>U8y6bsf!IO=a~Bx-wcR++b6^jPtIwLtf9Uv*{&LNBq8> zwm5S^&YavuIoq;anG18y7ACq6GPi{#D27tfZt9WZl~OW9n-U^>#jj7gPPbzmVl%auIt8XVqIXt>qn0Tz!1^7`xxW9%94UyUYV_hUi9p$(k?& zyiIvp{Zcbl8>YW**c-IfFjU)Lb)6nZ-=WTtu+mI?7AVJs`s=&a7M{yaPpkbi>|2ko zL%-kuJ@?P+tWw!@?&*R=S9xx=RE|m^9>Uw1c6dI$R5vW-m*u~R0rA7jZKyJ~+Mp_B zQa+UWQeu8g_sGA(XN66+BpI{yw>4E&Cly!e-((Gm;F|_+vOa%PkLW~>a<<-u7YmXK zJ6Q{CA+GD*Ud(xacYlueyQimjD080wfb+@eir1GZ+bo$`(q2-Z!GF`iXys+dmh zROHZJA`)4sc)i^`Eb8x=kP_dMGEy2=n^A3jNPzT87*6W@-$mRHjIGaDjP4ln!SnV?k@^a2*)y+DV z^*HBT;V$-vz>b8ah*zDt*4lZ!GS{c}{1N+Y)Atvt)3fgtgj%Z>ma#>;>oeK>BGgv# zOdDZrYWiWGY<7fJh*HPZN!XcmI$2$IecAG5%9mQ0fMZWZ{SzKx=@HUEH;q0ce&9m5 zO{|$+%e-M~a?U^wm+R?gv*z(R|K!}wX0nFmq!b=;A*LTUH&8?P3+9bp5l*Bajr1M5 zHGQ8{P<51~_O3qLFe@lN*c-IgVA92?t`ZZ3O>A5L7B_DjR8W|6;E(mU>gR;-BflR_ zyP3VFAj&$RU}j;Qq~lS@7L)AsGsx6Z#N{HdQ`%0A3F$T`bd#r4NCh&Pg#RJDUTm=>B1 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 literal 0 HcmV?d00001 diff --git a/text/LICENSE b/text/LICENSE deleted file mode 100644 index 91483e2..0000000 --- a/text/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2017 Keith Ito - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/text/__init__.py b/text/__init__.py deleted file mode 100644 index e6798ed..0000000 --- a/text/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -""" from https://github.com/keithito/tacotron """ -from text import cleaners -from text.symbols import symbols - - -# Mappings from symbol to numeric ID and vice versa: -_symbol_to_id = {s: i for i, s in enumerate(symbols)} -_id_to_symbol = {i: s for i, s in enumerate(symbols)} - - -def text_to_sequence(text, symbols, cleaner_names): - '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. - Args: - text: string to convert to a sequence - cleaner_names: names of the cleaner functions to run the text through - Returns: - List of integers corresponding to the symbols in the text - ''' - sequence = [] - symbol_to_id = {s: i for i, s in enumerate(symbols)} - clean_text = _clean_text(text, cleaner_names) - print(clean_text) - print(f" length:{len(clean_text)}") - for symbol in clean_text: - if symbol not in symbol_to_id.keys(): - continue - symbol_id = symbol_to_id[symbol] - sequence += [symbol_id] - print(f" length:{len(sequence)}") - return sequence - - -def cleaned_text_to_sequence(cleaned_text, symbols): - '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. - Args: - text: string to convert to a sequence - Returns: - List of integers corresponding to the symbols in the text - ''' - symbol_to_id = {s: i for i, s in enumerate(symbols)} - sequence = [symbol_to_id[symbol] for symbol in cleaned_text if symbol in symbol_to_id.keys()] - return sequence - - -def sequence_to_text(sequence): - '''Converts a sequence of IDs back to a string''' - result = '' - for symbol_id in sequence: - s = _id_to_symbol[symbol_id] - result += s - return result - - -def _clean_text(text, cleaner_names): - for name in cleaner_names: - cleaner = getattr(cleaners, name) - if not cleaner: - raise Exception('Unknown cleaner: %s' % name) - text = cleaner(text) - return text diff --git a/text/__pycache__/__init__.cpython-310.pyc b/text/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 2523766248756e22dae0f02779ff079f193725f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2493 zcmd5;&2J+$6t_K-WRgynZVF|KggPLQHY_B|1yEE~pq2yDY7Z1H71bymyXmOOOkz9B zHgYbs63Y=GP6%l^_FwXW3nwmI_Qr|#JV`q(tk~mPvd5p#@8kD=p1j#?5GbGg^_BR! zM#vvHC>IX~pF&j}8cy~Jr<@Jxi0w0qeQ)TE{Cyw#KChe;Q4#(b-6dyqzsjpOW@@~~ zgLASU@H%h6x6W612;T;8@>}p-;jiqG_Ui0jbR_dpbgcDQ^}5|bs*k6Kog^Q1PXzQ+ zop*IV$+gV0=uc3Kw5bh}q3CBqD(KhL>F6*Ys)XX=qM#u@)E%hL)}cv>AqTZ@*qqLp zVTS(1CTx#f5Lto63(vC7eM?hIm78$Q-ye2mp6l*z3OeAeQyb8aLHcBKan>uH^&rH4|2+uJPM(3|w2JzX z(lX5kQGOJm|012^oR~~SmI$2vVpl~;E~QZ8Jma_(w&-IKEg~JInH%EiP9uWynH;E| z>qSmxZ+QnCOp1%IU$fY|fKi4QnHB@U=?mKf!u}H|dk{m35iMchd60M&w;?2E@1TofoySY}cD9Cj z(jThr&J|E+K{OQEKp*$o6lxBZ9Uj&{S$Gj+JW_PMI!8M z^O`4Zu)NQPMa)o#l-ov0VzpSY^~H{qmrO%=+tr)eV;ZSD(D*@%HfTUwP(#XG+oC>| z8?cyQ(k%;Wx2)5i|oN>TpgCeL|iRpc^9D6QHaO@}r|{2a-0Gw_$IaNn~01Iy4tl zzJ`4iCLMelTSLe~$Hi@!RCrZHW-p@a)j=woaIEdwuxz3Oy>xlz?tA0%(mUmCWly|? zDqzO8Y7VJyLid^{Fu4(_J5bfz&~OS~07M=%<_t)i0o{6r8V|^pPJBZFqilAsjL{n$ zde~1+7PRLW*W%OJggkV5xmUC8J1cAz$aXr^5|c~Tv2k`?IdgTH(Rdc~@&i;8{p_;< z@~?r}hc;fzKD6ob8M+Sx1Ahw#YiJKVJ^1i=##6W9;egRP4k*C3=7R*RQl=YF)ZLJ83ykV5Q1zSFX zs*o%T8^Xd8TzS|IZ7q&@p2Tq>(%lrI^_|62Q~&`X0*)uM@JGP?OfyTE9r3M g-C%2!^XX7*!$V0Fs_&B!n62dl!+F7a5Qg=C0MWQuF#rGn diff --git a/text/__pycache__/__init__.cpython-37.pyc b/text/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index fefc959a48283e047f64dfd10b000d282fa8470a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2344 zcmd5;Pj4GV6rY)0@2(v?4QYu|)Waf$ilvdm0fb~lQ6S-fgnDQMm8?W7XJ_K9V(;2B zY&$S+?*3M2h)#szrW|H@JE(GwY z&UbVt$+gV0@GmfnMAQUHPjoUN74W{g>YwI4l~7!ShEBN951^|JASo%x$?7qi&X}0`iCZPiNE0=3;;hpbsukLgwF{I@*TS<=mgqFk6iSezg=(-t=A-VpmGwmEk<8{se3>eZg3?Tj zE`aj2{Q+UGK;{T?_#dcU;NrC)a}TAJ2pw->2xFbcv+y@}dwJ67slDa`(&HfPiL9&7 zTT#VSMKZ1qJ5s)I)LsCycH8NagW`6H5N_f0FOZxcoT;uaAChmqs?BUJ?^qW5 zF6zcIN&HnR5j1mL;4Grn;^HAN9MEw20C910Z^9r342quv?}h`Vj}B{3Au50sHh#2> zm0K09eMUC{kcrQfX0?hl^DTd)l~m3_pS zYjIzv@&U{xm{n}()BI8R2nLtU0-ouUhv*MH1^5s+g`>9M5rEMK+<@=EzXERp8G7I$ z03%|L$9KQVF0%ZaY*rsz;d=@mOus91M{6ljp{ag;nTP>aO>pTB%*ZvIcCo;={W2x; z7BD2<-jAWHIuHV0)Tm4A@UttAqq_0qnCD3xmm*P9yN=#BO8_ccYb1t2zK!G^BzWa* ner-UktR>ADld_rwyZxMxdSVa%G$^#!YIoP^x)W>!D?#;doi{md diff --git a/text/__pycache__/cleaners.cpython-310.pyc b/text/__pycache__/cleaners.cpython-310.pyc deleted file mode 100644 index 544c9badb7159237ca1825705b1b9cbef066ac0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4968 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 diff --git a/text/__pycache__/english.cpython-310.pyc b/text/__pycache__/english.cpython-310.pyc deleted file mode 100644 index 2c8f61b217025afe19af42550b2be4a6725743a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4702 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 diff --git a/text/__pycache__/japanese.cpython-37.pyc b/text/__pycache__/japanese.cpython-37.pyc deleted file mode 100644 index 6b555d5d3310eed956b44850695afa3e3d091f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4599 zcmc&1O>Y~=b!K--E+vwpB}JAJM{t`o&{~y5NlscBu0IkLNQ**1688fXDPqN0iWHZ- z)aeC+Xk_JvnGmpg@CO(gL;GU$CblI{DO7FTS+z%`Pd5P7xGM zVG=X*-pst2_ujm(eKnmPBJjKO_k(h7oRCvQx<3_wThP4UK*tE9Hp%0t*t9|Ol!kLk zUa`ob%G4v8*CeC?6k{@^DA+l0Iq*7U21O$c^?3Y4h*+k@O zh`cP3S6-3ZR#>rJTHpA;UQnhe6#Nuu323iD^In2(i}<8Cy-x)>q>T8K(J3-PjwnFN z6saf&%8mwFQQOMbJdUS4!p=|vg^7P;+d_0c7tq~b6RyMZosF6Vx7&)dfl#$3#r^bH&R4hpi6?$~jFgq|#NQ+QowicDg24CX z_JK>0LH z<@$j9D8gEw{LRed4bj?tM@shXK*mP~LB-~Or zw#iTus9tLmc4!#(f*7~9tleOkTTR<6TMf$*1ED1t`<#Mn>b?fM;v(T|N6J0Q zKlC9}*H!)_7?p1jI8Q%J!W!L=0re74$0F(%fjYjQ0O}#8`iUduaG2pf-Pc*Hp5Ts8 zeEkrzGsCqM`+vzc?V!_oaQKhCs^WD4XC z`2Zf`AkQ=#*-tssy%V3<2lu6X;Jl8~=lxUHBoJC&ez-pAw1hMxwBxK!t%s|;|gojb?e?jxw@Duy=j$eO>6Fs zS#||?o%yP0*a3M=FSk>LxtaBi!ff%1QJ9Sq9~f%Q&Z|wc6)5Fu6sZHni@*-d+5vr| zon5$nZKg1Hb3He=Qk(_)cCs)#Q(zL*BXHr-zu+f}0~vQApgqD&79j^lR@!jrAu+FM z*F-SVbDUDcPOD*Y5Hg50Oi`|azjd9gRIZxbEDMW!!EkfWZCcK@ zFztGN4EzljN|lyvmt9BtU)%$I0ex(XyRBxBi2N{6YmNw1+j2N^X{7nHFyxaS_$NMq zhxZ~&v=->y$slf# zxZ5zdYo(vS+m_678Secq?DlRzM--i=;IGjM@O~ZsLjaA!n5CnNqD%lbK`+y|qR>mq zI2}?Zp=Bk_CCV|%_F~2V5aLoLZkcw;bL%bF39FsE51~|O+A36L1tc1}PDrKmSA<`0|;5Q7@SnMvu zVN4Z5i{f!C93id5`_c;R?@KG+jQl^o)>h}|=R=42*+=cv%(_`?S#HrNEY9}yg@rff zg}0!|l;x8{h}uW8W@nJHx_E~&brMR}iJv=kLmQuXNw*Q5+){3cqFawkz$AOzDIf~dL;Gy zBb^iWOvI7%A}*cj;R~hB4oJK7F0k%lO^xDWERdpp8}Oc}XcPGTBI|+g0dQVauvD;4 z$c+@gtmT+sde3r`@J&73vs|?06ibJ8EX$qD8rI=5J^bZ&VV3BGHTU}gy&|E%-G5A9 z2%%rKusT80efZ!h+AhBhTzmj6G~2HZXm$BXyKP|tn3=hGZNo2k28_b<#l!dg^?Fkj zjj(tuES`L9XdIP4VBg?DNIw_~2VZmfJ!Gl-nv>FeGnBs$v&Lv>CFr7j4m*5O{&nnT zu$#p0RqW83`M0pUi5=F4q0jX!kfSMteB#-CY{^)S#Uprk!(}box`E~+LkVUbUDIe> W#g>U>vhde4x*pdJXmNd5PyQR%Q3&$@ diff --git a/text/__pycache__/korean.cpython-310.pyc b/text/__pycache__/korean.cpython-310.pyc deleted file mode 100644 index c18ebbd311515a2e82dfd3ee60ae14dab14b6090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5588 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 diff --git a/text/__pycache__/korean.cpython-37.pyc b/text/__pycache__/korean.cpython-37.pyc deleted file mode 100644 index a9eb67ffcee7e16d875dd3c6c873c77e5abc5ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5746 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 XB}uGZSG&G;RX7+9MPCZnha>+5R0ZnR diff --git a/text/__pycache__/mandarin.cpython-310.pyc b/text/__pycache__/mandarin.cpython-310.pyc deleted file mode 100644 index df68a069183a22f3dc9a3882796d46cf810418a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5994 zcmbtYYj7LY72bzr$uId42uTPbX@Ri_dDsl)(U24fP+D*(p)Xsmqj=Yj96g-7D-yYK zo5UiJgqH~c90Rcv>_qJhlbQa3l9{xnX)CGk_SgQ5`iGfL`H}G-|DoSGyIQS9P3T~a zzjM#I=bn4+d0g!()!f`5;qRXRJgx7&S(3`cc>feI-@w0N0W?XI<5G`JIrGBS{rDK)~+oBZPl*Rt_N+?mTNbFwreZ2m7vSCRoac9*J-P@ zn?SGE)@V0_F4xv->p*YNLf8spK?O#etMnTaK>;DbA!-0{SYM|KRz zH1GUTPy+aW2>(}a2MkGBsjqEJHl=9e4Js4LK4qtrS4Wjw z4MEmECdjLnB6KS-kV=fi;=0xF*rVM$o_hG92X;Q3S1e`YW=lShmqZAv3!R%pDrIik z9vh08(Rlyku|d6mr!Jn+MgKtBFjI+5rhdTOl!zv^sE8#uj%2KcE%BIPlJTvLFmaVU zzg-foAmLRwtQ<}IF)rs$myQy9*>dh&={QLS9LXd}SVwatM_nD=G2$#4OgFQU zw@b&$x#!Ed^R}fSXWc9Ax;?JqbLHGbIhVH;V~)9ZY<9T1?zAo0>quTAzuC)pn##DG z<1MFbS;DmrH?V=@M$)l<);>+jVP|Z1#4&xuJ?_3VMXsE~X6MQ|M@=}ZPT5---t8xC zndw-<=1yGFj-+bl8Ao#7-EDvRM&1phIV?kAuR|Hjys3)KxahclCLM)dV23&TxN#T3) z%6uJoKGsy4h9g%FUEH6_E6kL02>TR=cBFX0BS!Y7EH&YgpsXMnB+0yLn@sy0d$4AU zjxdEOSMr=#10|PzUfjT}W8x^AFyWG`ag0rv9uvm}?#Zf&7sO3o6ECufy+D70gI%tnH=H$IJ8$wqigTWmPl{XMfE$`qf@;uZr^H%joio0bCT|Oq?j~=G z(W~4v=F;xmjHRTAvnvP9bH?&z^lseM&Q@nEHOj23an@2}9)+`f zmcpb*^e(L#@>-pxHB|{(5|Xq>k|&8TV~gwpo2?iga>Fp^hzcLNqH|&uM<#7AIxlYX z1}bj{YBsNMeoIGL?aGl?D+0R&uN;}E2%h7-UpaEZBRlS_I)Pm&@TEx$so?;9a`A-) z`HqS=2M=5FMu++2;-Lk3oy(lI1EBLm5WDQA!1WMEwHYn^3~Z#r>dgL#Sh81`C?3P~uF79!D#?iS9AaFXL66}XGoRq5{wUk@aapl;6{m~qA#6eK1+NZ@#jnV(i}8? z;%dy6^8ZJRhRv@e*I z@S>u2kA@=J`i^b)MK*53AiPbGUtvE#i&=re7@q#)aVsG7k$7}KxBLUiu4vNoN0VIx z$*^kq=q14lB-4rAx-hIddrJIxdfse)E_QTJ>7J){s@RzLnC9N_2~~uM^e-dsXo$ zXd|s8ei~XcvTcXs+0@NFQ9gJ`9EQitd~$Khp{E`R%Xm3UoBfEXI7kZhfZl(-e{jRc zmoD{$ zBuYk^%2}k53ltPDxNkP9ssS?!hRRaZ1%fAK3) z`wifW?cBO(=h#T}8r!ybw}pDEyXSAe@Sbh8dv;x8)7F|zyOz7V{;qac%t+MiTooDy zCYozprlxi%YJqvxp}uK9T?BTen8e|?APZnwxI5hbf&)wSx0Yi&M17)x2qS=M8ykz+rk~ac%rr+nb-EM z&)yQAr%O1}iPxY=mzcp=e20v!1@P*=&sj?4M@u7J;Q-%)+&6+sk*mTJY3lyG%=KPd zTy35%wX1P8;(B!zR!~3ECxlNO`cnB6o%(4=L5Kbs(@R#J(Sg}&E)}xD)eg?sP}^5pUbc$4Cnd#A&85GFO$F3y6P<(@q5gM8@t6HKo`{ENT(=Z zB#MCaIzUJ7H8Lnlq(4Kzsas<&`kcgxKSJfRDWj&UNtyT)$!czckSAd{@MauG{Dt)X z0a%n1??H_SW~({*a{Yl0qrO0oc>1E=4x;!w`BDuc{Vsu0K8!vnUZ4)ZlgoKL&&-u( z?H1q%nn-8y*+^G<1u5f&;dAr~mr(C@we?PSgC}_ZD{d`|?b(El54T*I;68OwUzq7k9{T2|?(R9d_n_Dm2hybS z=ZlibO|LrLNbaH(lLbOf};}?PK3#kOg%ZdRk~Qte^k!jDZx&1HZ5GA zbEbPdgPAMmVX)b9UZ^o)b(0Te%EOOxnI$~I;36*>A#vTD5R!Y&XeTo-(P)rd@LkTs zLO|T*{ADpZ%$C)FMy5&37Zf2f(h&n^U8f?0gF!iA9r7{m# zK}1+X%*XGsfG9+&O@6@)@}h$qQG}s4Ls|xHXp&=en|^fq!O4^(hea5pM5l}QB{8h! zn639q5-2i|93hF$U1l&e^atL!=p0dSm*;ty=4Y;%QXT%47SM#xWbRpt#n^6X@12c42k4p+u zG?&7tB)W?>y|UM7v~eZSpdiUek~x%kvRuRqY`WqY?YL-0hzfsoM6+y_Jo9^OgUrtH zL`{P_u5alAIeK*N(~5wX;G=UR6~TE*#iMgqCD|omb+w{2YFF0c%LkX|)z?8z0iHTz zt6K&0<%84n>IR1ypI3Ja=FzEZ^Xis`apP;hJpI?;@iz~f zX&9w4>m4v_UfS?(SSoBXjMs61u*rVFCA?nGQr7-YU=!biq6EtME0h$gI4r}~2rV}V zCEQvBI4yGl-~^#$`E0;xnQ{aiI4x6h^PIrR0b0m#c5Q@Y z)Ro*7abeeq@xawIS;i$H!Y`>7FG^B`U<$2IhG+w9gXATfL0Wy`0| zuq`eNXw0_C>^S?O%K{>^ZNPq;p!8=Le_>Fv^|Z7(d&(~Ezrqn)=gzsDU-Ax)waVs8 z-o3HaviURY+_2iL!gZ%h1pXAROYP6`M^d^<^nqx)}4nMV-6Pg*vqJfQ*Z+ z9}#COc##mWG+S~ceCt=bSDGu$RIDy>t?ANSMKb!0fex0tbKHTeK*t9q?itpGbjv&8GXjtU&HQ~%$!TvWkcS@+Y_j}T zAg2$j!3zGJ? zx%^lfinJa#x5_9Va+!)j$%5`5)+W-Q8jj@n)pP4>oYJrPUV zx|um_d-_taQ}D94$ivALGfdlqBwTYil}`1ij-*Wbja0pcE5yp-B33m24NgpaNhs<% zHK=-EC2L_l1FEJrscV4-fU^DY+*w%+5z&KI7PtBX>n#N`-yDIpgY{COTGbq^C)KG> zx~WAb)sPVV@a!eCXHWl0}*D)A~w{=BRvF^~Io{em$gUt*| z3Zo=D39|1&IBi|U8ME+3_n|KMxl_E~y*t#_1;-Tp9HO;*b8cfOgYSmOb~sy#w2RFO z;SUHhtrZvDPqD{-K>J90$WQ1@jZD44u?V1H8P4mrlIkMz0!5s4ggc?0@PfhKouONRUD= xNP0I0cJ`-?Od_@m+s)hr7X*?3fCy1faD8xRur9bOxGUffGzNU)uO7Ji{{X*`cpd-% diff --git a/text/__pycache__/sanskrit.cpython-310.pyc b/text/__pycache__/sanskrit.cpython-310.pyc deleted file mode 100644 index d691ac684bfc7217ce9baf40e7098fba9c4ce0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1685 zcmZXU&2Jk;6u@U@*B?n7pp|G;4hV@7*a)0f;=mz_h#G_{p&UrXAv8E^&(_&y?R95o ztJHFks-)t8Div`;6;do>Duh6AB9Ram$RR0z!JJ$;^}?+et5SIHjcdEG){NhK^LuaJ zyxn>6fi z%g(Si2T7b|SH&0Nx`4n=Q@oZajPwX6PZ*&BldHtFMi>RC7S9{L`5jYvSngezRdK9m z7sG0({iyUocr_?32kJ(kN|iLxacx!yn|c;=+)$w|Hg1~nxhPCD2At1Ahy*j8W(sTN z&A1Nzp~qOe-+yk3`X_^Zejqo!HgqG| zy6LrHM*DY&lp`d`mXssp!Dp}ol+JKX8EP9FtAV0DtF~E7BIJ-j(Gt=U4I&yt0!2$S zEKw$+JS0%GMA;HI)oIuq&Wr^(yhne>+k+Z>(-aBit7zruxBg1>=bkE%qv7jz>03|q z`0EB@_4ubfKCI)mdKt)Pt{Hw?__8j-NSZLU*e={;DcWL-X}&A)4!2m_>1!F89no@w zHD?zn?Oe;i$P%4fWUCWb#1`KY7^lTs!g^kxrnq@ICdYSRKcrg>uI|JVeOKMi-E<5x z>F#~m-TSfIxs&46x{}OvJ9{vnGrUOa14~o9`AUk1AWJ93a=cOWK8B01I`eS9^UQ&< zDd06(hLN0u$sV{3Jw=M!&`G2-Wo>SoPeJpV!ql=$wxyiFqh10pg@rSG1{zqVs^YZa zafR)Qx{96f3?@Gp`L(k2=jT96@D1l#mWvYsBTxVCN%K`1-0iWOgpZZ^7Z{sn}z*OMR(eE@b@E2eR?w+_p yy#-5N#%B0pSeId?G@4x)*C}V^0Y~u2me`P0ziPEurcp4DZ!1B29yfFg#eV_AmAcaa diff --git a/text/__pycache__/sanskrit.cpython-37.pyc b/text/__pycache__/sanskrit.cpython-37.pyc deleted file mode 100644 index 131f9ac8f7638c1168ce59dc10a49a9a20a062e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1627 zcmZXU&1)M+6u@U@^<~EnB&2bCXei{PT~kC3IR#_t#HHk-LmgUB<=QLFR^E6eZDwbK zBjiA^Lk}g8&{GKoi&_mOv^1yKP51(%z#*sI4C6-2ti(FP9&&ce6`Bfbct%35sc>;~6tn@iT>l25bK ztj$3a)9fqpNZd+6P^T#_#0sOlLg5M{ly9;m$xD?j>kC_|6riyttP*F!%m^_}cK4 z48g##Zw(0;N80cPO&WHx zM%>z8_kM%m7!=i2BGwLnMZ8Kxbx5FUi7FEPl!zVWG zO$&8KAk_O%2cdtkc7Hr;iu#v>eSRi4y)two-MZ6Vlu@k;J*&1^OCscuK-Ch`5)l#6kU-TEktNDRl!pYWmMB}|jyeIG!tj;d5rPC#`!8Zg( zYVnq^zPAdW+t@idCdap6PxNRpxS+=h^jUQ~50f#-rn~cPcjuRG=Rtxus}#?4J3AoH z8=j~2fu$)vd@sR+kfoDMfcin+{Q~a6(#+9rXK-M=_IN`UVZ`S_*aNqrYe;b)dWCeR ztS!~%Q_z~GFs)3%HjV$_QPbe1uyBUYKzmA8RU?U9uCO6d->?GnH@Vr+tCgiUHw!cB z5{x&`N&mK2_o|)>mUUw}h`ju4*r<46JO_&9-JHoPKMK8yuP|TZ#7SAN2P-kLDIM>Xfm%035+18)Ac1{TkI8 TG70@Td^a(^#2lYU9nb#{Dh#V` diff --git a/text/__pycache__/symbols.cpython-310.pyc b/text/__pycache__/symbols.cpython-310.pyc deleted file mode 100644 index 18bf0070c98cc839ef485608a801b9a459d4f442..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmYjNJ#Q015Z&E7-#I3sgoa`fRZy@gDF`2mDUeVEGSx}2INq^yaK1g=?k08$1d3!K zpmCrhtS`d zI2oQ3H(bf41CAmzcOp5CFeee=UgXXCfO{BxAlvvXa_r4GszBvK!2ORn3VEf47K5$j zS`)f)3X-aIpb``nT`GtDHIYcFC2$(2RKY+w&a|RR91ZpbhooM!m}$2uTB@JFe(7oX zY@#1HwR*3;#-ZC=j~_ot`l-mI(i@wD;g%UsC&hL#o_;pp%~$i*yf;6myXKwwW>TVJ{P^?AOv>lKirq&KFI-&Sf3g3%9PN~&H|1zd4>4U`tlE$fq84w@De*nX+tmH)fXBK}eHEa49b0;zv|) zAWkIW(m2dY`~iDh{t73v!h3n&_g?Z|^1k=RTU(Pr*~R5ozPA~Gq}O(ml$c)tP) zFrW}a8pAQFVU58h$aEH~zz(2Tix|gQ{H%%U=MX1od=_*!Z4M>VtYF%VBeBd7X976| z#LLA+$KuH2j3U!Uf|Z0~*AqxMzl}wQGAoq~Ao0{zpf}Yy(zg|E*S$GaWoB}Vloghi z&6QQFXge+!-ugzVyeVsqx?k~Yjca)?Z{@K(mCua_c_Q!Rm3;E|QPv&p>K#X-A0fgggSXb0-d-yid%^5*?HmRgz4DWAQlsX zt?@v&OfG`NpP(Ra+LV>BF*`jrF-fMOkk zSTBMgdeB4>QShKBZ2pxwEqLzbc-DN(0Z{Gagn>X)`J2H|d@Lm2hZPrtS z{6et(V*su~^Twg$gj1VTaAY=hScOqyvQ<*ixW-c*!qbyvl~z(b!?PVyN%I`v1!IQO zDWd0p0|P1RRA$S8Gd*uuHHs4Tp`k3a>(IPW=<1|J?(J(+pL8iFEz0R3a*+6Bf%O<5 zc8JWe7i^IMwYI`edIH&gW2bA92~%ckuG6$^Q|52oEZ@0%c;t^a9zJRY1J*?u&cMNIkP%tiX~H2Yk}vxPSH1){h|-<7Mc%be%!V^ABjsj*zTd% zqeKj$)x$tejUWT_sQ)MmzapMZaQG$)eMFV?%3L$S;alb5VnQE+J3pfE6K)ZTD6#k<>OV)RH*l0MDDoB8E5#Kk{5}f%xW1(D zC$;_{ID&qM5YTTCgdJ}Jf)92-Mq#o^;ME2D2agAitSc`bDtCeMJM2L#D`F3*4rv^3;nqX81)Gq=QD*t*~AWNy!I(*-U;Y9 z?Gm4MnXk1-H^o_xcGFODw8vIy5B}JcBykCB&~ti5rWRbQA+<)}$h}Z*v!%tA1GAqocZPZMi#(|0JBI)pHkhyW&aAvttI*s07!k-{3M}fHNyVbZZ z#%;G|*j}lysi`voZwZl_7tBJvr?7JaS=N_TD)spEby9zinHVL Wz&1;mSRNK%4lHG~-CFM0u=Woc1EjnF diff --git a/text/__pycache__/thai.cpython-37.pyc b/text/__pycache__/thai.cpython-37.pyc deleted file mode 100644 index 903b8ba8a1b5b968ae015f7cc7fce3fb35b5fdc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 zcmZWp&1(}u6rY*RSJMxqltLAIC|bK(W5HVqiP{$N62S(9kW!M&Hcj1R)7jmch6L0G zEY?dw5Itz3l%mjsqOkc__O#&1f1xMe+e|-FH_Y4ly?yhW-@JJ*4~B=M1fI0FUnm9$ z`Ger(VKBJ|!;FLBgj1bl@Xd5uW*J6_#&$?X;R+A52oElj9hwR75D&LVCdeav0Nx=^ zmx&tv3k)QsQa7Bk%jxx8sX);K4{j2Mu>ixo38qLIWM!&JEz+i(G$^MNWSm%JgLN1n zHbK_dKHCfctx{*#O@T~*(Wr{cgyx0|M!8zjH8=X`Ve0XdrG@*;ODc0&Y|f>%Z$u10 z=<(R%e0Hm3nORG#Sy>Ad#j4xK(YRhREnJ_7K$MB%LPQKA`DNgsIXeV%ulvGtju7X2 z*!k!=zY!NC-jkS1{7zy`;vToo(EG?KvIvRxWx!px2OeujF>s9(F!Sg_}Kk2ju+noI_k9 zBvEh2uU_{pddtimO!Ya^@2BQ(hBkBMo(ojpYW{bR%cE!J;tisv8zsRnHYPmHKJ% zi@#^E@7+jT&z18$m$-pyV37J%pk1|$Rlg_Vx>3mKW+HYHr!oP56U0?aI}hy~!1lRF zI(Uv@8hNpe2o-n0o~A(ofW72r_Zm!UlNMPdE8|(#q)mniY0w74JU7W^=qY3z5 2: - return match + ' dollars' # Unexpected format - dollars = int(parts[0]) if parts[0] else 0 - cents = int(parts[1]) if len(parts) > 1 and parts[1] else 0 - if dollars and cents: - dollar_unit = 'dollar' if dollars == 1 else 'dollars' - cent_unit = 'cent' if cents == 1 else 'cents' - return '%s %s, %s %s' % (dollars, dollar_unit, cents, cent_unit) - elif dollars: - dollar_unit = 'dollar' if dollars == 1 else 'dollars' - return '%s %s' % (dollars, dollar_unit) - elif cents: - cent_unit = 'cent' if cents == 1 else 'cents' - return '%s %s' % (cents, cent_unit) - else: - return 'zero dollars' - - -def _expand_ordinal(m): - return _inflect.number_to_words(m.group(0)) - - -def _expand_number(m): - num = int(m.group(0)) - if num > 1000 and num < 3000: - if num == 2000: - return 'two thousand' - elif num > 2000 and num < 2010: - return 'two thousand ' + _inflect.number_to_words(num % 100) - elif num % 100 == 0: - return _inflect.number_to_words(num // 100) + ' hundred' - else: - return _inflect.number_to_words(num, andword='', zero='oh', group=2).replace(', ', ' ') - else: - return _inflect.number_to_words(num, andword='') - - -def normalize_numbers(text): - text = re.sub(_comma_number_re, _remove_commas, text) - text = re.sub(_pounds_re, r'\1 pounds', text) - text = re.sub(_dollars_re, _expand_dollars, text) - text = re.sub(_decimal_number_re, _expand_decimal_point, text) - text = re.sub(_ordinal_re, _expand_ordinal, text) - text = re.sub(_number_re, _expand_number, text) - return text - - -def mark_dark_l(text): - return re.sub(r'l([^aeiouæɑɔəɛɪʊ ]*(?: |$))', lambda x: 'ɫ'+x.group(1), text) - - -def english_to_ipa(text): - text = unidecode(text).lower() - text = expand_abbreviations(text) - text = normalize_numbers(text) - phonemes = ipa.convert(text) - phonemes = collapse_whitespace(phonemes) - return phonemes - - -def english_to_lazy_ipa(text): - text = english_to_ipa(text) - for regex, replacement in _lazy_ipa: - text = re.sub(regex, replacement, text) - return text - - -def english_to_ipa2(text): - text = english_to_ipa(text) - text = mark_dark_l(text) - for regex, replacement in _ipa_to_ipa2: - text = re.sub(regex, replacement, text) - return text.replace('...', '…') - - -def english_to_lazy_ipa2(text): - text = english_to_ipa(text) - for regex, replacement in _lazy_ipa2: - text = re.sub(regex, replacement, text) - return text diff --git a/text/japanese.py b/text/japanese.py deleted file mode 100644 index 7430cec..0000000 --- a/text/japanese.py +++ /dev/null @@ -1,153 +0,0 @@ -import re -from unidecode import unidecode -import pyopenjtalk - - -# Regular expression matching Japanese without punctuation marks: -_japanese_characters = re.compile( - r'[A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]') - -# Regular expression matching non-Japanese characters or punctuation marks: -_japanese_marks = re.compile( - r'[^A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]') - -# List of (symbol, Japanese) pairs for marks: -_symbols_to_japanese = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('%', 'パーセント') -]] - -# List of (romaji, ipa) pairs for marks: -_romaji_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('ts', 'ʦ'), - ('u', 'ɯ'), - ('j', 'ʥ'), - ('y', 'j'), - ('ni', 'n^i'), - ('nj', 'n^'), - ('hi', 'çi'), - ('hj', 'ç'), - ('f', 'ɸ'), - ('I', 'i*'), - ('U', 'ɯ*'), - ('r', 'ɾ') -]] - -# List of (romaji, ipa2) pairs for marks: -_romaji_to_ipa2 = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('u', 'ɯ'), - ('ʧ', 'tʃ'), - ('j', 'dʑ'), - ('y', 'j'), - ('ni', 'n^i'), - ('nj', 'n^'), - ('hi', 'çi'), - ('hj', 'ç'), - ('f', 'ɸ'), - ('I', 'i*'), - ('U', 'ɯ*'), - ('r', 'ɾ') -]] - -# List of (consonant, sokuon) pairs: -_real_sokuon = [(re.compile('%s' % x[0]), x[1]) for x in [ - (r'Q([↑↓]*[kg])', r'k#\1'), - (r'Q([↑↓]*[tdjʧ])', r't#\1'), - (r'Q([↑↓]*[sʃ])', r's\1'), - (r'Q([↑↓]*[pb])', r'p#\1') -]] - -# List of (consonant, hatsuon) pairs: -_real_hatsuon = [(re.compile('%s' % x[0]), x[1]) for x in [ - (r'N([↑↓]*[pbm])', r'm\1'), - (r'N([↑↓]*[ʧʥj])', r'n^\1'), - (r'N([↑↓]*[tdn])', r'n\1'), - (r'N([↑↓]*[kg])', r'ŋ\1') -]] - - -def symbols_to_japanese(text): - for regex, replacement in _symbols_to_japanese: - text = re.sub(regex, replacement, text) - return text - - -def japanese_to_romaji_with_accent(text): - '''Reference https://r9y9.github.io/ttslearn/latest/notebooks/ch10_Recipe-Tacotron.html''' - text = symbols_to_japanese(text) - sentences = re.split(_japanese_marks, text) - marks = re.findall(_japanese_marks, text) - text = '' - for i, sentence in enumerate(sentences): - if re.match(_japanese_characters, sentence): - if text != '': - text += ' ' - labels = pyopenjtalk.extract_fullcontext(sentence) - for n, label in enumerate(labels): - phoneme = re.search(r'\-([^\+]*)\+', label).group(1) - if phoneme not in ['sil', 'pau']: - text += phoneme.replace('ch', 'ʧ').replace('sh', - 'ʃ').replace('cl', 'Q') - else: - continue - # n_moras = int(re.search(r'/F:(\d+)_', label).group(1)) - a1 = int(re.search(r"/A:(\-?[0-9]+)\+", label).group(1)) - a2 = int(re.search(r"\+(\d+)\+", label).group(1)) - a3 = int(re.search(r"\+(\d+)/", label).group(1)) - if re.search(r'\-([^\+]*)\+', labels[n + 1]).group(1) in ['sil', 'pau']: - a2_next = -1 - else: - a2_next = int( - re.search(r"\+(\d+)\+", labels[n + 1]).group(1)) - # Accent phrase boundary - if a3 == 1 and a2_next == 1: - text += ' ' - # Falling - elif a1 == 0 and a2_next == a2 + 1: - text += '↓' - # Rising - elif a2 == 1 and a2_next == 2: - text += '↑' - if i < len(marks): - text += unidecode(marks[i]).replace(' ', '') - return text - - -def get_real_sokuon(text): - for regex, replacement in _real_sokuon: - text = re.sub(regex, replacement, text) - return text - - -def get_real_hatsuon(text): - for regex, replacement in _real_hatsuon: - text = re.sub(regex, replacement, text) - return text - - -def japanese_to_ipa(text): - text = japanese_to_romaji_with_accent(text).replace('...', '…') - text = re.sub( - r'([aiueo])\1+', lambda x: x.group(0)[0]+'ː'*(len(x.group(0))-1), text) - text = get_real_sokuon(text) - text = get_real_hatsuon(text) - for regex, replacement in _romaji_to_ipa: - text = re.sub(regex, replacement, text) - return text - - -def japanese_to_ipa2(text): - text = japanese_to_romaji_with_accent(text).replace('...', '…') - text = get_real_sokuon(text) - text = get_real_hatsuon(text) - for regex, replacement in _romaji_to_ipa2: - text = re.sub(regex, replacement, text) - return text - - -def japanese_to_ipa3(text): - text = japanese_to_ipa2(text).replace('n^', 'ȵ').replace( - 'ʃ', 'ɕ').replace('*', '\u0325').replace('#', '\u031a') - text = re.sub( - r'([aiɯeo])\1+', lambda x: x.group(0)[0]+'ː'*(len(x.group(0))-1), text) - text = re.sub(r'((?:^|\s)(?:ts|tɕ|[kpt]))', r'\1ʰ', text) - return text diff --git a/text/korean.py b/text/korean.py deleted file mode 100644 index d6368c1..0000000 --- a/text/korean.py +++ /dev/null @@ -1,210 +0,0 @@ -import re -from jamo import h2j, j2hcj -import ko_pron - - -# This is a list of Korean classifiers preceded by pure Korean numerals. -_korean_classifiers = '군데 권 개 그루 닢 대 두 마리 모 모금 뭇 발 발짝 방 번 벌 보루 살 수 술 시 쌈 움큼 정 짝 채 척 첩 축 켤레 톨 통' - -# List of (hangul, hangul divided) pairs: -_hangul_divided = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('ㄳ', 'ㄱㅅ'), - ('ㄵ', 'ㄴㅈ'), - ('ㄶ', 'ㄴㅎ'), - ('ㄺ', 'ㄹㄱ'), - ('ㄻ', 'ㄹㅁ'), - ('ㄼ', 'ㄹㅂ'), - ('ㄽ', 'ㄹㅅ'), - ('ㄾ', 'ㄹㅌ'), - ('ㄿ', 'ㄹㅍ'), - ('ㅀ', 'ㄹㅎ'), - ('ㅄ', 'ㅂㅅ'), - ('ㅘ', 'ㅗㅏ'), - ('ㅙ', 'ㅗㅐ'), - ('ㅚ', 'ㅗㅣ'), - ('ㅝ', 'ㅜㅓ'), - ('ㅞ', 'ㅜㅔ'), - ('ㅟ', 'ㅜㅣ'), - ('ㅢ', 'ㅡㅣ'), - ('ㅑ', 'ㅣㅏ'), - ('ㅒ', 'ㅣㅐ'), - ('ㅕ', 'ㅣㅓ'), - ('ㅖ', 'ㅣㅔ'), - ('ㅛ', 'ㅣㅗ'), - ('ㅠ', 'ㅣㅜ') -]] - -# List of (Latin alphabet, hangul) pairs: -_latin_to_hangul = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ - ('a', '에이'), - ('b', '비'), - ('c', '시'), - ('d', '디'), - ('e', '이'), - ('f', '에프'), - ('g', '지'), - ('h', '에이치'), - ('i', '아이'), - ('j', '제이'), - ('k', '케이'), - ('l', '엘'), - ('m', '엠'), - ('n', '엔'), - ('o', '오'), - ('p', '피'), - ('q', '큐'), - ('r', '아르'), - ('s', '에스'), - ('t', '티'), - ('u', '유'), - ('v', '브이'), - ('w', '더블유'), - ('x', '엑스'), - ('y', '와이'), - ('z', '제트') -]] - -# List of (ipa, lazy ipa) pairs: -_ipa_to_lazy_ipa = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ - ('t͡ɕ','ʧ'), - ('d͡ʑ','ʥ'), - ('ɲ','n^'), - ('ɕ','ʃ'), - ('ʷ','w'), - ('ɭ','l`'), - ('ʎ','ɾ'), - ('ɣ','ŋ'), - ('ɰ','ɯ'), - ('ʝ','j'), - ('ʌ','ə'), - ('ɡ','g'), - ('\u031a','#'), - ('\u0348','='), - ('\u031e',''), - ('\u0320',''), - ('\u0339','') -]] - - -def latin_to_hangul(text): - for regex, replacement in _latin_to_hangul: - text = re.sub(regex, replacement, text) - return text - - -def divide_hangul(text): - text = j2hcj(h2j(text)) - for regex, replacement in _hangul_divided: - text = re.sub(regex, replacement, text) - return text - - -def hangul_number(num, sino=True): - '''Reference https://github.com/Kyubyong/g2pK''' - num = re.sub(',', '', num) - - if num == '0': - return '영' - if not sino and num == '20': - return '스무' - - digits = '123456789' - names = '일이삼사오육칠팔구' - digit2name = {d: n for d, n in zip(digits, names)} - - modifiers = '한 두 세 네 다섯 여섯 일곱 여덟 아홉' - decimals = '열 스물 서른 마흔 쉰 예순 일흔 여든 아흔' - digit2mod = {d: mod for d, mod in zip(digits, modifiers.split())} - digit2dec = {d: dec for d, dec in zip(digits, decimals.split())} - - spelledout = [] - for i, digit in enumerate(num): - i = len(num) - i - 1 - if sino: - if i == 0: - name = digit2name.get(digit, '') - elif i == 1: - name = digit2name.get(digit, '') + '십' - name = name.replace('일십', '십') - else: - if i == 0: - name = digit2mod.get(digit, '') - elif i == 1: - name = digit2dec.get(digit, '') - if digit == '0': - if i % 4 == 0: - last_three = spelledout[-min(3, len(spelledout)):] - if ''.join(last_three) == '': - spelledout.append('') - continue - else: - spelledout.append('') - continue - if i == 2: - name = digit2name.get(digit, '') + '백' - name = name.replace('일백', '백') - elif i == 3: - name = digit2name.get(digit, '') + '천' - name = name.replace('일천', '천') - elif i == 4: - name = digit2name.get(digit, '') + '만' - name = name.replace('일만', '만') - elif i == 5: - name = digit2name.get(digit, '') + '십' - name = name.replace('일십', '십') - elif i == 6: - name = digit2name.get(digit, '') + '백' - name = name.replace('일백', '백') - elif i == 7: - name = digit2name.get(digit, '') + '천' - name = name.replace('일천', '천') - elif i == 8: - name = digit2name.get(digit, '') + '억' - elif i == 9: - name = digit2name.get(digit, '') + '십' - elif i == 10: - name = digit2name.get(digit, '') + '백' - elif i == 11: - name = digit2name.get(digit, '') + '천' - elif i == 12: - name = digit2name.get(digit, '') + '조' - elif i == 13: - name = digit2name.get(digit, '') + '십' - elif i == 14: - name = digit2name.get(digit, '') + '백' - elif i == 15: - name = digit2name.get(digit, '') + '천' - spelledout.append(name) - return ''.join(elem for elem in spelledout) - - -def number_to_hangul(text): - '''Reference https://github.com/Kyubyong/g2pK''' - tokens = set(re.findall(r'(\d[\d,]*)([\uac00-\ud71f]+)', text)) - for token in tokens: - num, classifier = token - if classifier[:2] in _korean_classifiers or classifier[0] in _korean_classifiers: - spelledout = hangul_number(num, sino=False) - else: - spelledout = hangul_number(num, sino=True) - text = text.replace(f'{num}{classifier}', f'{spelledout}{classifier}') - # digit by digit for remaining digits - digits = '0123456789' - names = '영일이삼사오육칠팔구' - for d, n in zip(digits, names): - text = text.replace(d, n) - return text - - -def korean_to_lazy_ipa(text): - text = latin_to_hangul(text) - text = number_to_hangul(text) - text=re.sub('[\uac00-\ud7af]+',lambda x:ko_pron.romanise(x.group(0),'ipa').split('] ~ [')[0],text) - for regex, replacement in _ipa_to_lazy_ipa: - text = re.sub(regex, replacement, text) - return text - - -def korean_to_ipa(text): - text = korean_to_lazy_ipa(text) - return text.replace('ʧ','tʃ').replace('ʥ','dʑ') diff --git a/text/mandarin.py b/text/mandarin.py deleted file mode 100644 index 6cad78f..0000000 --- a/text/mandarin.py +++ /dev/null @@ -1,326 +0,0 @@ -import os -import sys -import re -from pypinyin import lazy_pinyin, BOPOMOFO -import jieba -import cn2an -import logging - - -# List of (Latin alphabet, bopomofo) pairs: -_latin_to_bopomofo = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ - ('a', 'ㄟˉ'), - ('b', 'ㄅㄧˋ'), - ('c', 'ㄙㄧˉ'), - ('d', 'ㄉㄧˋ'), - ('e', 'ㄧˋ'), - ('f', 'ㄝˊㄈㄨˋ'), - ('g', 'ㄐㄧˋ'), - ('h', 'ㄝˇㄑㄩˋ'), - ('i', 'ㄞˋ'), - ('j', 'ㄐㄟˋ'), - ('k', 'ㄎㄟˋ'), - ('l', 'ㄝˊㄛˋ'), - ('m', 'ㄝˊㄇㄨˋ'), - ('n', 'ㄣˉ'), - ('o', 'ㄡˉ'), - ('p', 'ㄆㄧˉ'), - ('q', 'ㄎㄧㄡˉ'), - ('r', 'ㄚˋ'), - ('s', 'ㄝˊㄙˋ'), - ('t', 'ㄊㄧˋ'), - ('u', 'ㄧㄡˉ'), - ('v', 'ㄨㄧˉ'), - ('w', 'ㄉㄚˋㄅㄨˋㄌㄧㄡˋ'), - ('x', 'ㄝˉㄎㄨˋㄙˋ'), - ('y', 'ㄨㄞˋ'), - ('z', 'ㄗㄟˋ') -]] - -# List of (bopomofo, romaji) pairs: -_bopomofo_to_romaji = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('ㄅㄛ', 'p⁼wo'), - ('ㄆㄛ', 'pʰwo'), - ('ㄇㄛ', 'mwo'), - ('ㄈㄛ', 'fwo'), - ('ㄅ', 'p⁼'), - ('ㄆ', 'pʰ'), - ('ㄇ', 'm'), - ('ㄈ', 'f'), - ('ㄉ', 't⁼'), - ('ㄊ', 'tʰ'), - ('ㄋ', 'n'), - ('ㄌ', 'l'), - ('ㄍ', 'k⁼'), - ('ㄎ', 'kʰ'), - ('ㄏ', 'h'), - ('ㄐ', 'ʧ⁼'), - ('ㄑ', 'ʧʰ'), - ('ㄒ', 'ʃ'), - ('ㄓ', 'ʦ`⁼'), - ('ㄔ', 'ʦ`ʰ'), - ('ㄕ', 's`'), - ('ㄖ', 'ɹ`'), - ('ㄗ', 'ʦ⁼'), - ('ㄘ', 'ʦʰ'), - ('ㄙ', 's'), - ('ㄚ', 'a'), - ('ㄛ', 'o'), - ('ㄜ', 'ə'), - ('ㄝ', 'e'), - ('ㄞ', 'ai'), - ('ㄟ', 'ei'), - ('ㄠ', 'au'), - ('ㄡ', 'ou'), - ('ㄧㄢ', 'yeNN'), - ('ㄢ', 'aNN'), - ('ㄧㄣ', 'iNN'), - ('ㄣ', 'əNN'), - ('ㄤ', 'aNg'), - ('ㄧㄥ', 'iNg'), - ('ㄨㄥ', 'uNg'), - ('ㄩㄥ', 'yuNg'), - ('ㄥ', 'əNg'), - ('ㄦ', 'əɻ'), - ('ㄧ', 'i'), - ('ㄨ', 'u'), - ('ㄩ', 'ɥ'), - ('ˉ', '→'), - ('ˊ', '↑'), - ('ˇ', '↓↑'), - ('ˋ', '↓'), - ('˙', ''), - (',', ','), - ('。', '.'), - ('!', '!'), - ('?', '?'), - ('—', '-') -]] - -# List of (romaji, ipa) pairs: -_romaji_to_ipa = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ - ('ʃy', 'ʃ'), - ('ʧʰy', 'ʧʰ'), - ('ʧ⁼y', 'ʧ⁼'), - ('NN', 'n'), - ('Ng', 'ŋ'), - ('y', 'j'), - ('h', 'x') -]] - -# List of (bopomofo, ipa) pairs: -_bopomofo_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('ㄅㄛ', 'p⁼wo'), - ('ㄆㄛ', 'pʰwo'), - ('ㄇㄛ', 'mwo'), - ('ㄈㄛ', 'fwo'), - ('ㄅ', 'p⁼'), - ('ㄆ', 'pʰ'), - ('ㄇ', 'm'), - ('ㄈ', 'f'), - ('ㄉ', 't⁼'), - ('ㄊ', 'tʰ'), - ('ㄋ', 'n'), - ('ㄌ', 'l'), - ('ㄍ', 'k⁼'), - ('ㄎ', 'kʰ'), - ('ㄏ', 'x'), - ('ㄐ', 'tʃ⁼'), - ('ㄑ', 'tʃʰ'), - ('ㄒ', 'ʃ'), - ('ㄓ', 'ts`⁼'), - ('ㄔ', 'ts`ʰ'), - ('ㄕ', 's`'), - ('ㄖ', 'ɹ`'), - ('ㄗ', 'ts⁼'), - ('ㄘ', 'tsʰ'), - ('ㄙ', 's'), - ('ㄚ', 'a'), - ('ㄛ', 'o'), - ('ㄜ', 'ə'), - ('ㄝ', 'ɛ'), - ('ㄞ', 'aɪ'), - ('ㄟ', 'eɪ'), - ('ㄠ', 'ɑʊ'), - ('ㄡ', 'oʊ'), - ('ㄧㄢ', 'jɛn'), - ('ㄩㄢ', 'ɥæn'), - ('ㄢ', 'an'), - ('ㄧㄣ', 'in'), - ('ㄩㄣ', 'ɥn'), - ('ㄣ', 'ən'), - ('ㄤ', 'ɑŋ'), - ('ㄧㄥ', 'iŋ'), - ('ㄨㄥ', 'ʊŋ'), - ('ㄩㄥ', 'jʊŋ'), - ('ㄥ', 'əŋ'), - ('ㄦ', 'əɻ'), - ('ㄧ', 'i'), - ('ㄨ', 'u'), - ('ㄩ', 'ɥ'), - ('ˉ', '→'), - ('ˊ', '↑'), - ('ˇ', '↓↑'), - ('ˋ', '↓'), - ('˙', ''), - (',', ','), - ('。', '.'), - ('!', '!'), - ('?', '?'), - ('—', '-') -]] - -# List of (bopomofo, ipa2) pairs: -_bopomofo_to_ipa2 = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('ㄅㄛ', 'pwo'), - ('ㄆㄛ', 'pʰwo'), - ('ㄇㄛ', 'mwo'), - ('ㄈㄛ', 'fwo'), - ('ㄅ', 'p'), - ('ㄆ', 'pʰ'), - ('ㄇ', 'm'), - ('ㄈ', 'f'), - ('ㄉ', 't'), - ('ㄊ', 'tʰ'), - ('ㄋ', 'n'), - ('ㄌ', 'l'), - ('ㄍ', 'k'), - ('ㄎ', 'kʰ'), - ('ㄏ', 'h'), - ('ㄐ', 'tɕ'), - ('ㄑ', 'tɕʰ'), - ('ㄒ', 'ɕ'), - ('ㄓ', 'tʂ'), - ('ㄔ', 'tʂʰ'), - ('ㄕ', 'ʂ'), - ('ㄖ', 'ɻ'), - ('ㄗ', 'ts'), - ('ㄘ', 'tsʰ'), - ('ㄙ', 's'), - ('ㄚ', 'a'), - ('ㄛ', 'o'), - ('ㄜ', 'ɤ'), - ('ㄝ', 'ɛ'), - ('ㄞ', 'aɪ'), - ('ㄟ', 'eɪ'), - ('ㄠ', 'ɑʊ'), - ('ㄡ', 'oʊ'), - ('ㄧㄢ', 'jɛn'), - ('ㄩㄢ', 'yæn'), - ('ㄢ', 'an'), - ('ㄧㄣ', 'in'), - ('ㄩㄣ', 'yn'), - ('ㄣ', 'ən'), - ('ㄤ', 'ɑŋ'), - ('ㄧㄥ', 'iŋ'), - ('ㄨㄥ', 'ʊŋ'), - ('ㄩㄥ', 'jʊŋ'), - ('ㄥ', 'ɤŋ'), - ('ㄦ', 'əɻ'), - ('ㄧ', 'i'), - ('ㄨ', 'u'), - ('ㄩ', 'y'), - ('ˉ', '˥'), - ('ˊ', '˧˥'), - ('ˇ', '˨˩˦'), - ('ˋ', '˥˩'), - ('˙', ''), - (',', ','), - ('。', '.'), - ('!', '!'), - ('?', '?'), - ('—', '-') -]] - - -def number_to_chinese(text): - numbers = re.findall(r'\d+(?:\.?\d+)?', text) - for number in numbers: - text = text.replace(number, cn2an.an2cn(number), 1) - return text - - -def chinese_to_bopomofo(text): - text = text.replace('、', ',').replace(';', ',').replace(':', ',') - words = jieba.lcut(text, cut_all=False) - text = '' - for word in words: - bopomofos = lazy_pinyin(word, BOPOMOFO) - if not re.search('[\u4e00-\u9fff]', word): - text += word - continue - for i in range(len(bopomofos)): - bopomofos[i] = re.sub(r'([\u3105-\u3129])$', r'\1ˉ', bopomofos[i]) - if text != '': - text += ' ' - text += ''.join(bopomofos) - return text - - -def latin_to_bopomofo(text): - for regex, replacement in _latin_to_bopomofo: - text = re.sub(regex, replacement, text) - return text - - -def bopomofo_to_romaji(text): - for regex, replacement in _bopomofo_to_romaji: - text = re.sub(regex, replacement, text) - return text - - -def bopomofo_to_ipa(text): - for regex, replacement in _bopomofo_to_ipa: - text = re.sub(regex, replacement, text) - return text - - -def bopomofo_to_ipa2(text): - for regex, replacement in _bopomofo_to_ipa2: - text = re.sub(regex, replacement, text) - return text - - -def chinese_to_romaji(text): - text = number_to_chinese(text) - text = chinese_to_bopomofo(text) - text = latin_to_bopomofo(text) - text = bopomofo_to_romaji(text) - text = re.sub('i([aoe])', r'y\1', text) - text = re.sub('u([aoəe])', r'w\1', text) - text = re.sub('([ʦsɹ]`[⁼ʰ]?)([→↓↑ ]+|$)', - r'\1ɹ`\2', text).replace('ɻ', 'ɹ`') - text = re.sub('([ʦs][⁼ʰ]?)([→↓↑ ]+|$)', r'\1ɹ\2', text) - return text - - -def chinese_to_lazy_ipa(text): - text = chinese_to_romaji(text) - for regex, replacement in _romaji_to_ipa: - text = re.sub(regex, replacement, text) - return text - - -def chinese_to_ipa(text): - text = number_to_chinese(text) - text = chinese_to_bopomofo(text) - text = latin_to_bopomofo(text) - text = bopomofo_to_ipa(text) - text = re.sub('i([aoe])', r'j\1', text) - text = re.sub('u([aoəe])', r'w\1', text) - text = re.sub('([sɹ]`[⁼ʰ]?)([→↓↑ ]+|$)', - r'\1ɹ`\2', text).replace('ɻ', 'ɹ`') - text = re.sub('([s][⁼ʰ]?)([→↓↑ ]+|$)', r'\1ɹ\2', text) - return text - - -def chinese_to_ipa2(text): - text = number_to_chinese(text) - text = chinese_to_bopomofo(text) - text = latin_to_bopomofo(text) - text = bopomofo_to_ipa2(text) - text = re.sub(r'i([aoe])', r'j\1', text) - text = re.sub(r'u([aoəe])', r'w\1', text) - text = re.sub(r'([ʂɹ]ʰ?)([˩˨˧˦˥ ]+|$)', r'\1ʅ\2', text) - text = re.sub(r'(sʰ?)([˩˨˧˦˥ ]+|$)', r'\1ɿ\2', text) - return text diff --git a/text/ngu_dialect.py b/text/ngu_dialect.py deleted file mode 100644 index cb1831d..0000000 --- a/text/ngu_dialect.py +++ /dev/null @@ -1,30 +0,0 @@ -import re -import opencc - - -dialects = {'SZ': 'suzhou', 'WX': 'wuxi', 'CZ': 'changzhou', 'HZ': 'hangzhou', - 'SX': 'shaoxing', 'NB': 'ningbo', 'JJ': 'jingjiang', 'YX': 'yixing', - 'JD': 'jiading', 'ZR': 'zhenru', 'PH': 'pinghu', 'TX': 'tongxiang', - 'JS': 'jiashan', 'HN': 'xiashi', 'LP': 'linping', 'XS': 'xiaoshan', - 'FY': 'fuyang', 'RA': 'ruao', 'CX': 'cixi', 'SM': 'sanmen', - 'TT': 'tiantai', 'WZ': 'wenzhou', 'SC': 'suichang', 'YB': 'youbu'} - -converters = {} - -for dialect in dialects.values(): - try: - converters[dialect] = opencc.OpenCC(dialect) - except: - pass - - -def ngu_dialect_to_ipa(text, dialect): - dialect = dialects[dialect] - text = converters[dialect].convert(text).replace('-','').replace('$',' ') - text = re.sub(r'[、;:]', ',', text) - text = re.sub(r'\s*,\s*', ', ', text) - text = re.sub(r'\s*。\s*', '. ', text) - text = re.sub(r'\s*?\s*', '? ', text) - text = re.sub(r'\s*!\s*', '! ', text) - text = re.sub(r'\s*$', '', text) - return text diff --git a/text/sanskrit.py b/text/sanskrit.py deleted file mode 100644 index bf39b6c..0000000 --- a/text/sanskrit.py +++ /dev/null @@ -1,62 +0,0 @@ -import re -from indic_transliteration import sanscript - - -# List of (iast, ipa) pairs: -_iast_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('a', 'ə'), - ('ā', 'aː'), - ('ī', 'iː'), - ('ū', 'uː'), - ('ṛ', 'ɹ`'), - ('ṝ', 'ɹ`ː'), - ('ḷ', 'l`'), - ('ḹ', 'l`ː'), - ('e', 'eː'), - ('o', 'oː'), - ('k', 'k⁼'), - ('k⁼h', 'kʰ'), - ('g', 'g⁼'), - ('g⁼h', 'gʰ'), - ('ṅ', 'ŋ'), - ('c', 'ʧ⁼'), - ('ʧ⁼h', 'ʧʰ'), - ('j', 'ʥ⁼'), - ('ʥ⁼h', 'ʥʰ'), - ('ñ', 'n^'), - ('ṭ', 't`⁼'), - ('t`⁼h', 't`ʰ'), - ('ḍ', 'd`⁼'), - ('d`⁼h', 'd`ʰ'), - ('ṇ', 'n`'), - ('t', 't⁼'), - ('t⁼h', 'tʰ'), - ('d', 'd⁼'), - ('d⁼h', 'dʰ'), - ('p', 'p⁼'), - ('p⁼h', 'pʰ'), - ('b', 'b⁼'), - ('b⁼h', 'bʰ'), - ('y', 'j'), - ('ś', 'ʃ'), - ('ṣ', 's`'), - ('r', 'ɾ'), - ('l̤', 'l`'), - ('h', 'ɦ'), - ("'", ''), - ('~', '^'), - ('ṃ', '^') -]] - - -def devanagari_to_ipa(text): - text = text.replace('ॐ', 'ओम्') - text = re.sub(r'\s*।\s*$', '.', text) - text = re.sub(r'\s*।\s*', ', ', text) - text = re.sub(r'\s*॥', '.', text) - text = sanscript.transliterate(text, sanscript.DEVANAGARI, sanscript.IAST) - for regex, replacement in _iast_to_ipa: - text = re.sub(regex, replacement, text) - text = re.sub('(.)[`ː]*ḥ', lambda x: x.group(0) - [:-1]+'h'+x.group(1)+'*', text) - return text diff --git a/text/shanghainese.py b/text/shanghainese.py deleted file mode 100644 index 9b2cd22..0000000 --- a/text/shanghainese.py +++ /dev/null @@ -1,64 +0,0 @@ -import re -import cn2an -import opencc - - -converter = opencc.OpenCC('zaonhe') - -# List of (Latin alphabet, ipa) pairs: -_latin_to_ipa = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('A', 'ᴇ'), - ('B', 'bi'), - ('C', 'si'), - ('D', 'di'), - ('E', 'i'), - ('F', 'ᴇf'), - ('G', 'dʑi'), - ('H', 'ᴇtɕʰ'), - ('I', 'ᴀi'), - ('J', 'dʑᴇ'), - ('K', 'kʰᴇ'), - ('L', 'ᴇl'), - ('M', 'ᴇm'), - ('N', 'ᴇn'), - ('O', 'o'), - ('P', 'pʰi'), - ('Q', 'kʰiu'), - ('R', 'ᴀl'), - ('S', 'ᴇs'), - ('T', 'tʰi'), - ('U', 'ɦiu'), - ('V', 'vi'), - ('W', 'dᴀbɤliu'), - ('X', 'ᴇks'), - ('Y', 'uᴀi'), - ('Z', 'zᴇ') -]] - - -def _number_to_shanghainese(num): - num = cn2an.an2cn(num).replace('一十','十').replace('二十', '廿').replace('二', '两') - return re.sub(r'((?:^|[^三四五六七八九])十|廿)两', r'\1二', num) - - -def number_to_shanghainese(text): - return re.sub(r'\d+(?:\.?\d+)?', lambda x: _number_to_shanghainese(x.group()), text) - - -def latin_to_ipa(text): - for regex, replacement in _latin_to_ipa: - text = re.sub(regex, replacement, text) - return text - - -def shanghainese_to_ipa(text): - text = number_to_shanghainese(text.upper()) - text = converter.convert(text).replace('-','').replace('$',' ') - text = re.sub(r'[A-Z]', lambda x: latin_to_ipa(x.group())+' ', text) - text = re.sub(r'[、;:]', ',', text) - text = re.sub(r'\s*,\s*', ', ', text) - text = re.sub(r'\s*。\s*', '. ', text) - text = re.sub(r'\s*?\s*', '? ', text) - text = re.sub(r'\s*!\s*', '! ', text) - text = re.sub(r'\s*$', '', text) - return text diff --git a/text/symbols.py b/text/symbols.py deleted file mode 100644 index 651d481..0000000 --- a/text/symbols.py +++ /dev/null @@ -1,76 +0,0 @@ -''' -Defines the set of symbols used in text input to the model. -''' - -# japanese_cleaners -# _pad = '_' -# _punctuation = ',.!?-' -# _letters = 'AEINOQUabdefghijkmnoprstuvwyzʃʧ↓↑ ' - - -'''# japanese_cleaners2 -_pad = '_' -_punctuation = ',.!?-~…' -_letters = 'AEINOQUabdefghijkmnoprstuvwyzʃʧʦ↓↑ ' -''' - - -'''# korean_cleaners -_pad = '_' -_punctuation = ',.!?…~' -_letters = 'ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㄲㄸㅃㅆㅉㅏㅓㅗㅜㅡㅣㅐㅔ ' -''' - -'''# chinese_cleaners -_pad = '_' -_punctuation = ',。!?—…' -_letters = 'ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩˉˊˇˋ˙ ' -''' - -# # zh_ja_mixture_cleaners -# _pad = '_' -# _punctuation = ',.!?-~…' -# _letters = 'AEINOQUabdefghijklmnoprstuvwyzʃʧʦɯɹəɥ⁼ʰ`→↓↑ ' - - -'''# sanskrit_cleaners -_pad = '_' -_punctuation = '।' -_letters = 'ँंःअआइईउऊऋएऐओऔकखगघङचछजझञटठडढणतथदधनपफबभमयरलळवशषसहऽािीुूृॄेैोौ्ॠॢ ' -''' - -'''# cjks_cleaners -_pad = '_' -_punctuation = ',.!?-~…' -_letters = 'NQabdefghijklmnopstuvwxyzʃʧʥʦɯɹəɥçɸɾβŋɦː⁼ʰ`^#*=→↓↑ ' -''' - -'''# thai_cleaners -_pad = '_' -_punctuation = '.!? ' -_letters = 'กขฃคฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลวศษสหฬอฮฯะัาำิีึืุูเแโใไๅๆ็่้๊๋์' -''' - -# # cjke_cleaners2 -_pad = '_' -_punctuation = ',.!?-~…' -_letters = 'NQabdefghijklmnopstuvwxyzɑæʃʑçɯɪɔɛɹðəɫɥɸʊɾʒθβŋɦ⁼ʰ`^#*=ˈˌ→↓↑ ' - - -'''# shanghainese_cleaners -_pad = '_' -_punctuation = ',.!?…' -_letters = 'abdfghiklmnopstuvyzøŋȵɑɔɕəɤɦɪɿʑʔʰ̩̃ᴀᴇ15678 ' -''' - -'''# chinese_dialect_cleaners -_pad = '_' -_punctuation = ',.!?~…─' -_letters = '#Nabdefghijklmnoprstuvwxyzæçøŋœȵɐɑɒɓɔɕɗɘəɚɛɜɣɤɦɪɭɯɵɷɸɻɾɿʂʅʊʋʌʏʑʔʦʮʰʷˀː˥˦˧˨˩̥̩̃̚ᴀᴇ↑↓∅ⱼ ' -''' - -# Export all symbols: -symbols = [_pad] + list(_punctuation) + list(_letters) - -# Special symbol ids -SPACE_ID = symbols.index(" ") diff --git a/text/thai.py b/text/thai.py deleted file mode 100644 index 0a42324..0000000 --- a/text/thai.py +++ /dev/null @@ -1,44 +0,0 @@ -import re -from num_thai.thainumbers import NumThai - - -num = NumThai() - -# List of (Latin alphabet, Thai) pairs: -_latin_to_thai = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [ - ('a', 'เอ'), - ('b','บี'), - ('c','ซี'), - ('d','ดี'), - ('e','อี'), - ('f','เอฟ'), - ('g','จี'), - ('h','เอช'), - ('i','ไอ'), - ('j','เจ'), - ('k','เค'), - ('l','แอล'), - ('m','เอ็ม'), - ('n','เอ็น'), - ('o','โอ'), - ('p','พี'), - ('q','คิว'), - ('r','แอร์'), - ('s','เอส'), - ('t','ที'), - ('u','ยู'), - ('v','วี'), - ('w','ดับเบิลยู'), - ('x','เอ็กซ์'), - ('y','วาย'), - ('z','ซี') -]] - - -def num_to_thai(text): - return re.sub(r'(?:\d+(?:,?\d+)?)+(?:\.\d+(?:,?\d+)?)?', lambda x: ''.join(num.NumberToTextThai(float(x.group(0).replace(',', '')))), text) - -def latin_to_thai(text): - for regex, replacement in _latin_to_thai: - text = re.sub(regex, replacement, text) - return text From 5a4c1b5009462e7fb4a51d38d6379457fa7d60b6 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 16 Nov 2023 04:29:32 +0000 Subject: [PATCH 09/17] =?UTF-8?q?peppa=E7=9A=84vits=E5=92=8Cvits-finetune?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E4=B8=8D=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ audio.mp3 | Bin 7541 -> 7750 bytes audio.wav | Bin 78380 -> 79404 bytes TTS-flask-peppa.py => old/TTS-flask-peppa.py | 0 .../TTS-flask-peppa2.py | 0 .../TTS-flask-peppa3.py | 0 .../check-post-detail.py | 0 7 files changed, 3 insertions(+) create mode 100644 .gitignore rename TTS-flask-peppa.py => old/TTS-flask-peppa.py (100%) rename TTS-flask-peppa2.py => old/TTS-flask-peppa2.py (100%) rename TTS-flask-peppa3.py => old/TTS-flask-peppa3.py (100%) rename check-post-detail.py => old/check-post-detail.py (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f31b5ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/TTS/models/* +/ASR/resources/models/* +/SentimentEngine/models/* diff --git a/audio.mp3 b/audio.mp3 index 01e7b3615be5f4d192f3147b298fef248ff35d61..e533cd0b928a89bacc5e3dcba1a340512a7b5480 100644 GIT binary patch literal 7750 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 M0f6X#vB&WL09i-n^Z)<= literal 7541 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 hM9zMW-g{{qvB-yHw| literal 78380 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%0A3F$T`bd#r4NCh&Pg#RJDUTm=>B1 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 diff --git a/TTS-flask-peppa.py b/old/TTS-flask-peppa.py similarity index 100% rename from TTS-flask-peppa.py rename to old/TTS-flask-peppa.py diff --git a/TTS-flask-peppa2.py b/old/TTS-flask-peppa2.py similarity index 100% rename from TTS-flask-peppa2.py rename to old/TTS-flask-peppa2.py diff --git a/TTS-flask-peppa3.py b/old/TTS-flask-peppa3.py similarity index 100% rename from TTS-flask-peppa3.py rename to old/TTS-flask-peppa3.py diff --git a/check-post-detail.py b/old/check-post-detail.py similarity index 100% rename from check-post-detail.py rename to old/check-post-detail.py From c61c3bfdaab4badbff7be44d26503a5b8e61bd98 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 19 Nov 2023 16:37:57 +0800 Subject: [PATCH 10/17] remove google translate --- .DS_Store | Bin 0 -> 8196 bytes .history/GPT/GPTService_20231106211946.py | 127 ++ .history/GPT/GPTService_20231106232125.py | 125 ++ .history/GPT/GPTService_20231106233755.py | 125 ++ .history/GPT/GPTService_20231107005410.py | 124 ++ .history/GPT/GPTService_20231107010143.py | 124 ++ .history/GPT/GPTService_20231107010217.py | 124 ++ .history/GPT/GPTService_20231119162925.py | 106 ++ .history/SocketServer_20231106140934.py | 203 +++ .history/SocketServer_20231106145512.py | 203 +++ .history/TTS/TTService_20231106140934.py | 62 + .history/TTS/TTService_20231106142808.py | 62 + .history/TTS/TTService_20231106143302.py | 62 + .history/TTS/TTService_20231106145859.py | 62 + .history/TTS/TTService_20231106150025.py | 62 + .history/TTS/TTService_20231106164111.py | 58 + .history/TTS/TTService_20231106164221.py | 58 + ASR/__pycache__/ASRService.cpython-311.pyc | Bin 0 -> 1599 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 258 bytes .../rapid_paraformer.cpython-311.pyc | Bin 0 -> 9754 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 24654 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 390 bytes .../__pycache__/feature.cpython-311.pyc | Bin 0 -> 22526 bytes .../__pycache__/ivector.cpython-311.pyc | Bin 0 -> 2785 bytes GPT/GPTService-openai.py | 97 ++ GPT/GPTService.py | 41 +- GPT/__pycache__/GPTService.cpython-311.pyc | Bin 0 -> 6431 bytes GPT/__pycache__/machine_id.cpython-311.pyc | Bin 0 -> 1865 bytes GPT/__pycache__/tune.cpython-311.pyc | Bin 0 -> 1151 bytes .../SentimentEngine.cpython-311.pyc | Bin 0 -> 2589 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 181 bytes SocketServer.py | 2 +- TTS/TTService-cuda.py | 59 + TTS/TTService-pytorch-mps.py | 62 + TTS/TTService.py | 12 +- TTS/__pycache__/TTService.cpython-311.pyc | Bin 0 -> 4511 bytes log.log | 1203 +++++++++++++++++ log_async.log | 1203 +++++++++++++++++ .../FlushingFileHandler.cpython-311.pyc | Bin 0 -> 2045 bytes utils/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 171 bytes 40 files changed, 4341 insertions(+), 25 deletions(-) create mode 100644 .DS_Store create mode 100644 .history/GPT/GPTService_20231106211946.py create mode 100644 .history/GPT/GPTService_20231106232125.py create mode 100644 .history/GPT/GPTService_20231106233755.py create mode 100644 .history/GPT/GPTService_20231107005410.py create mode 100644 .history/GPT/GPTService_20231107010143.py create mode 100644 .history/GPT/GPTService_20231107010217.py create mode 100644 .history/GPT/GPTService_20231119162925.py create mode 100644 .history/SocketServer_20231106140934.py create mode 100644 .history/SocketServer_20231106145512.py create mode 100644 .history/TTS/TTService_20231106140934.py create mode 100644 .history/TTS/TTService_20231106142808.py create mode 100644 .history/TTS/TTService_20231106143302.py create mode 100644 .history/TTS/TTService_20231106145859.py create mode 100644 .history/TTS/TTService_20231106150025.py create mode 100644 .history/TTS/TTService_20231106164111.py create mode 100644 .history/TTS/TTService_20231106164221.py create mode 100644 ASR/__pycache__/ASRService.cpython-311.pyc create mode 100644 ASR/rapid_paraformer/__pycache__/__init__.cpython-311.pyc create mode 100644 ASR/rapid_paraformer/__pycache__/rapid_paraformer.cpython-311.pyc create mode 100644 ASR/rapid_paraformer/__pycache__/utils.cpython-311.pyc create mode 100644 ASR/rapid_paraformer/kaldifeat/__pycache__/__init__.cpython-311.pyc create mode 100644 ASR/rapid_paraformer/kaldifeat/__pycache__/feature.cpython-311.pyc create mode 100644 ASR/rapid_paraformer/kaldifeat/__pycache__/ivector.cpython-311.pyc create mode 100644 GPT/GPTService-openai.py create mode 100644 GPT/__pycache__/GPTService.cpython-311.pyc create mode 100644 GPT/__pycache__/machine_id.cpython-311.pyc create mode 100644 GPT/__pycache__/tune.cpython-311.pyc create mode 100644 SentimentEngine/__pycache__/SentimentEngine.cpython-311.pyc create mode 100644 SentimentEngine/__pycache__/__init__.cpython-311.pyc create mode 100644 TTS/TTService-cuda.py create mode 100644 TTS/TTService-pytorch-mps.py create mode 100644 TTS/__pycache__/TTService.cpython-311.pyc create mode 100644 log.log create mode 100644 log_async.log create mode 100644 utils/__pycache__/FlushingFileHandler.cpython-311.pyc create mode 100644 utils/__pycache__/__init__.cpython-311.pyc diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7cc81a05dd895294717589b2a59c1d797d15444a GIT binary patch literal 8196 zcmeHMOOVt=8165-Kqt$iL6+SB!wxQQ7Fdus6b$NV`!^bD;aBKjB&aoiaM(9P^4a7w-qgx)DnXHSx_ptet~))7D~5SCxRpbNd%Gz zBoRm=kVN4B5CM8;%fiQa?<;LmClN>@a8E`+J|EI_NzBAJqA+@NP!$~k2;~tVD%2LT zL70v)6XS?N(olhNB~-46j~GzyBu~e7nHWbDDtCtX@PT+{#3vL)v(xzL$ebagFsYLW zBoVkh0y2GSSQq_e3qv=a-(4pNTU)<@R#Q7}`~*IM*YQWPNByB}m=7yKTfTfy_PTuE zEsVDFg&xNq%8BXiz8B^l&n`y}j%Aa{p-PMlc1dQD4u z&D!CX^ojKkP;=eN4a37auWw$l=|Jw7JLvf@sP!X$2CzxD?B~V5H{%A?cJ(o$Mk|!m zW-g6xMmOrr?jEBrC#F?t#d}Mk<9k7mT@DCyVoE?e+gbFzePvtfdyBqX8T5jjm|D!c z#fqB`?QO1`b)K|?zR*4%%GN;Om&5kRFegMMun*W|=Tz+uvJUzj8cv!C=9=1g<;SWa9t^S(;KdA#C;PpB!H%(=RFmmjidL3?~l4roOhv&o##`9Udf zFWXcrv9ZWpqKiE53TWMGh-JnKT?Bg9F}jz^b(OK23rp{I^99>gqIJdwE_Ug?RTWPq z+-z*&Q_-UL75%|M+D@RvO=cVCkII>M=Yw!>$@XaSXm3sCgPiwE%{I#-p=fBFv16xc z4g^Q@Wqa=su}gf#c_iOM^60jaMvl{IIiX*UmHQ*5aJ;HR)TJA&7|c0u&MZ;{ibAS4 zXIf)Eab~jR^vc`84l$dR*hzMZon~j)S@sq?$39@6u+P~S>;n6eea$YjpV%+#clHOn z!ma`^P=`sFj9Hk6`B;Ee*o4j4g01Ml9z2YF*pD9Ma2N#?;h>BF6;$yQp2PEa38(NX z&f;~vfpho>=kYN<#RXi#_xJ&q@iVUADz0goRVMe%EtQa4gHV&_eq zj@TL9(mN2#oH@%#brXH<Q@DKU-+uDbK)Q+GU(TXh#NNu`8F zIibfSMZvorsCCgy6uR076aaD|2u)TpT&<@vvJ?C<|~Z-L3oNd%Gz{Ob`wZAZ4Fjiwpv5iQT!X}S*6C5yBhQ5d;U t6&=S3qvJT?^?w*rJ58q2Cllj{LXuGV&p!kt?|=D&G input:" + str(input_text)) + URL = "https://translation.googleapis.com/language/translate/v2" + target = dest_lang + key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" + q = input_text + params = {'target': target, 'key': key, 'q': q} + + r = requests.get(url=URL, params=params) + data = r.json() + + translated_text = data['data']['translations'][0]['translatedText'] + print("translate -> translated:" + translated_text) + return translated_text + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://83.238.173.42:40530/v1/chat/completions" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + text = self._translate(text, "EN") + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._translate(prev_text, "zh-CN") + print("--->translated:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() diff --git a/.history/GPT/GPTService_20231106232125.py b/.history/GPT/GPTService_20231106232125.py new file mode 100644 index 0000000..0ea9869 --- /dev/null +++ b/.history/GPT/GPTService_20231106232125.py @@ -0,0 +1,125 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr)) + + #dest_lang: EN, zh-CN + def _translate(self, input_text, dest_lang): + print("translate--> input:" + str(input_text)) + URL = "https://translation.googleapis.com/language/translate/v2" + target = dest_lang + key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" + q = input_text + params = {'target': target, 'key': key, 'q': q} + + r = requests.get(url=URL, params=params) + data = r.json() + + translated_text = data['data']['translations'][0]['translatedText'] + print("translate -> translated:" + translated_text) + return translated_text + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41874/v1/chat/completions" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + text = self._translate(text, "EN") + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._translate(prev_text, "zh-CN") + print("--->translated:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231106233755.py b/.history/GPT/GPTService_20231106233755.py new file mode 100644 index 0000000..8e8942d --- /dev/null +++ b/.history/GPT/GPTService_20231106233755.py @@ -0,0 +1,125 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr)) + + #dest_lang: EN, zh-CN + def _translate(self, input_text, dest_lang): + print("translate--> input:" + str(input_text)) + URL = "https://translation.googleapis.com/language/translate/v2" + target = dest_lang + key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" + q = input_text + params = {'target': target, 'key': key, 'q': q} + + r = requests.get(url=URL, params=params) + data = r.json() + + translated_text = data['data']['translations'][0]['translatedText'] + print("translate -> translated:" + translated_text) + return translated_text + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41874/v1/" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + text = self._translate(text, "EN") + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._translate(prev_text, "zh-CN") + print("--->translated:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231107005410.py b/.history/GPT/GPTService_20231107005410.py new file mode 100644 index 0000000..f7abe13 --- /dev/null +++ b/.history/GPT/GPTService_20231107005410.py @@ -0,0 +1,124 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr, re.UNICODE)) + #dest_lang: EN, zh-CN + def _translate(self, input_text, dest_lang): + print("translate--> input:" + str(input_text)) + URL = "https://translation.googleapis.com/language/translate/v2" + target = dest_lang + key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" + q = input_text + params = {'target': target, 'key': key, 'q': q} + + r = requests.get(url=URL, params=params) + data = r.json() + + translated_text = data['data']['translations'][0]['translatedText'] + print("translate -> translated:" + translated_text) + return translated_text + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + text = self._translate(text, "EN") + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._translate(prev_text, "zh-CN") + print("--->translated:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231107010143.py b/.history/GPT/GPTService_20231107010143.py new file mode 100644 index 0000000..265e589 --- /dev/null +++ b/.history/GPT/GPTService_20231107010143.py @@ -0,0 +1,124 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) +,。?:“! #dest_lang: EN, zh-CN + def _translate(self, input_text, dest_lang): + print("translate--> input:" + str(input_text)) + URL = "https://translation.googleapis.com/language/translate/v2" + target = dest_lang + key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" + q = input_text + params = {'target': target, 'key': key, 'q': q} + + r = requests.get(url=URL, params=params) + data = r.json() + + translated_text = data['data']['translations'][0]['translatedText'] + print("translate -> translated:" + translated_text) + return translated_text + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + text = self._translate(text, "EN") + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._translate(prev_text, "zh-CN") + print("--->translated:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231107010217.py b/.history/GPT/GPTService_20231107010217.py new file mode 100644 index 0000000..be00376 --- /dev/null +++ b/.history/GPT/GPTService_20231107010217.py @@ -0,0 +1,124 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) + + def _translate(self, input_text, dest_lang): + print("translate--> input:" + str(input_text)) + URL = "https://translation.googleapis.com/language/translate/v2" + target = dest_lang + key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" + q = input_text + params = {'target': target, 'key': key, 'q': q} + + r = requests.get(url=URL, params=params) + data = r.json() + + translated_text = data['data']['translations'][0]['translatedText'] + print("translate -> translated:" + translated_text) + return translated_text + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + text = self._translate(text, "EN") + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._translate(prev_text, "zh-CN") + print("--->translated:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231119162925.py b/.history/GPT/GPTService_20231119162925.py new file mode 100644 index 0000000..a9dc188 --- /dev/null +++ b/.history/GPT/GPTService_20231119162925.py @@ -0,0 +1,106 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/SocketServer_20231106140934.py b/.history/SocketServer_20231106140934.py new file mode 100644 index 0000000..76ddab1 --- /dev/null +++ b/.history/SocketServer_20231106140934.py @@ -0,0 +1,203 @@ +import argparse +import os +import socket +import time +import logging +import traceback +from logging.handlers import TimedRotatingFileHandler + +import librosa +import requests +import revChatGPT +import soundfile + +import GPT.tune +from utils.FlushingFileHandler import FlushingFileHandler +from ASR import ASRService +from GPT import GPTService +from TTS import TTService +from SentimentEngine import SentimentEngine + +console_logger = logging.getLogger() +console_logger.setLevel(logging.INFO) +FORMAT = '%(asctime)s %(levelname)s %(message)s' +console_handler = console_logger.handlers[0] +console_handler.setFormatter(logging.Formatter(FORMAT)) +console_logger.setLevel(logging.INFO) +file_handler = FlushingFileHandler("log.log", formatter=logging.Formatter(FORMAT)) +file_handler.setFormatter(logging.Formatter(FORMAT)) +file_handler.setLevel(logging.INFO) +console_logger.addHandler(file_handler) +console_logger.addHandler(console_handler) + + +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Unsupported value encountered.') + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--chatVer", type=int, nargs='?', required=True) + parser.add_argument("--APIKey", type=str, nargs='?', required=False) + parser.add_argument("--email", type=str, nargs='?', required=False) + parser.add_argument("--password", type=str, nargs='?', required=False) + parser.add_argument("--accessToken", type=str, nargs='?', required=False) + parser.add_argument("--proxy", type=str, nargs='?', required=False) + parser.add_argument("--paid", type=str2bool, nargs='?', required=False) + parser.add_argument("--model", type=str, nargs='?', required=False) + parser.add_argument("--stream", type=str2bool, nargs='?', required=True) + parser.add_argument("--character", type=str, nargs='?', required=True) + parser.add_argument("--ip", type=str, nargs='?', required=False) + parser.add_argument("--brainwash", type=str2bool, nargs='?', required=False) + return parser.parse_args() + + +class Server(): + def __init__(self, args): + # SERVER STUFF + self.addr = None + self.conn = None + logging.info('Initializing Server...') + self.host = "0.0.0.0"# 所有地址上面监听 + self.port = 38438 + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) + self.s.bind((self.host, self.port)) + self.tmp_recv_file = 'tmp/server_received.wav' + self.tmp_proc_file = 'tmp/server_processed.wav' + + ## hard coded character map + self.char_name = { + 'paimon': ['TTS/models/paimon6k.json', 'TTS/models/paimon6k_390k.pth', 'character_paimon', 1], + 'yunfei': ['TTS/models/yunfeimix2.json', 'TTS/models/yunfeimix2_53k.pth', 'character_yunfei', 1.1], + 'catmaid': ['TTS/models/catmix.json', 'TTS/models/catmix_107k.pth', 'character_catmaid', 1.2] + + } + + # PARAFORMER + self.paraformer = ASRService.ASRService('./ASR/resources/config.yaml') + + # CHAT GPT + self.chat_gpt = GPTService.GPTService(args) + + # TTS + self.tts = TTService.TTService(*self.char_name[args.character]) + + # Sentiment Engine + self.sentiment = SentimentEngine.SentimentEngine('SentimentEngine/models/paimon_sentiment.onnx') + + def listen(self): + # MAIN SERVER LOOP + while True: + self.s.listen() + logging.info(f"Server is listening on {self.host}:{self.port}...") + self.conn, self.addr = self.s.accept() + logging.info(f"Connected by {self.addr}") + self.conn.sendall(b'%s' % self.char_name[args.character][2].encode()) + while True: + try: + file = self.__receive_file() + # print('file received: %s' % file) + with open(self.tmp_recv_file, 'wb') as f: + f.write(file) + logging.info('WAV file received and saved.') + ask_text = self.process_voice() + if args.stream: + for sentence in self.chat_gpt.ask_stream(ask_text): + self.send_voice(sentence) + self.notice_stream_end() + logging.info('Stream finished.') + else: + resp_text = self.chat_gpt.ask(ask_text) + self.send_voice(resp_text) + self.notice_stream_end() + except revChatGPT.typings.APIConnectionError as e: + logging.error(e.__str__()) + logging.info('API rate limit exceeded, sending: %s' % GPT.tune.exceed_reply) + self.send_voice(GPT.tune.exceed_reply, 2) + self.notice_stream_end() + except revChatGPT.typings.Error as e: + logging.error(e.__str__()) + logging.info('Something wrong with OPENAI, sending: %s' % GPT.tune.error_reply) + self.send_voice(GPT.tune.error_reply, 1) + self.notice_stream_end() + except requests.exceptions.RequestException as e: + logging.error(e.__str__()) + logging.info('Something wrong with internet, sending: %s' % GPT.tune.error_reply) + self.send_voice(GPT.tune.error_reply, 1) + self.notice_stream_end() + except Exception as e: + logging.error(e.__str__()) + logging.error(traceback.format_exc()) + break + + def notice_stream_end(self): + time.sleep(0.5) + self.conn.sendall(b'stream_finished') + + def send_voice(self, resp_text, senti_or = None): + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + with open(self.tmp_proc_file, 'rb') as f: + senddata = f.read() + if senti_or: + senti = senti_or + else: + senti = self.sentiment.infer(resp_text) + senddata += b'?!' + senddata += b'%i' % senti + self.conn.sendall(senddata) + time.sleep(0.5) + logging.info('WAV SENT, size %i' % len(senddata)) + + def __receive_file(self): + file_data = b'' + while True: + data = self.conn.recv(1024) + # print(data) + self.conn.send(b'sb') + if data[-2:] == b'?!': + file_data += data[0:-2] + break + if not data: + # logging.info('Waiting for WAV...') + continue + file_data += data + + return file_data + + def fill_size_wav(self): + with open(self.tmp_recv_file, "r+b") as f: + # Get the size of the file + size = os.path.getsize(self.tmp_recv_file) - 8 + # Write the size of the file to the first 4 bytes + f.seek(4) + f.write(size.to_bytes(4, byteorder='little')) + f.seek(40) + f.write((size - 28).to_bytes(4, byteorder='little')) + f.flush() + + def process_voice(self): + # stereo to mono + self.fill_size_wav() + y, sr = librosa.load(self.tmp_recv_file, sr=None, mono=False) + y_mono = librosa.to_mono(y) + y_mono = librosa.resample(y_mono, orig_sr=sr, target_sr=16000) + soundfile.write(self.tmp_recv_file, y_mono, 16000) + text = self.paraformer.infer(self.tmp_recv_file) + + return text + + +if __name__ == '__main__': + try: + args = parse_args() + s = Server(args) + s.listen() + except Exception as e: + logging.error(e.__str__()) + logging.error(traceback.format_exc()) + raise e diff --git a/.history/SocketServer_20231106145512.py b/.history/SocketServer_20231106145512.py new file mode 100644 index 0000000..b27929f --- /dev/null +++ b/.history/SocketServer_20231106145512.py @@ -0,0 +1,203 @@ +import argparse +import os +import socket +import time +import logging +import traceback +from logging.handlers import TimedRotatingFileHandler + +import librosa +import requests +import revChatGPT +import soundfile + +import GPT.tune +from utils.FlushingFileHandler import FlushingFileHandler +from ASR import ASRService +from GPT import GPTService +from TTS import TTService +from SentimentEngine import SentimentEngine + +console_logger = logging.getLogger() +console_logger.setLevel(logging.INFO) +FORMAT = '%(asctime)s %(levelname)s %(message)s' +console_handler = console_logger.handlers[0] +console_handler.setFormatter(logging.Formatter(FORMAT)) +console_logger.setLevel(logging.INFO) +file_handler = FlushingFileHandler("log.log", formatter=logging.Formatter(FORMAT)) +file_handler.setFormatter(logging.Formatter(FORMAT)) +file_handler.setLevel(logging.INFO) +console_logger.addHandler(file_handler) +console_logger.addHandler(console_handler) + + +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Unsupported value encountered.') + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--chatVer", type=int, nargs='?', required=True) + parser.add_argument("--APIKey", type=str, nargs='?', required=False) + parser.add_argument("--email", type=str, nargs='?', required=False) + parser.add_argument("--password", type=str, nargs='?', required=False) + parser.add_argument("--accessToken", type=str, nargs='?', required=False) + parser.add_argument("--proxy", type=str, nargs='?', required=False) + parser.add_argument("--paid", type=str2bool, nargs='?', required=False) + parser.add_argument("--model", type=str, nargs='?', required=False) + parser.add_argument("--stream", type=str2bool, nargs='?', required=True) + parser.add_argument("--character", type=str, nargs='?', required=True) + parser.add_argument("--ip", type=str, nargs='?', required=False) + parser.add_argument("--brainwash", type=str2bool, nargs='?', required=False) + return parser.parse_args() + + +class Server(): + def __init__(self, args): + # SERVER STUFF + self.addr = None + self.conn = None + logging.info('Initializing Server...') + self.host = "0.0.0.0"# 所有地址上面监听 + self.port = 38438 + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024000) + self.s.bind((self.host, self.port)) + self.tmp_recv_file = 'tmp/server_received.wav' + self.tmp_proc_file = 'tmp/server_processed.wav' + + ## hard coded character map + self.char_name = { + 'paimon': ['TTS/models/paimon6k.json', 'TTS/models/paimon6k_390k.pth', 'character_paimon', 1], + 'yunfei': ['TTS/models/yunfeimix2.json', 'TTS/models/yunfeimix2_53k.pth', 'character_yunfei', 1.1], + 'catmaid': ['TTS/models/catmix.json', 'TTS/models/catmix_107k.pth', 'character_catmaid', 1.2] + + } + + # PARAFORMER + self.paraformer = ASRService.ASRService('./ASR/resources/config.yaml') + + # CHAT GPT + self.chat_gpt = GPTService.GPTService(args) + + # TTS + self.tts = TTService.TTService(*self.char_name[args.character]) + + # Sentiment Engine + self.sentiment = SentimentEngine.SentimentEngine('SentimentEngine/models/paimon_sentiment.onnx') + + def listen(self): + # MAIN SERVER LOOP + while True: + self.s.listen() + logging.info(f"Server is listening on {self.host}:{self.port}...") + self.conn, self.addr = self.s.accept() + logging.info(f"Connected by {self.addr}") + self.conn.sendall(b'%s' % self.char_name[args.character][2].encode()) + while True: + try: + file = self.__receive_file() + # print('file received: %s' % file) + with open(self.tmp_recv_file, 'wb') as f: + f.write(file) + logging.info('WAV file received and saved.') + ask_text = self.process_voice() + if args.stream: + for sentence in self.chat_gpt.ask_stream(ask_text): + self.send_voice(sentence) + self.notice_stream_end() + logging.info('Stream finished.') + else: + resp_text = self.chat_gpt.ask(ask_text) + self.send_voice(resp_text) + self.notice_stream_end() + except revChatGPT.typings.APIConnectionError as e: + logging.error(e.__str__()) + logging.info('API rate limit exceeded, sending: %s' % GPT.tune.exceed_reply) + self.send_voice(GPT.tune.exceed_reply, 2) + self.notice_stream_end() + except revChatGPT.typings.Error as e: + logging.error(e.__str__()) + logging.info('Something wrong with OPENAI, sending: %s' % GPT.tune.error_reply) + self.send_voice(GPT.tune.error_reply, 1) + self.notice_stream_end() + except requests.exceptions.RequestException as e: + logging.error(e.__str__()) + logging.info('Something wrong with internet, sending: %s' % GPT.tune.error_reply) + self.send_voice(GPT.tune.error_reply, 1) + self.notice_stream_end() + except Exception as e: + logging.error(e.__str__()) + logging.error(traceback.format_exc()) + break + + def notice_stream_end(self): + time.sleep(0.5) + self.conn.sendall(b'stream_finished') + + def send_voice(self, resp_text, senti_or = None): + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + with open(self.tmp_proc_file, 'rb') as f: + senddata = f.read() + if senti_or: + senti = senti_or + else: + senti = self.sentiment.infer(resp_text) + senddata += b'?!' + senddata += b'%i' % senti + self.conn.sendall(senddata) + time.sleep(0.5) + logging.info('WAV SENT, size %i' % len(senddata)) + + def __receive_file(self): + file_data = b'' + while True: + data = self.conn.recv(1024) + # print(data) + self.conn.send(b'sb') + if data[-2:] == b'?!': + file_data += data[0:-2] + break + if not data: + # logging.info('Waiting for WAV...') + continue + file_data += data + + return file_data + + def fill_size_wav(self): + with open(self.tmp_recv_file, "r+b") as f: + # Get the size of the file + size = os.path.getsize(self.tmp_recv_file) - 8 + # Write the size of the file to the first 4 bytes + f.seek(4) + f.write(size.to_bytes(4, byteorder='little')) + f.seek(40) + f.write((size - 28).to_bytes(4, byteorder='little')) + f.flush() + + def process_voice(self): + # stereo to mono + self.fill_size_wav() + y, sr = librosa.load(self.tmp_recv_file, sr=None, mono=False) + y_mono = librosa.to_mono(y) + y_mono = librosa.resample(y_mono, orig_sr=sr, target_sr=16000) + soundfile.write(self.tmp_recv_file, y_mono, 16000) + text = self.paraformer.infer(self.tmp_recv_file) + + return text + + +if __name__ == '__main__': + try: + args = parse_args() + s = Server(args) + s.listen() + except Exception as e: + logging.error(e.__str__()) + logging.error(traceback.format_exc()) + raise e diff --git a/.history/TTS/TTService_20231106140934.py b/.history/TTS/TTService_20231106140934.py new file mode 100644 index 0000000..18e6de0 --- /dev/null +++ b/.history/TTS/TTService_20231106140934.py @@ -0,0 +1,62 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).cuda() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + + + + diff --git a/.history/TTS/TTService_20231106142808.py b/.history/TTS/TTService_20231106142808.py new file mode 100644 index 0000000..2bc92ff --- /dev/null +++ b/.history/TTS/TTService_20231106142808.py @@ -0,0 +1,62 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).cpu() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + + + + diff --git a/.history/TTS/TTService_20231106143302.py b/.history/TTS/TTService_20231106143302.py new file mode 100644 index 0000000..98a0f47 --- /dev/null +++ b/.history/TTS/TTService_20231106143302.py @@ -0,0 +1,62 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +device = torch.device("mps") + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).to(device) + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + + + + diff --git a/.history/TTS/TTService_20231106145859.py b/.history/TTS/TTService_20231106145859.py new file mode 100644 index 0000000..13a90db --- /dev/null +++ b/.history/TTS/TTService_20231106145859.py @@ -0,0 +1,62 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +device = torch.device("mps") + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).to(device) + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.to(device).unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + + + + diff --git a/.history/TTS/TTService_20231106150025.py b/.history/TTS/TTService_20231106150025.py new file mode 100644 index 0000000..72b224e --- /dev/null +++ b/.history/TTS/TTService_20231106150025.py @@ -0,0 +1,62 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +device = torch.device("mps") + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).to(device) + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.to(device).unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).to(device) + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) + + + + diff --git a/.history/TTS/TTService_20231106164111.py b/.history/TTS/TTService_20231106164111.py new file mode 100644 index 0000000..752fd4a --- /dev/null +++ b/.history/TTS/TTService_20231106164111.py @@ -0,0 +1,58 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).cpu() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cuda().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) \ No newline at end of file diff --git a/.history/TTS/TTService_20231106164221.py b/.history/TTS/TTService_20231106164221.py new file mode 100644 index 0000000..8564e6d --- /dev/null +++ b/.history/TTS/TTService_20231106164221.py @@ -0,0 +1,58 @@ +import sys +import time + +sys.path.append('TTS/vits') + +import soundfile +import os +os.environ["PYTORCH_JIT"] = "0" +import torch + +import TTS.vits.commons as commons +import TTS.vits.utils as utils + +from TTS.vits.models import SynthesizerTrn +from TTS.vits.text.symbols import symbols +from TTS.vits.text import text_to_sequence + +import logging +logging.getLogger().setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) + + +def get_text(text, hps): + text_norm = text_to_sequence(text, hps.data.text_cleaners) + if hps.data.add_blank: + text_norm = commons.intersperse(text_norm, 0) + text_norm = torch.LongTensor(text_norm) + return text_norm + + +class TTService(): + def __init__(self, cfg, model, char, speed): + logging.info('Initializing TTS Service for %s...' % char) + self.hps = utils.get_hparams_from_file(cfg) + self.speed = speed + self.net_g = SynthesizerTrn( + len(symbols), + self.hps.data.filter_length // 2 + 1, + self.hps.train.segment_size // self.hps.data.hop_length, + **self.hps.model).cpu() + _ = self.net_g.eval() + _ = utils.load_checkpoint(model, self.net_g, None) + + def read(self, text): + text = text.replace('~', '!') + stn_tst = get_text(text, self.hps) + with torch.no_grad(): + x_tst = stn_tst.cpu().unsqueeze(0) + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cpu() + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + 0, 0].data.cpu().float().numpy() + return audio + + def read_save(self, text, filename, sr): + stime = time.time() + au = self.read(text) + soundfile.write(filename, au, sr) + logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) \ No newline at end of file diff --git a/ASR/__pycache__/ASRService.cpython-311.pyc b/ASR/__pycache__/ASRService.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..163fbea938555e84444583e52f31eb064506e4dd GIT binary patch literal 1599 zcma(RO=}xRboNVH>(ffCVks@w!8RzSE5#0WT1ud$tzFuiW#_Rvcqxl2U{u@DIK)SHTW%BkC!!K&#vjdoR23|q`q?wq+kxE{JK9UQ~%k_h%))7@|1J{bOdSOB9#O0cDqiT0PJSSm(FvS3W5lwxO9u z-6$7R;7e-gjG`#uo!_h!i@Bhfntj*8FjA?P zH#2({Wme|MzMI)J?5)}tnGcPkVQZ%PnNgrB8lp_i*DSkI%7AH{BkR>8S5{R6oKw~M zrL?_+Jw;uNpc~802V?q32p*q_1TGp96w|%+5WU`7Zb<*p#}l z`02v;3up7~*ws$#YST9?*7|SD&laDi|5$mt(z?CZ{$Q{5&VD<--SqkoY0?<>X|L<}|Se+r3~kmz1|+xhfGWWIU$_)0sn)QK!Pn>` literal 0 HcmV?d00001 diff --git a/ASR/rapid_paraformer/__pycache__/__init__.cpython-311.pyc b/ASR/rapid_paraformer/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245477d1dc963a444ff303dc6ff2479ca1ba9fa2 GIT binary patch literal 258 zcmZ3^%ge<81pK8QsTDx_F^B^LOi;#WAs}NqLkdF*V-7Px# literal 0 HcmV?d00001 diff --git a/ASR/rapid_paraformer/__pycache__/rapid_paraformer.cpython-311.pyc b/ASR/rapid_paraformer/__pycache__/rapid_paraformer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abeeb641f8d029c313879e0cd4d14e351daec6ff GIT binary patch literal 9754 zcmcIqYit|GcHZT3`4XQJB~dSnwq;3_9a(bIec4#uhYUWp?^2HFR zna{-~S>xYK#nUN`e`9_wA%2Hr4B0f-OBbW$jr1ik6<-vI=9pNROUoBUDK2T=S0*Rl zdVM}6$CKhXA!(v{ULo?CR7@o2MM=WCytL$*lP{%Hmqj8&1uZ|1UOq+ADOpSjnqx+k zBZ>6P3}o1e7!@K5(PUz}I$!v-t-n0}SE?Q&6J`Y_Y!Xq#w0W-Tr33~(tYdP~8x+!_6ilV%pm-IqWt5-@ zL1WbH)5*)JNGzTZ3C@M)imk&z1i!w<|12$t3C%GTm8UO8BtV^C17s2W=$eIACTYG? zPgpGwcC1PVRGgY{!0P=6I{*4vY-=%u%3tF}jQaGE_$lrX&(+_kw(J_vyGiF+a8YWPBzrM-!2A@t7DnFA~7H$n?AybDE50GsHh^ z8K?oVZ^Mskx+pS7-a_U2zJxQg=1hf3#Bwex6&aoM-gAbWbPqbvVRvGd;k-yBs!CzOtt z)Q*?3ryuoif7n0vpnvRM-|Ch7S5`k%_q?L?zpD1XsyKVIv&D6sEsyT~o7umf zU2VT_S4PjOqh}TG&YZo}v$Nu0y86Cs`MjlYrnLL05;&#?j^+3q|KtZd;~%InCRa~A zSo3z?@_gng1&=D;W2*O9$$P9E=tl7zU*SRY$&)7)C*$&eGWqdj{#nJjRdsGH(Yx&F z$hsv|-hVvUbz<1`Ps4*R`S^eKvJe^&1#J>7`*AnS+D9f>eXugTRxiOMqbjanv$Z%- zHSU`EW0R2=Y%XiGG{R-r8Q|beC96%qvq|1*Vy>H-5p9ziYBYC44eqQd#sVp}W!RHV z><9YMV4DI@`H$rb&S;sxU_;hP&5WFkpck5MnE04LaEoc=W3x5646NW*SmVej zO0j^=H7SOv&u|9WjA?~4V(${0fsxdi2cQLy%NUbH;>$0B?>1@HGy(o7!E!>55?ozK zBxIT#1+Q*R#HUDFifU%W4b28N7)`=LC&ZB#pzoTkYUSi8yjDH_y75t{0fEJx&HlLt zLZe3#X|O}-#nGzpA*|;J1mLoJw%tBbG~e@=dJZT(2h^Se*Ux1qa#L%aThz{>qHT5C z@Ay*Zq|!O5c1~s|%56RQGiuvl$vH>{pn}b(d=PT}l)VLzn_(`vme|cyEzAHS|T0LqVtW5Vo+X~14NGn7q=nABUy~6g6~K&*%eI9ji!VsA<>0hLG06o zkVWGlM>D17H0yen=7>x2lq5&NGr(s>aJIhzby7wM-!%yRp%C6U)MIq0WC-#WyPi76 z=OA19I|yJr6*Ffa`eGjtAN$ZR_uhG)Mw)^j9E`IgcL}qVmQl536xrC;vcEs~LdhBY zwxu2N_9-nxYReGj>@53xVP@V@{2|pJDz%N2oFlr>ex+qtZ5c+PBjxHu!sHb{fIw+G ztU{Xe@VD;Hvh!>nqG$E{dye&-V}H+Jh-J^Qbe_o`7=i)vkVH_((-%-P=&-pZfEXY) zu_ZGQ84%E~%@~Or|!gxZ!3e(se{ic-h-<5V3uF=cif!FzpeO( zRR7RJ|L6n%=+|WBs^UMW`VVI9Wsg4>FM0Y)wtn4oaIQ2b%qyK|oRrNC=>f=n#D2sz zvxmC>10KOkas6VIdKV+g08fZ3H3?j(O;Oafqcm(M4yeNU7uK!>UAv5hUc@Miy4dhB( z0Mhb@@GfB^pwGIa(`;4q+33)#Ia1xBSChh6(HI2a6w2K_`FD$_mA-wYuKo97rN9f> zGiz<_HxJ|o3ijgj_untIol)AriJvJs&rpRjIB^6JI(I-@>Q20?>clf_9ZUtL&UlQV z1kSx1=8V;+jMaGQVss7(%>-1c&qWMk1|Lt(K*~nvUL9h?sO!$1P9R!8b?zriZFt`k zbmv~!f9LsP^v(;4e~;?lqvt_Lha9rduS3p3S&aiYB0q;1c?(~yG2lsvPi7sJun|qi zAE0K0cAS2+_k!y#`%RG8=(1})$6BRp5Imti+hjk>ezEs9cx#OPEvG;K-t-OZU|`Ds z651I5I9nUdst8e~?WEdvGHYA&w%)Ym1B!Q>>fQFx8+zakeZ6gEMDaeWdY=Wj^Z2t) z9YPRkr)wq(FE}9Teetv3!bLqiH(p48XPTDQ)X#F@p}CA1y##p;%E7nq#|N)td>!5o zLaOG_7nit9mC)EJp6m2y7rZXEH)AbB zNsPdJ(&?6{dR8$-H>{E7Db?$%V@chrE<)wfaR^Xd8PZ$kLetMmHz7I8Np2l4cm^g!S;5VeoVFR}U*1#4Z zVdDjkqRAG3E3uoi(@kUzn|t+by^NX4Ld*37KjTK=EPh{l3ET{93U0oIcNZkST9<>l zg_vNTVd*9yIK28%;S$%l^^aD(!W)%-i5FPl(R`g<3Y>9s@Tc@($=Y~mAfuC6zwn4N z({#kyDI0f9tQ`0|GmCpx^eQwQZ&cHO`8Vg{Y4Ba~U z-G9S{$CFVwJ0R#Pzk|<&%X{;JB)$)R4!6(@aDe&LpJMM3SOxYno^_fgt5o7DWavv^ zR%5S9NJey<_|bMG5lv1B(H9qYZEhHd28|Z1OJ|@437cDHid*j;DDGZnbVGCl11B>; z9LXPGn>s&{05s6~X%;z+D^-F7n=D{3Nt59~1kOiEFTOb9g0z={jYRq|p+$e$D+Akx zwLuWl2-+7xLZ{b)8mDm=7v^BK01JS~TpD&Bb-)70tMN3dnXv}iYw8RdJi;85U+jMR z1YClA>AxVL+}<1b%+K!79LF+fG2 zREQw3ki!@ZVSqSDS67-7c&;3uPKxryv_RsRj;x2EyC#U;1V59$oil*3Z5a5f0d9Fp z{{pJLT>Gn-T>QbpcyW7CE{4Zgz9U`rd{Nkz%Z;_CkU+&70xBPZ2?@d^VO zzk>~0cr*tiKK>kA?jI%KO}w<@sM>$5!qKepGkT=L;Hx1Vbn?OSz;Lm3 zr5k(3!Rw>${(|X_qj+NFY$G*S<~=b*&3cWIeQE64B1Q)UQ}a#zpoZaBe$*zhyOsg>E)ZQqQPMo+54;NBn= z_IV6}!^EFvv5UYTA-0OV5}x}Tt71(#s8dGbdT+S?qFnWY;4bSqp)2W z|4-1q&{n_!I0q4@qSKc&EAHdsRw(KvfYHJn9DC>rNp+U$;t9;-!ClWS=fNwc-#y9wqm~%mqpD2C!%n^r?t$H^sESH zG(w!fLNB&{_V1`4n9_||{kS-Um9cUB&j4vY0hl&Na7}^BBYl?88UW69n|zV{CA=ce zOF0OEtgvjw#<0E;#_GJpGX7YR$fx+kgF?8}Fc| vchDfqmVG_B?)-$}+oAe)WG!WzE6ZnN*IhSUS@^5?7;`r?UvXAT&@c8sja`Hv literal 0 HcmV?d00001 diff --git a/ASR/rapid_paraformer/__pycache__/utils.cpython-311.pyc b/ASR/rapid_paraformer/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b1e21d009e24d64c9000a09921d80ddd4cf9640 GIT binary patch literal 24654 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 BPlx~j literal 0 HcmV?d00001 diff --git a/ASR/rapid_paraformer/kaldifeat/__pycache__/__init__.cpython-311.pyc b/ASR/rapid_paraformer/kaldifeat/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8acc02cf6a40d5ec0eaa8b1e1e4c8bf51f6a415 GIT binary patch literal 390 zcmZ`#%}T^D5Kj8DE9xTX3wRQGF%O^!g5VxR#3Dj3A={*D*rW~9q|kTp?jwkAvq$Mk z@Z?R{+n!9o-gFqg`R3zehMCvdY!~@BaC7nO>t|@jhYLha^DiVVKHJl(qqw`0fpDJfiI*d1wW+q_A zmMMB8D?xJsod8<8);5}4=Jy1ck(?R^tZG0DASL> bzb9PUo_Y9=F~%S0ZvB70qvQ2o3E}-e#0_&u literal 0 HcmV?d00001 diff --git a/ASR/rapid_paraformer/kaldifeat/__pycache__/feature.cpython-311.pyc b/ASR/rapid_paraformer/kaldifeat/__pycache__/feature.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f04dc82f2a8816ab45edd3375ffcbce83a400c4c GIT binary patch literal 22526 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 T&#_w9z;BuBsI?6MLzw>!N?GfS literal 0 HcmV?d00001 diff --git a/ASR/rapid_paraformer/kaldifeat/__pycache__/ivector.cpython-311.pyc b/ASR/rapid_paraformer/kaldifeat/__pycache__/ivector.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88b00f0f065c5a1c70afa9be0835cdb69726a5f9 GIT binary patch literal 2785 zcma)8O>7fK6rS~O;A&~=zoM>8*%B2#=9y#ttK3FS7LZTAlMn$=BY2WPHP8O)t(fIkzn>X)$ z?`LQC=Ts_zVDwba(4V>xdd3&+5o$57_5pJj5kv$PT^2})gw;?vd^s#25+||mh075l zTtwNf7yQ8V3jt_WaMOmW5Jf9W3yMbch39+|p{FOGf9j2AC-YHXr!ti_bC%C`@}V1{>z-W}gVP>oL^MG_ zo&|KR9W<&%t&k;HXoaJCXWR$LgN}3wye_2>s)a1>Gr~7+3oI6lB8a^f1Klt`NrWZP zuf@&ojzM&-lbe7v*4D7XR`g-yKA?TjL2RM_uUibig{I5wY1>A~>ayZQxDSy(=tN)Z z4p`^)@`lxIwIU|M!)OpuEfF}=iO-6?2YsC9q9z7Tc+JV(K(4$jnLB*1o-A&~g8qCR z&vp=d(n?w)@iPubMQGex;p4ysyoqhwEnUy!tx$hkjI3laL_%*z8Pw)ht%M~mfi)}Q z_hT)k#Vpj$Q!Qns_~Rn)0FZdHQc)N2ysqRamh+}Eub7LNP?G|$Yl#GgFKERn^23`0&Wl?0Zmmj*R0kbj>hj4G>aR#){U8brZ^h&hXsiDLg2v282Xu zOJ!5+S^Tc+pyL9hmKsuC*GziD9LLku@>R-sg#HfaTANr05OThR4TVroPBoK3;yle^ zj?usDFh{mfQb4tpFvxsa*A!D{l;A-{3+5t_i3-yzI^)%sHf7@iZvkiv=7C|ls>0ps z6=6ev6X*p63a)wkEl6fbHnB#*Jruqq&r<-z+8F~yC@?Q+$K`txcX(v1g_KdV%CvDj ziRYnFAy`P#Rb5wkn|O|7F#R>FQmhnsGhM5aqTfkgs{DQ@UgvxT#e-ymZ?>Qq)Nf_R z?;Xakwileh>m*9d#R>%`BHvJq=@=xka;-JFS>!s#kNTl%itFs&q~%Q0XFN^OQ;Xs$uHo z+~mdC9Fr>w0W3_0jxJM{yDqB)RAn=#_>~{2Eb>g3D^-(9;Flc$zx?fBxbU97iC$+= zvZub(==sPIaYMu_lWXFD-JVTx_lmG4?zP*qDfTbVtciQ<_H2qtyJx>G9)!8((G}VM z_hmk9CVLyn-8a8%MlyC^c6I8v^S_>Vh9?@s6HecR6Pd6hnPzWOCWft7EZ-oe#Tr+2t6uJ`Y{w`V<>{^88+E2~HCL}`+Q3=+!i=4nbuzP! z%xt|IHt(EXo?4}L=7^Iy(#RZn^sSTm95(uP-s@f&c{J+mJMw$}@z5Vj&e&{YY}URs z=ZwwSSMqirar#K3kJMAm-0^z1y>;mJl@;09e$d`FxVjaVPS@~ycIaX6qkj9?^yBF# zGtTj8;2NXn?U^g~VaYBO?QF@(mKxa-KR*Hp6$8y$5@3#*gTT36S zhwI^|={|ec&{}$^9&U>1n^Ui##3&nK{6obj{6S^>3nd$MqtK?6MaI7=+&FKSDx==R z=e5T#hz)S%{XpJy9WU#os?rlI3rqfOXG{Wl85RVgiMHD9`4sK9gY#u#uh8=n{Ri<} F{0lQF1UUcz literal 0 HcmV?d00001 diff --git a/GPT/GPTService-openai.py b/GPT/GPTService-openai.py new file mode 100644 index 0000000..967f804 --- /dev/null +++ b/GPT/GPTService-openai.py @@ -0,0 +1,97 @@ +import logging +import os +import time + +import GPT.machine_id +import GPT.tune as tune + + +class GPTService(): + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + + self.tune = tune.get_tune(args.character, args.model) + + self.counter = 0 + + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + os.environ['API_URL'] = "https://api.geekerwan.net/chatgpt2" + api_key = mach_id + + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune) + logging.info('API Chatbot initialized.') + + def ask(self, text): + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + + logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() diff --git a/GPT/GPTService.py b/GPT/GPTService.py index 967f804..a9dc188 100644 --- a/GPT/GPTService.py +++ b/GPT/GPTService.py @@ -1,20 +1,28 @@ import logging import os import time - import GPT.machine_id import GPT.tune as tune - +import requests +import re class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) + def __init__(self, args): logging.info('Initializing ChatGPT Service...') self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash if self.chatVer == 1: @@ -23,7 +31,6 @@ def __init__(self, args): if args.accessToken: logging.info('Try to login with access token.') config['access_token'] = args.accessToken - else: logging.info('Try to login with email and password.') config['email'] = args.email @@ -36,7 +43,6 @@ def __init__(self, args): self.chatbot = Chatbot(config=config) logging.info('WEB Chatbot initialized.') - elif self.chatVer == 3: mach_id = GPT.machine_id.get_machine_unique_identifier() from revChatGPT.V3 import Chatbot @@ -44,26 +50,30 @@ def __init__(self, args): logging.info('you have your own api key. Great.') api_key = args.APIKey else: - logging.info('using custom API proxy, with rate limit.') - os.environ['API_URL'] = "https://api.geekerwan.net/chatgpt2" + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" api_key = mach_id - - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune) + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) logging.info('API Chatbot initialized.') def ask(self, text): + print("--->ask text:" + text) stime = time.time() if self.chatVer == 3: prev_text = self.chatbot.ask(text) - # V1 elif self.chatVer == 1: for data in self.chatbot.ask( self.tune + '\n' + text ): prev_text = data["message"] - - logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) return prev_text def ask_stream(self, text): @@ -81,7 +91,6 @@ def ask_stream(self, text): self.counter += 1 for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: complete_text += message logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) @@ -94,4 +103,4 @@ def ask_stream(self, text): if complete_text.strip(): logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() + yield complete_text.strip() \ No newline at end of file diff --git a/GPT/__pycache__/GPTService.cpython-311.pyc b/GPT/__pycache__/GPTService.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e71328d09bf4e065abedfa14cc7a28584b33b62f GIT binary patch literal 6431 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 O)#xk@QiN@CLH+~R48b4( literal 0 HcmV?d00001 diff --git a/GPT/__pycache__/tune.cpython-311.pyc b/GPT/__pycache__/tune.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..892a5d148c37d057acae3377efce3d2c60f7d30d GIT binary patch literal 1151 zcmd5*OG_J36uy&8%ot-w8r?|=r7p72Ks6wx6iO>vu_D-_xCt?H6H{Um?o32ODnqqC zTA!sSYvAoQbVouFPI`!23(nm$*KW&u6pi7L-*bET<*E|`#9(O4)chWmYNU* zA8x{1I)siWI1j*DoK(UwhXf=re$<5o-7xB61bvrIV7v4J(~fM0EG=wxpLbAXfUSpp za+%S(nJCkT$gL>!M}U5)lYl>u2Zg(!kLn^t2(1DWFR%=fsNPu!EY!eVFbG8(##L~M zQztDJ3%7HIo~y9q1)?1ZTw$8x|6m#f&(PEw(bv{EB1N^18mV83Ty*!iq{g;;)({Ey zhNNrODluXPY|mrSt}rBG2uq&odK;r~IN%NnzJOO@>LP|Zs$gRkqd(~NQj+xrJVAvG zhHyY(33drKy;2MY#O0PSQ4GC70s9rs}4)9Ive0M~>D6wZq!Ck2EDEvhHRAj#;!Xr3|1 zgYw{krEquIz{F_|Ph`4e&dIF=Oums7J+Fi`feL7wk zR+rb+<%QI@k>B4Z(qpr!oedzd0jJ&5Ak`JCYxn!rf=a#~;VFwx@Z^%#XL} zsg+b>GL?9uF2^#%vtR}d)O&stc*w`Qv+394FmZNizTgCWW@}ZQ-d5kov(H~@Bfc}) zSYiYt?FA`j-0#L%a1tEy4=5#=kRZu}4~Ue}vI~$-x$E$$g#GviDF;aZPw^_GoStEr g19U;wR*vPEyG#!Kl`rYaSlOK8bUZ7U(4}eq0oj&tzyJUM literal 0 HcmV?d00001 diff --git a/SentimentEngine/__pycache__/SentimentEngine.cpython-311.pyc b/SentimentEngine/__pycache__/SentimentEngine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee8a37bf13e5d6a271218089087ec3ce4d2e64e1 GIT binary patch literal 2589 zcmbtVO>7%Q6rTO@X6?jw-6pA>K$@magQ1O~N}JFI2rX69vl9?D9DgBud26#5c#<>xW zDUI{e^Zug=a+tN!@e^CxETSV~tC>RFPQR%A>7NOy9hucZT{fa!tJsD=-WT?9BZ z92TvbSYiUOnXq_89Zy)b300jTDH}Fx+bMM%6ReKmA*^X&7sN!Dv=T$8=azq*B;rz% zV4Xz4rfj)&=hVWS#cMb=Zh7Jf8ONk#RKIBX=>pQ`fJUvfwzfWgJ#t>dM2pPo7b7PX zy+1V?c}fSf$Wqf&yx3!kJ%-p*Xxf|g-*4V$Hg~W3jp0dSXv%1g<(p$>b1ci7V(@-w zpBXxAbPwc1r_IpmEWhB(!m|$MP(`HCleQ!6DTu#CltDSF@^)jKhTE5ti?xX6wMN+Fiy%! zTzfIeYw=G6BeKv{7PRh6xRX^NCytL0jk+3*Cle9Q3 z6}N;anTSVc2+b%$oekHJZB&of@r-T>c2UqQPstBi8PiEK6?>sPjYdb67?d{*enKIk zLM&_a{Gcw-MktbWb=X?Ep*orE;Q(l8e*>9Eg+Rk%%ZDvFer5PdOFnSK3>?V{cSE~! zwPt94p=Gbpe#mS&Ty$}bo+1L0^%Om5&w$!3? zFYYRIykHzWW_BFE-7&D%G4R{LUwiT$!)C{D)?@70lNa~Gnr2}4?LhllpglK}n_PJ| zA9%?OytEoM1ASTHPOxc7xH^5!x8(b3`*P#A>@8ts`WxRZ-%sa^b8i~q3;FN`6KL>4 z)_bSE@#9lh<14$3`mTI^ms#Jn@`hR8opoOTMl7!TQE_n{f7s#GxBTQ&=+Jr{Ab_mFP`6;r3 z>kLywTj(~gD^x^Jl9EMgjP4~4*McOaT7bQ``rgBvtM`7$J^b<7gWPuyzrOV#`@tXI zFFd&X5e%l=t4=nOj4E*mbIrNMJL%mK_LhQ--lbL@+&Zc@o*;3!I!YIkOHIX-vv$Ci z9NJG68Qo$u+hdC%mMcjhlt~06o9;grdrN4&Ou9ip(?t6cNReY0rht6&_H!3)H=MVC z_8FCL!4ZK@QD|fUpC`$mbnLH9!Sjf(%cj@3kimrt;xqHF7Q~%dzY%;TFZP*YALZTe k*SuSEg}Llm@BquZ=TBsJztexIf8KtIZp1giWZRd20how!xBvhE literal 0 HcmV?d00001 diff --git a/SentimentEngine/__pycache__/__init__.cpython-311.pyc b/SentimentEngine/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e9aabe9b79db0d34558188b8446bdf33e24df3e GIT binary patch literal 181 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 + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) +OSError: [Errno 55] No buffer space available + +2023-11-06 14:37:52,403 INFO Initializing Server... +2023-11-06 14:37:52,403 ERROR [Errno 55] No buffer space available +2023-11-06 14:37:52,403 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) +OSError: [Errno 55] No buffer space available + +2023-11-06 14:40:17,051 INFO Initializing Server... +2023-11-06 14:40:17,052 ERROR [Errno 55] No buffer space available +2023-11-06 14:40:17,054 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) +OSError: [Errno 55] No buffer space available + +2023-11-06 14:55:18,836 INFO Initializing Server... +2023-11-06 14:55:18,837 INFO Initializing ASR Service... +2023-11-06 14:55:20,331 INFO Initializing ChatGPT Service... +2023-11-06 14:55:20,332 INFO chatGPT prompt: paimon35.txt +2023-11-06 14:55:20,387 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 14:55:21,681 INFO you have your own api key. Great. +2023-11-06 14:55:25,676 INFO API Chatbot initialized. +2023-11-06 14:55:25,677 INFO Initializing TTS Service for character_paimon... +2023-11-06 14:55:26,687 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 14:55:26,696 INFO Initializing Sentiment Engine... +2023-11-06 14:55:30,988 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 14:56:43,022 INFO Connected by ('100.101.36.70', 39578) +2023-11-06 14:56:47,253 INFO WAV file received and saved. +2023-11-06 14:57:07,580 INFO ASR Result: ['你好啊']. time used 0.24. +2023-11-06 14:57:10,551 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情要找我吗?还是你肚子饿了,想找我一起吃点好吃的?, time used 2.97 +2023-11-06 14:57:10,924 ERROR Torch not compiled with CUDA enabled +2023-11-06 14:57:10,925 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read + x_tst = stn_tst.cuda().unsqueeze(0) + ^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init + raise AssertionError("Torch not compiled with CUDA enabled") +AssertionError: Torch not compiled with CUDA enabled + +2023-11-06 14:57:10,925 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 14:59:19,918 INFO Initializing Server... +2023-11-06 14:59:19,918 INFO Initializing ASR Service... +2023-11-06 14:59:21,260 INFO Initializing ChatGPT Service... +2023-11-06 14:59:21,261 INFO chatGPT prompt: paimon35.txt +2023-11-06 14:59:21,313 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 14:59:21,545 INFO you have your own api key. Great. +2023-11-06 14:59:21,731 INFO API Chatbot initialized. +2023-11-06 14:59:21,731 INFO Initializing TTS Service for character_paimon... +2023-11-06 14:59:22,707 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 14:59:22,714 INFO Initializing Sentiment Engine... +2023-11-06 14:59:23,748 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 14:59:28,203 INFO Connected by ('100.101.36.70', 41902) +2023-11-06 14:59:34,064 INFO WAV file received and saved. +2023-11-06 14:59:35,940 INFO ASR Result: ['你好啊']. time used 0.26. +2023-11-06 14:59:37,973 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?还是你肚子饿了,需要找点好吃的?, time used 2.03 +2023-11-06 14:59:38,319 ERROR Torch not compiled with CUDA enabled +2023-11-06 14:59:38,319 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 49, in read + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init + raise AssertionError("Torch not compiled with CUDA enabled") +AssertionError: Torch not compiled with CUDA enabled + +2023-11-06 14:59:38,320 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 15:00:31,669 INFO Initializing Server... +2023-11-06 15:00:31,669 ERROR [Errno 48] Address already in use +2023-11-06 15:00:31,669 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:38,114 INFO Initializing Server... +2023-11-06 15:00:38,114 ERROR [Errno 48] Address already in use +2023-11-06 15:00:38,115 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:41,010 INFO Initializing Server... +2023-11-06 15:00:41,010 ERROR [Errno 48] Address already in use +2023-11-06 15:00:41,010 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:51,700 INFO Initializing Server... +2023-11-06 15:00:51,700 ERROR [Errno 48] Address already in use +2023-11-06 15:00:51,700 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:54,840 INFO Initializing Server... +2023-11-06 15:00:54,840 ERROR [Errno 48] Address already in use +2023-11-06 15:00:54,841 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:57,587 INFO Initializing Server... +2023-11-06 15:00:57,587 ERROR [Errno 48] Address already in use +2023-11-06 15:00:57,587 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:01:00,667 INFO Initializing Server... +2023-11-06 15:01:00,667 ERROR [Errno 48] Address already in use +2023-11-06 15:01:00,667 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:01:03,630 INFO Initializing Server... +2023-11-06 15:01:03,631 ERROR [Errno 48] Address already in use +2023-11-06 15:01:03,631 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:04:04,162 INFO Initializing Server... +2023-11-06 15:04:04,162 INFO Initializing ASR Service... +2023-11-06 15:04:05,395 INFO Initializing ChatGPT Service... +2023-11-06 15:04:05,396 INFO chatGPT prompt: paimon35.txt +2023-11-06 15:04:05,444 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 15:04:05,616 INFO you have your own api key. Great. +2023-11-06 15:04:05,780 INFO API Chatbot initialized. +2023-11-06 15:04:05,780 INFO Initializing TTS Service for character_paimon... +2023-11-06 15:04:06,699 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 15:04:06,706 INFO Initializing Sentiment Engine... +2023-11-06 15:04:07,757 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 15:04:27,047 INFO Initializing Server... +2023-11-06 15:04:27,047 INFO Initializing ASR Service... +2023-11-06 15:04:28,346 INFO Initializing ChatGPT Service... +2023-11-06 15:04:28,347 INFO chatGPT prompt: paimon35.txt +2023-11-06 15:04:28,401 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 15:04:28,573 INFO you have your own api key. Great. +2023-11-06 15:04:28,737 INFO API Chatbot initialized. +2023-11-06 15:04:28,738 INFO Initializing TTS Service for character_paimon... +2023-11-06 15:04:29,547 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 15:04:29,560 INFO Initializing Sentiment Engine... +2023-11-06 15:04:30,547 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 15:04:31,999 INFO Connected by ('100.101.36.70', 40230) +2023-11-06 15:04:36,837 INFO WAV file received and saved. +2023-11-06 15:04:38,448 INFO ASR Result: ['你好啊']. time used 0.24. +2023-11-06 15:04:41,322 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮助你的吗?是不是肚子饿得厉害?, time used 2.87 +2023-11-06 15:04:50,258 ERROR The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. +2023-11-06 15:04:50,275 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 50, in read + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 521, in infer + z = self.flow(z_p, y_mask, g=g, reverse=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 208, in forward + x = flow(x, x_mask, g=g, reverse=reverse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 327, in forward + h = self.enc(h, x_mask, g=g) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 156, in forward + x_in = self.in_layers[i](x) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + result = hook(self, args) + ^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 65, in __call__ + setattr(module, self.name, self.compute_weight(module)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 25, in compute_weight + return _weight_norm(v, g, self.dim) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +NotImplementedError: The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. + +2023-11-06 15:04:50,275 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:32:03,122 INFO Initializing Server... +2023-11-06 16:32:03,122 INFO Initializing ASR Service... +2023-11-06 16:32:04,656 INFO Initializing ChatGPT Service... +2023-11-06 16:32:04,656 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:32:04,720 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:32:04,963 INFO you have your own api key. Great. +2023-11-06 16:32:05,138 INFO API Chatbot initialized. +2023-11-06 16:32:05,138 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:32:06,223 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:32:06,231 INFO Initializing Sentiment Engine... +2023-11-06 16:32:07,418 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:32:08,701 INFO Connected by ('100.101.36.70', 40416) +2023-11-06 16:32:16,872 INFO WAV file received and saved. +2023-11-06 16:32:18,844 INFO ASR Result: ['你好啊']. time used 0.30. +2023-11-06 16:32:21,438 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?是不是肚子饿得厉害?, time used 2.59 +2023-11-06 16:32:25,099 INFO VITS Synth Done, time used 3.66 +2023-11-06 16:32:25,128 INFO Sentiment Engine Infer: 0 +2023-11-06 16:32:25,633 INFO WAV SENT, size 526383 +2023-11-06 16:33:04,273 ERROR [Errno 54] Connection reset by peer +2023-11-06 16:33:04,276 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-06 16:33:04,277 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:33:11,629 INFO Connected by ('100.101.36.70', 39910) +2023-11-06 16:33:15,218 INFO WAV file received and saved. +2023-11-06 16:33:15,453 INFO ASR Result: ['你好啊']. time used 0.22. +2023-11-06 16:34:18,558 INFO Initializing Server... +2023-11-06 16:34:18,558 ERROR [Errno 48] Address already in use +2023-11-06 16:34:18,559 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:31,170 INFO Initializing Server... +2023-11-06 16:34:31,171 ERROR [Errno 48] Address already in use +2023-11-06 16:34:31,171 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:34,333 INFO Initializing Server... +2023-11-06 16:34:34,333 ERROR [Errno 48] Address already in use +2023-11-06 16:34:34,334 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:36,967 INFO Initializing Server... +2023-11-06 16:34:36,967 ERROR [Errno 48] Address already in use +2023-11-06 16:34:36,967 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:39,461 INFO Initializing Server... +2023-11-06 16:34:39,461 ERROR [Errno 48] Address already in use +2023-11-06 16:34:39,461 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:42,195 INFO Initializing Server... +2023-11-06 16:34:42,196 ERROR [Errno 48] Address already in use +2023-11-06 16:34:42,196 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:56,176 INFO Initializing Server... +2023-11-06 16:34:56,176 ERROR [Errno 48] Address already in use +2023-11-06 16:34:56,176 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:59,005 INFO Initializing Server... +2023-11-06 16:34:59,006 ERROR [Errno 48] Address already in use +2023-11-06 16:34:59,006 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:35:49,578 INFO Initializing Server... +2023-11-06 16:35:49,579 INFO Initializing ASR Service... +2023-11-06 16:35:51,076 INFO Initializing ChatGPT Service... +2023-11-06 16:35:51,077 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:35:51,129 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:35:51,310 INFO you have your own api key. Great. +2023-11-06 16:35:51,462 INFO API Chatbot initialized. +2023-11-06 16:35:51,463 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:35:52,451 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:35:52,465 INFO Initializing Sentiment Engine... +2023-11-06 16:35:53,454 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:35:56,342 INFO Connected by ('100.101.36.70', 49476) +2023-11-06 16:35:59,885 INFO WAV file received and saved. +2023-11-06 16:36:01,475 INFO ASR Result: ['你好啊']. time used 0.24. +2023-11-06 16:36:03,622 INFO ChatGPT Response: 嘿嘿,你好呀!有什么事情需要派蒙帮忙的吗?还是只是来找我聊天的?, time used 2.14 +2023-11-06 16:36:06,374 INFO VITS Synth Done, time used 2.75 +2023-11-06 16:36:06,413 INFO Sentiment Engine Infer: 0 +2023-11-06 16:36:06,919 INFO WAV SENT, size 586287 +2023-11-06 16:36:26,900 INFO WAV file received and saved. +2023-11-06 16:36:27,163 INFO ASR Result: ['你是谁呀']. time used 0.25. +2023-11-06 16:36:30,512 INFO ChatGPT Response: 我是派蒙!旅行者的小伙伴和向导,负责带领旅行者在提瓦特大陆探险。我可是个话痨、急性子、吃货、小财迷哦!有什么问题或者需求,尽管告诉我,我会尽力帮你解决!嘿嘿~, time used 3.35 +2023-11-06 16:36:36,780 INFO VITS Synth Done, time used 6.27 +2023-11-06 16:36:36,854 INFO Sentiment Engine Infer: 0 +2023-11-06 16:36:37,582 INFO WAV SENT, size 1961007 +2023-11-06 16:41:25,049 INFO Initializing Server... +2023-11-06 16:41:25,049 INFO Initializing ASR Service... +2023-11-06 16:41:26,529 INFO Initializing ChatGPT Service... +2023-11-06 16:41:26,530 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:41:26,581 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:41:26,802 INFO you have your own api key. Great. +2023-11-06 16:41:26,953 INFO API Chatbot initialized. +2023-11-06 16:41:26,953 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:41:27,617 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:41:27,630 INFO Initializing Sentiment Engine... +2023-11-06 16:41:28,639 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:41:30,952 INFO Connected by ('100.101.36.70', 38392) +2023-11-06 16:41:34,975 INFO WAV file received and saved. +2023-11-06 16:41:36,772 INFO ASR Result: ['你好啊']. time used 0.32. +2023-11-06 16:41:38,408 INFO ChatGPT Response: 嘿嘿,你好呀!你是不是肚子饿了?要不要来点好吃的?, time used 1.64 +2023-11-06 16:41:38,744 ERROR Torch not compiled with CUDA enabled +2023-11-06 16:41:38,745 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read + x_tst = stn_tst.cuda().unsqueeze(0) + ^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init + raise AssertionError("Torch not compiled with CUDA enabled") +AssertionError: Torch not compiled with CUDA enabled + +2023-11-06 16:41:38,746 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:42:27,955 INFO Initializing Server... +2023-11-06 16:42:27,955 ERROR [Errno 48] Address already in use +2023-11-06 16:42:27,956 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:44:39,628 INFO Initializing Server... +2023-11-06 16:44:39,628 INFO Initializing ASR Service... +2023-11-06 16:44:41,034 INFO Initializing ChatGPT Service... +2023-11-06 16:44:41,035 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:44:41,083 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:44:41,280 INFO you have your own api key. Great. +2023-11-06 16:44:41,432 INFO API Chatbot initialized. +2023-11-06 16:44:41,433 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:44:42,098 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:44:42,106 INFO Initializing Sentiment Engine... +2023-11-06 16:44:43,108 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:45:24,230 INFO Connected by ('100.101.36.70', 48306) +2023-11-06 16:45:27,776 INFO WAV file received and saved. +2023-11-06 16:45:29,389 INFO ASR Result: ['你好啊']. time used 0.33. +2023-11-06 16:45:31,246 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情需要我帮忙吗?或者是想找个地方吃点好吃的?, time used 1.86 +2023-11-06 16:45:34,751 INFO VITS Synth Done, time used 3.50 +2023-11-06 16:45:34,781 INFO Sentiment Engine Infer: 0 +2023-11-06 16:45:35,286 INFO WAV SENT, size 600623 +2023-11-06 16:45:50,774 INFO WAV file received and saved. +2023-11-06 16:45:51,020 INFO ASR Result: ['你是谁呀']. time used 0.23. +2023-11-06 16:45:53,452 INFO ChatGPT Response: 我是派蒙啊!你的忠实向导和伙伴。我是一个小小的生物,可以飘浮在空中,帮助你探索提瓦特大陆。有什么我可以帮助你的吗?, time used 2.42 +2023-11-06 16:45:58,646 INFO VITS Synth Done, time used 5.19 +2023-11-06 16:45:58,691 INFO Sentiment Engine Infer: 0 +2023-11-06 16:45:59,197 INFO WAV SENT, size 964655 +2023-11-06 16:46:41,536 ERROR [Errno 54] Connection reset by peer +2023-11-06 16:46:41,537 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-06 16:46:41,537 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 22:19:31,737 INFO Initializing Server... +2023-11-06 22:19:31,738 INFO Initializing ASR Service... +2023-11-06 22:19:33,420 INFO Initializing ChatGPT Service... +2023-11-06 22:19:33,421 INFO chatGPT prompt: paimon35.txt +2023-11-06 22:19:33,482 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 22:19:33,804 INFO you have your own api key. Great. +2023-11-06 22:19:33,983 INFO API Chatbot initialized. +2023-11-06 22:19:33,984 INFO Initializing TTS Service for character_paimon... +2023-11-06 22:19:34,705 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 22:19:34,718 INFO Initializing Sentiment Engine... +2023-11-06 22:19:36,002 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 22:21:37,610 INFO Connected by ('100.101.36.70', 42894) +2023-11-06 22:21:51,693 INFO WAV file received and saved. +2023-11-06 22:21:56,854 INFO ASR Result: ['你好啊']. time used 0.23. +2023-11-06 22:21:57,593 ERROR 401 Unauthorized { + "error": { + "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", + "type": "invalid_request_error", + "param": null, + "code": "invalid_api_key" + } +} + +2023-11-06 22:21:57,594 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 22:22:01,183 INFO VITS Synth Done, time used 3.59 +2023-11-06 22:22:01,695 INFO WAV SENT, size 582191 +2023-11-06 22:47:00,976 ERROR [Errno 54] Connection reset by peer +2023-11-06 22:47:00,982 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-06 22:47:00,984 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 23:21:41,044 INFO Initializing Server... +2023-11-06 23:21:41,044 INFO Initializing ASR Service... +2023-11-06 23:21:42,536 INFO Initializing ChatGPT Service... +2023-11-06 23:21:42,537 INFO chatGPT prompt: paimon35.txt +2023-11-06 23:21:42,589 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 23:21:42,853 INFO you have your own api key. Great. +2023-11-06 23:21:43,005 INFO API Chatbot initialized. +2023-11-06 23:21:43,006 INFO Initializing TTS Service for character_paimon... +2023-11-06 23:21:43,716 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 23:21:43,720 INFO Initializing Sentiment Engine... +2023-11-06 23:21:44,799 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 23:22:21,868 INFO Connected by ('100.101.36.70', 46774) +2023-11-06 23:22:30,001 INFO WAV file received and saved. +2023-11-06 23:22:32,202 INFO ASR Result: ['你好啊']. time used 0.34. +2023-11-06 23:22:32,820 ERROR 401 Unauthorized { + "error": { + "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", + "type": "invalid_request_error", + "param": null, + "code": "invalid_api_key" + } +} + +2023-11-06 23:22:32,822 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:22:36,268 INFO VITS Synth Done, time used 3.45 +2023-11-06 23:22:36,777 INFO WAV SENT, size 588847 +2023-11-06 23:22:49,548 INFO WAV file received and saved. +2023-11-06 23:22:49,807 INFO ASR Result: ['你是谁呀']. time used 0.24. +2023-11-06 23:22:50,213 ERROR 401 Unauthorized { + "error": { + "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", + "type": "invalid_request_error", + "param": null, + "code": "invalid_api_key" + } +} + +2023-11-06 23:22:50,221 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:22:53,268 INFO VITS Synth Done, time used 3.04 +2023-11-06 23:22:53,778 INFO WAV SENT, size 578607 +2023-11-06 23:38:06,174 INFO Initializing Server... +2023-11-06 23:38:06,175 INFO Initializing ASR Service... +2023-11-06 23:38:07,784 INFO Initializing ChatGPT Service... +2023-11-06 23:38:07,784 INFO chatGPT prompt: paimon35.txt +2023-11-06 23:38:07,839 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 23:38:08,125 INFO you have your own api key. Great. +2023-11-06 23:38:08,287 INFO API Chatbot initialized. +2023-11-06 23:38:08,287 INFO Initializing TTS Service for character_paimon... +2023-11-06 23:38:08,984 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 23:38:08,993 INFO Initializing Sentiment Engine... +2023-11-06 23:38:10,095 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 23:40:52,845 INFO Connected by ('100.101.36.70', 43500) +2023-11-06 23:40:57,388 INFO WAV file received and saved. +2023-11-06 23:40:59,705 INFO ASR Result: ['你好啊']. time used 0.30. +2023-11-06 23:41:00,373 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-06 23:41:00,374 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:41:03,987 INFO VITS Synth Done, time used 3.61 +2023-11-06 23:41:04,498 INFO WAV SENT, size 583727 +2023-11-06 23:41:25,310 INFO WAV file received and saved. +2023-11-06 23:41:25,527 INFO ASR Result: ['你是谁呀']. time used 0.20. +2023-11-06 23:41:26,167 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-06 23:41:26,168 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:41:30,255 INFO VITS Synth Done, time used 4.09 +2023-11-06 23:41:30,764 INFO WAV SENT, size 581679 +2023-11-06 23:43:18,495 INFO Initializing Server... +2023-11-06 23:43:18,495 INFO Initializing ASR Service... +2023-11-06 23:43:19,908 INFO Initializing ChatGPT Service... +2023-11-06 23:43:19,909 INFO chatGPT prompt: paimon35.txt +2023-11-06 23:43:19,955 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 23:43:20,142 INFO you have your own api key. Great. +2023-11-06 23:43:20,290 INFO API Chatbot initialized. +2023-11-06 23:43:20,291 INFO Initializing TTS Service for character_paimon... +2023-11-06 23:43:20,956 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 23:43:20,962 INFO Initializing Sentiment Engine... +2023-11-06 23:43:21,823 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:05:21,653 INFO Connected by ('100.101.36.70', 43596) +2023-11-07 00:05:26,645 INFO WAV file received and saved. +2023-11-07 00:05:28,708 INFO ASR Result: ['你好啊']. time used 0.34. +2023-11-07 00:05:29,432 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-07 00:05:29,434 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-07 00:05:33,106 INFO VITS Synth Done, time used 3.67 +2023-11-07 00:05:33,618 INFO WAV SENT, size 583727 +2023-11-07 00:13:40,235 INFO Initializing Server... +2023-11-07 00:13:40,235 INFO Initializing ASR Service... +2023-11-07 00:13:41,721 INFO Initializing ChatGPT Service... +2023-11-07 00:13:41,721 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:13:41,784 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:13:42,057 INFO you have your own api key. Great. +2023-11-07 00:13:42,238 INFO API Chatbot initialized. +2023-11-07 00:13:42,238 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:13:42,982 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:13:42,990 INFO Initializing Sentiment Engine... +2023-11-07 00:13:44,023 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:13:47,626 INFO Connected by ('100.101.36.70', 46568) +2023-11-07 00:14:14,268 INFO WAV file received and saved. +2023-11-07 00:14:16,452 INFO ASR Result: ['你好啊']. time used 0.33. +2023-11-07 00:14:19,148 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-07 00:14:19,149 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-07 00:14:22,671 INFO VITS Synth Done, time used 3.52 +2023-11-07 00:14:23,179 INFO WAV SENT, size 583727 +2023-11-07 00:25:26,832 INFO WAV file received and saved. +2023-11-07 00:25:27,252 INFO ASR Result: ['你是谁']. time used 0.41. +2023-11-07 00:25:27,986 ERROR HTTPConnectionPool(host='75.63.212.152', port=41874): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) +2023-11-07 00:25:27,988 INFO Something wrong with internet, sending: +你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? + +2023-11-07 00:25:30,959 INFO VITS Synth Done, time used 2.97 +2023-11-07 00:25:31,470 INFO WAV SENT, size 531503 +2023-11-07 00:36:57,796 INFO Initializing Server... +2023-11-07 00:36:57,797 ERROR [Errno 48] Address already in use +2023-11-07 00:36:57,797 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:37:14,693 INFO Initializing Server... +2023-11-07 00:37:14,693 ERROR [Errno 48] Address already in use +2023-11-07 00:37:14,694 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:37:17,685 INFO Initializing Server... +2023-11-07 00:37:17,685 ERROR [Errno 48] Address already in use +2023-11-07 00:37:17,686 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:37:20,576 INFO Initializing Server... +2023-11-07 00:37:20,576 ERROR [Errno 48] Address already in use +2023-11-07 00:37:20,577 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:38:11,512 INFO Initializing Server... +2023-11-07 00:38:11,512 INFO Initializing ASR Service... +2023-11-07 00:38:13,046 INFO Initializing ChatGPT Service... +2023-11-07 00:38:13,047 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:38:13,097 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:38:13,342 INFO you have your own api key. Great. +2023-11-07 00:38:13,507 INFO API Chatbot initialized. +2023-11-07 00:38:13,507 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:38:14,265 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:38:14,275 INFO Initializing Sentiment Engine... +2023-11-07 00:38:15,612 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:38:41,905 INFO Connected by ('100.101.36.70', 46156) +2023-11-07 00:38:46,057 INFO WAV file received and saved. +2023-11-07 00:38:48,074 INFO ASR Result: ['你好吗']. time used 0.33. +2023-11-07 00:38:48,673 ERROR Expecting value: line 1 column 1 (char 0) +2023-11-07 00:38:48,698 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 115, in listen + resp_text = self.chat_gpt.ask(ask_text) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 81, in ask + prev_text = self.chatbot.ask(text) + ^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 356, in ask + full_response: str = "".join(response) + ^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 234, in ask_stream + resp: dict = json.loads(line) + ^^^^^^^^^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/__init__.py", line 346, in loads + return _default_decoder.decode(s) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 337, in decode + obj, end = self.raw_decode(s, idx=_w(s, 0).end()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 355, in raw_decode + raise JSONDecodeError("Expecting value", s, err.value) from None +json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) + +2023-11-07 00:38:48,699 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:44:51,325 INFO Connected by ('100.101.36.70', 40122) +2023-11-07 00:44:59,945 INFO WAV file received and saved. +2023-11-07 00:45:00,236 INFO ASR Result: ['你好啊']. time used 0.28. +2023-11-07 00:45:00,870 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-07 00:45:00,871 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-07 00:45:04,600 INFO VITS Synth Done, time used 3.73 +2023-11-07 00:45:05,111 INFO WAV SENT, size 596015 +2023-11-07 00:45:46,999 INFO Initializing Server... +2023-11-07 00:45:46,999 ERROR [Errno 48] Address already in use +2023-11-07 00:45:46,999 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:48:04,349 INFO Initializing Server... +2023-11-07 00:48:04,349 INFO Initializing ASR Service... +2023-11-07 00:48:05,826 INFO Initializing ChatGPT Service... +2023-11-07 00:48:05,827 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:48:05,884 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:48:06,084 INFO you have your own api key. Great. +2023-11-07 00:48:06,233 INFO API Chatbot initialized. +2023-11-07 00:48:06,234 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:48:06,891 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:48:06,901 INFO Initializing Sentiment Engine... +2023-11-07 00:48:07,745 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:48:14,776 INFO Connected by ('100.101.36.70', 39596) +2023-11-07 00:48:18,983 INFO WAV file received and saved. +2023-11-07 00:48:20,761 INFO ASR Result: ['你是谁呀']. time used 0.32. +2023-11-07 00:48:21,294 ERROR HTTPConnectionPool(host='75.63.212.152', port=41841): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) +2023-11-07 00:48:21,295 INFO Something wrong with internet, sending: +你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? + +2023-11-07 00:48:24,501 INFO VITS Synth Done, time used 3.20 +2023-11-07 00:48:25,010 INFO WAV SENT, size 539183 +2023-11-07 00:49:13,962 INFO Initializing Server... +2023-11-07 00:49:13,963 ERROR [Errno 48] Address already in use +2023-11-07 00:49:13,963 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:49:40,571 INFO Initializing Server... +2023-11-07 00:49:40,571 INFO Initializing ASR Service... +2023-11-07 00:49:42,031 INFO Initializing ChatGPT Service... +2023-11-07 00:49:42,031 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:49:42,081 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:49:42,259 INFO you have your own api key. Great. +2023-11-07 00:49:42,410 INFO API Chatbot initialized. +2023-11-07 00:49:42,411 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:49:43,058 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:49:43,070 INFO Initializing Sentiment Engine... +2023-11-07 00:49:43,976 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:50:24,505 INFO Connected by ('100.101.36.70', 46034) +2023-11-07 00:50:28,583 INFO WAV file received and saved. +2023-11-07 00:50:30,186 INFO ASR Result: ['你好啊']. time used 0.25. +2023-11-07 00:50:34,116 INFO VITS Synth Done, time used 2.24 +2023-11-07 00:50:34,134 INFO Sentiment Engine Infer: 0 +2023-11-07 00:50:34,640 INFO WAV SENT, size 229423 +2023-11-07 00:50:43,853 INFO WAV file received and saved. +2023-11-07 00:50:44,104 INFO ASR Result: ['你是谁呀']. time used 0.23. +2023-11-07 00:50:49,971 INFO VITS Synth Done, time used 2.42 +2023-11-07 00:50:49,997 INFO Sentiment Engine Infer: 0 +2023-11-07 00:50:50,503 INFO WAV SENT, size 443951 +2023-11-07 00:54:21,532 INFO Initializing Server... +2023-11-07 00:54:21,532 INFO Initializing ASR Service... +2023-11-07 00:54:23,167 INFO Initializing ChatGPT Service... +2023-11-07 00:54:23,168 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:54:23,227 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:54:23,416 INFO you have your own api key. Great. +2023-11-07 00:54:23,579 INFO API Chatbot initialized. +2023-11-07 00:54:23,579 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:54:24,429 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:54:24,440 INFO Initializing Sentiment Engine... +2023-11-07 00:54:25,488 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:54:43,603 INFO Connected by ('100.101.36.70', 43594) +2023-11-07 00:54:47,213 INFO WAV file received and saved. +2023-11-07 00:54:48,925 INFO ASR Result: ['你好啊']. time used 0.32. +2023-11-07 00:54:53,961 INFO VITS Synth Done, time used 2.62 +2023-11-07 00:54:53,985 INFO Sentiment Engine Infer: 4 +2023-11-07 00:54:54,491 INFO WAV SENT, size 414767 +2023-11-07 01:02:21,600 INFO Initializing Server... +2023-11-07 01:02:21,600 ERROR [Errno 48] Address already in use +2023-11-07 01:02:21,600 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 01:02:54,007 INFO Initializing Server... +2023-11-07 01:02:54,007 INFO Initializing ASR Service... +2023-11-07 01:02:55,458 INFO Initializing ChatGPT Service... +2023-11-07 01:02:55,458 INFO chatGPT prompt: paimon35.txt +2023-11-07 01:02:55,508 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 01:02:55,700 INFO you have your own api key. Great. +2023-11-07 01:02:55,849 INFO API Chatbot initialized. +2023-11-07 01:02:55,850 INFO Initializing TTS Service for character_paimon... +2023-11-07 01:02:56,543 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 01:02:56,558 INFO Initializing Sentiment Engine... +2023-11-07 01:02:57,995 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 01:03:41,317 INFO Connected by ('100.101.36.70', 48426) +2023-11-07 01:03:44,961 INFO WAV file received and saved. +2023-11-07 01:03:46,717 INFO ASR Result: ['你好啊']. time used 0.32. +2023-11-07 01:03:55,938 INFO VITS Synth Done, time used 4.52 +2023-11-07 01:03:55,976 INFO Sentiment Engine Infer: 0 +2023-11-07 01:03:56,482 INFO WAV SENT, size 787503 +2023-11-07 01:04:08,916 INFO WAV file received and saved. +2023-11-07 01:04:09,169 INFO ASR Result: ['你是谁呀']. time used 0.24. +2023-11-07 01:04:17,429 INFO VITS Synth Done, time used 5.13 +2023-11-07 01:04:17,471 INFO Sentiment Engine Infer: 0 +2023-11-07 01:04:17,977 INFO WAV SENT, size 956463 +2023-11-07 01:04:38,539 INFO WAV file received and saved. +2023-11-07 01:04:38,826 INFO ASR Result: ['你多大了']. time used 0.27. +2023-11-07 01:04:47,507 INFO VITS Synth Done, time used 5.57 +2023-11-07 01:04:47,560 INFO Sentiment Engine Infer: 0 +2023-11-07 01:04:48,166 INFO WAV SENT, size 1093167 +2023-11-07 10:02:31,919 INFO Initializing Server... +2023-11-07 10:02:31,920 ERROR [Errno 48] Address already in use +2023-11-07 10:02:31,920 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 10:03:00,151 INFO Initializing Server... +2023-11-07 10:03:00,151 INFO Initializing ASR Service... +2023-11-07 10:03:01,627 INFO Initializing ChatGPT Service... +2023-11-07 10:03:01,628 INFO chatGPT prompt: paimon35.txt +2023-11-07 10:03:01,697 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 10:03:01,951 INFO you have your own api key. Great. +2023-11-07 10:03:02,102 INFO API Chatbot initialized. +2023-11-07 10:03:02,103 INFO Initializing TTS Service for character_paimon... +2023-11-07 10:03:02,820 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 10:03:02,827 INFO Initializing Sentiment Engine... +2023-11-07 10:03:03,880 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 10:03:08,937 INFO Connected by ('100.101.36.70', 42440) +2023-11-07 10:03:48,592 INFO WAV file received and saved. +2023-11-07 10:03:51,085 INFO ASR Result: ['嗯你好啊']. time used 0.33. +2023-11-07 10:03:56,989 INFO VITS Synth Done, time used 3.28 +2023-11-07 10:03:57,015 INFO Sentiment Engine Infer: 0 +2023-11-07 10:03:57,521 INFO WAV SENT, size 479279 +2023-11-07 10:04:51,565 INFO WAV file received and saved. +2023-11-07 10:04:51,888 INFO ASR Result: ['你叫什么名字']. time used 0.31. +2023-11-07 10:04:58,428 INFO VITS Synth Done, time used 3.95 +2023-11-07 10:04:58,459 INFO Sentiment Engine Infer: 2 +2023-11-07 10:04:58,965 INFO WAV SENT, size 732207 +2023-11-07 10:05:37,070 INFO WAV file received and saved. +2023-11-07 10:05:37,406 INFO ASR Result: ['呃你今天开心吗']. time used 0.32. +2023-11-07 10:05:45,561 INFO VITS Synth Done, time used 5.42 +2023-11-07 10:05:45,592 INFO Sentiment Engine Infer: 2 +2023-11-07 10:05:46,098 INFO WAV SENT, size 778287 +2023-11-07 10:06:08,739 INFO WAV file received and saved. +2023-11-07 10:06:09,101 INFO ASR Result: ['今天你能收到一个红包你开心吗']. time used 0.34. +2023-11-07 10:06:18,676 INFO VITS Synth Done, time used 6.27 +2023-11-07 10:06:18,722 INFO Sentiment Engine Infer: 0 +2023-11-07 10:06:19,358 INFO WAV SENT, size 1211439 +2023-11-07 10:08:05,355 INFO WAV file received and saved. +2023-11-07 10:08:05,615 INFO ASR Result: ['你今年多大了']. time used 0.24. +2023-11-07 10:08:15,586 INFO VITS Synth Done, time used 6.50 +2023-11-07 10:08:15,641 INFO Sentiment Engine Infer: 2 +2023-11-07 10:08:16,192 INFO WAV SENT, size 1268271 +2023-11-07 10:09:15,782 INFO WAV file received and saved. +2023-11-07 10:09:16,126 INFO ASR Result: ['呃你最伤心的是什么时候']. time used 0.33. +2023-11-07 10:09:29,299 INFO VITS Synth Done, time used 8.52 +2023-11-07 10:09:29,367 INFO Sentiment Engine Infer: 0 +2023-11-07 10:09:30,212 INFO WAV SENT, size 1684015 +2023-11-07 10:11:10,356 INFO WAV file received and saved. +2023-11-07 10:11:10,644 INFO ASR Result: ['呃派萌你给我笑一个']. time used 0.27. +2023-11-07 10:11:15,242 INFO VITS Synth Done, time used 2.44 +2023-11-07 10:11:15,261 INFO Sentiment Engine Infer: 2 +2023-11-07 10:11:15,772 INFO WAV SENT, size 459311 +2023-11-07 10:20:05,218 ERROR [Errno 54] Connection reset by peer +2023-11-07 10:20:05,221 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-07 10:20:05,221 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 10:22:03,143 INFO Connected by ('100.101.36.70', 48596) +2023-11-07 10:25:27,750 ERROR [Errno 54] Connection reset by peer +2023-11-07 10:25:27,757 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-07 10:25:27,758 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:03:48,974 INFO Initializing Server... +2023-11-18 19:03:48,975 INFO Initializing ASR Service... +2023-11-18 19:03:50,652 INFO Initializing ChatGPT Service... +2023-11-18 19:03:50,652 INFO chatGPT prompt: paimon35.txt +2023-11-18 19:03:50,718 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-18 19:03:51,172 INFO you have your own api key. Great. +2023-11-18 19:03:56,133 INFO API Chatbot initialized. +2023-11-18 19:03:56,134 INFO Initializing TTS Service for character_paimon... +2023-11-18 19:03:56,827 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-18 19:03:56,837 INFO Initializing Sentiment Engine... +2023-11-18 19:03:58,351 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:04:40,539 INFO Initializing Server... +2023-11-18 19:04:40,539 INFO Initializing ASR Service... +2023-11-18 19:04:42,033 INFO Initializing ChatGPT Service... +2023-11-18 19:04:42,033 INFO chatGPT prompt: paimon35.txt +2023-11-18 19:04:42,090 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-18 19:04:42,262 INFO you have your own api key. Great. +2023-11-18 19:04:42,430 INFO API Chatbot initialized. +2023-11-18 19:04:42,430 INFO Initializing TTS Service for character_paimon... +2023-11-18 19:04:43,108 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-18 19:04:43,124 INFO Initializing Sentiment Engine... +2023-11-18 19:04:44,187 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:05:54,982 INFO Connected by ('100.67.8.121', 54466) +2023-11-18 19:06:04,394 INFO WAV file received and saved. +2023-11-18 19:06:15,834 INFO ASR Result: ['你好啊']. time used 0.38. +2023-11-18 19:06:20,958 INFO VITS Synth Done, time used 2.62 +2023-11-18 19:06:20,987 INFO Sentiment Engine Infer: 4 +2023-11-18 19:06:21,493 INFO WAV SENT, size 378927 +2023-11-18 19:06:36,485 INFO WAV file received and saved. +2023-11-18 19:06:36,766 INFO ASR Result: ['你是谁呀']. time used 0.27. +2023-11-18 19:06:42,482 INFO VITS Synth Done, time used 2.44 +2023-11-18 19:06:42,510 INFO Sentiment Engine Infer: 1 +2023-11-18 19:06:43,016 INFO WAV SENT, size 426543 +2023-11-18 19:06:59,175 INFO WAV file received and saved. +2023-11-18 19:06:59,554 INFO ASR Result: ['你那个你在要做什么呢']. time used 0.36. +2023-11-18 19:07:05,391 INFO VITS Synth Done, time used 2.98 +2023-11-18 19:07:05,481 INFO Sentiment Engine Infer: 2 +2023-11-18 19:07:05,987 INFO WAV SENT, size 517679 +2023-11-18 19:07:17,603 INFO WAV file received and saved. +2023-11-18 19:07:17,987 INFO ASR Result: ['你要不要跟我一起去登山']. time used 0.36. +2023-11-18 19:07:27,703 INFO VITS Synth Done, time used 6.16 +2023-11-18 19:07:27,757 INFO Sentiment Engine Infer: 0 +2023-11-18 19:07:28,333 INFO WAV SENT, size 1131055 +2023-11-18 19:07:51,016 INFO WAV file received and saved. +2023-11-18 19:07:51,544 INFO ASR Result: ['我想要去登泰山那你是走上去呢还是飞上去呢']. time used 0.50. +2023-11-18 19:08:06,046 INFO VITS Synth Done, time used 9.53 +2023-11-18 19:08:06,164 INFO Sentiment Engine Infer: 0 +2023-11-18 19:08:07,010 INFO WAV SENT, size 1785391 +2023-11-18 19:08:36,496 INFO WAV file received and saved. +2023-11-18 19:08:36,995 INFO ASR Result: ['你能登得了吗你到时候在中途你登不动的时候你又要下山我那我到时候怎么办呢']. time used 0.47. +2023-11-18 19:08:55,337 INFO VITS Synth Done, time used 13.26 +2023-11-18 19:08:55,479 INFO Sentiment Engine Infer: 0 +2023-11-18 19:08:56,410 INFO WAV SENT, size 2185263 +2023-11-18 19:09:28,428 INFO WAV file received and saved. +2023-11-18 19:09:28,969 INFO ASR Result: ['嗯你好好锻炼身体吧你锻炼好身体然后我们明天再去登山']. time used 0.51. +2023-11-18 19:09:30,790 ERROR 400 Bad Request { + "error": { + "message": "-2 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:09:30,791 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:09:33,865 INFO VITS Synth Done, time used 3.07 +2023-11-18 19:09:34,377 INFO WAV SENT, size 581167 +2023-11-18 19:11:39,011 INFO WAV file received and saved. +2023-11-18 19:11:39,470 INFO ASR Result: ['我看一下呃你我们来玩个文字冒险游戏好吗']. time used 0.42. +2023-11-18 19:11:40,592 ERROR 400 Bad Request { + "error": { + "message": "-28 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:11:40,593 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:11:44,679 INFO VITS Synth Done, time used 4.09 +2023-11-18 19:11:45,188 INFO WAV SENT, size 581679 +2023-11-18 19:12:00,198 ERROR [Errno 32] Broken pipe +2023-11-18 19:12:00,202 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file + self.conn.send(b'sb') +BrokenPipeError: [Errno 32] Broken pipe + +2023-11-18 19:12:00,204 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:12:03,265 INFO Connected by ('100.67.8.121', 54534) +2023-11-18 19:12:12,545 INFO WAV file received and saved. +2023-11-18 19:12:12,933 INFO ASR Result: ['潘们你会玩游戏吗']. time used 0.36. +2023-11-18 19:12:14,003 ERROR 400 Bad Request { + "error": { + "message": "-41 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:12:14,005 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:12:17,103 INFO VITS Synth Done, time used 3.10 +2023-11-18 19:12:17,610 INFO WAV SENT, size 584751 +2023-11-18 19:12:30,259 INFO Initializing Server... +2023-11-18 19:12:30,260 ERROR [Errno 48] Address already in use +2023-11-18 19:12:30,260 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-18 19:13:58,805 INFO Initializing Server... +2023-11-18 19:13:58,808 INFO Initializing ASR Service... +2023-11-18 19:14:00,607 INFO Initializing ChatGPT Service... +2023-11-18 19:14:00,608 INFO chatGPT prompt: paimon35.txt +2023-11-18 19:14:00,671 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-18 19:14:00,910 INFO you have your own api key. Great. +2023-11-18 19:14:01,082 INFO API Chatbot initialized. +2023-11-18 19:14:01,082 INFO Initializing TTS Service for character_paimon... +2023-11-18 19:14:01,774 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-18 19:14:01,784 INFO Initializing Sentiment Engine... +2023-11-18 19:14:03,391 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:14:17,684 INFO Connected by ('100.67.8.121', 54548) +2023-11-18 19:14:23,441 INFO WAV file received and saved. +2023-11-18 19:14:25,299 INFO ASR Result: ['晚上好']. time used 0.34. +2023-11-18 19:14:33,770 INFO VITS Synth Done, time used 2.70 +2023-11-18 19:14:33,791 INFO Sentiment Engine Infer: 0 +2023-11-18 19:14:34,297 INFO WAV SENT, size 416815 +2023-11-18 19:14:45,067 INFO WAV file received and saved. +2023-11-18 19:14:45,447 INFO ASR Result: ['我一点都不饿我现在想要玩游戏']. time used 0.36. +2023-11-18 19:15:02,543 INFO VITS Synth Done, time used 5.91 +2023-11-18 19:15:02,625 INFO Sentiment Engine Infer: 2 +2023-11-18 19:15:03,185 INFO WAV SENT, size 1081903 +2023-11-18 19:15:22,101 INFO WAV file received and saved. +2023-11-18 19:15:22,501 INFO ASR Result: ['你我们来玩一个文字冒险游戏可以吗']. time used 0.38. +2023-11-18 19:15:27,507 ERROR HTTPSConnectionPool(host='translation.googleapis.com', port=443): Max retries exceeded with url: /language/translate/v2?target=EN&key=AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4&q=%E4%BD%A0%E6%88%91%E4%BB%AC%E6%9D%A5%E7%8E%A9%E4%B8%80%E4%B8%AA%E6%96%87%E5%AD%97%E5%86%92%E9%99%A9%E6%B8%B8%E6%88%8F%E5%8F%AF%E4%BB%A5%E5%90%97 (Caused by ProxyError('Cannot connect to proxy.', ConnectionResetError(54, 'Connection reset by peer'))) +2023-11-18 19:15:27,508 INFO Something wrong with internet, sending: +你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? + +2023-11-18 19:15:30,447 INFO VITS Synth Done, time used 2.94 +2023-11-18 19:15:30,957 INFO WAV SENT, size 537647 +2023-11-18 19:15:44,452 INFO WAV file received and saved. +2023-11-18 19:15:44,797 INFO ASR Result: ['没有啊']. time used 0.32. +2023-11-18 19:15:55,076 INFO VITS Synth Done, time used 3.53 +2023-11-18 19:15:55,113 INFO Sentiment Engine Infer: 2 +2023-11-18 19:15:55,616 INFO WAV SENT, size 546863 +2023-11-18 19:16:08,697 INFO WAV file received and saved. +2023-11-18 19:16:09,136 INFO ASR Result: ['我们现在玩一个文字冒险游戏好吗']. time used 0.42. +2023-11-18 19:16:28,975 INFO VITS Synth Done, time used 6.15 +2023-11-18 19:16:29,086 INFO Sentiment Engine Infer: 0 +2023-11-18 19:16:29,634 INFO WAV SENT, size 1060399 +2023-11-18 19:16:51,017 INFO WAV file received and saved. +2023-11-18 19:16:51,497 INFO ASR Result: ['我们玩一个去森林里面冒险的游戏你觉得如何']. time used 0.44. +2023-11-18 19:17:21,971 INFO VITS Synth Done, time used 13.88 +2023-11-18 19:17:22,065 INFO Sentiment Engine Infer: 0 +2023-11-18 19:17:22,900 INFO WAV SENT, size 1540143 +2023-11-18 19:17:44,336 INFO WAV file received and saved. +2023-11-18 19:17:44,731 INFO ASR Result: ['我已经准备好了']. time used 0.38. +2023-11-18 19:18:10,553 INFO VITS Synth Done, time used 8.93 +2023-11-18 19:18:10,657 INFO Sentiment Engine Infer: 0 +2023-11-18 19:18:11,342 INFO WAV SENT, size 1571375 +2023-11-18 19:18:43,776 INFO WAV file received and saved. +2023-11-18 19:18:44,205 INFO ASR Result: ['你是不是还没有说完请继续']. time used 0.40. +2023-11-18 19:18:45,522 ERROR 400 Bad Request { + "error": { + "message": "-21 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:18:45,523 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:18:48,835 INFO VITS Synth Done, time used 3.31 +2023-11-18 19:18:49,346 INFO WAV SENT, size 590383 +2023-11-18 19:24:14,842 ERROR [Errno 32] Broken pipe +2023-11-18 19:24:14,849 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file + self.conn.send(b'sb') +BrokenPipeError: [Errno 32] Broken pipe + +2023-11-18 19:24:14,850 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:33:47,379 INFO Initializing Server... +2023-11-19 16:33:47,380 INFO Initializing ASR Service... +2023-11-19 16:33:49,060 INFO Initializing ChatGPT Service... +2023-11-19 16:33:49,061 INFO chatGPT prompt: paimon35.txt +2023-11-19 16:33:49,146 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 16:33:49,506 INFO you have your own api key. Great. +2023-11-19 16:33:49,682 INFO API Chatbot initialized. +2023-11-19 16:33:49,682 INFO Initializing TTS Service for character_paimon... +2023-11-19 16:33:50,374 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-19 16:33:50,382 INFO Initializing Sentiment Engine... +2023-11-19 16:33:51,784 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:34:51,579 INFO Connected by ('100.67.8.121', 58508) +2023-11-19 16:35:18,809 ERROR [Errno 54] Connection reset by peer +2023-11-19 16:35:18,811 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-19 16:35:18,812 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:35:24,069 INFO Connected by ('100.67.8.121', 58530) +2023-11-19 16:35:28,394 INFO WAV file received and saved. +2023-11-19 16:35:37,126 INFO ASR Result: ['你好啊']. time used 0.23. +2023-11-19 16:35:43,058 INFO VITS Synth Done, time used 3.34 +2023-11-19 16:35:43,086 INFO Sentiment Engine Infer: 0 +2023-11-19 16:35:43,592 INFO WAV SENT, size 564271 +2023-11-19 16:35:54,331 INFO WAV file received and saved. +2023-11-19 16:35:54,653 INFO ASR Result: ['你是谁呀']. time used 0.30. +2023-11-19 16:35:59,976 INFO VITS Synth Done, time used 2.77 +2023-11-19 16:36:00,001 INFO Sentiment Engine Infer: 0 +2023-11-19 16:36:00,507 INFO WAV SENT, size 527407 diff --git a/log_async.log b/log_async.log new file mode 100644 index 0000000..08dcbe8 --- /dev/null +++ b/log_async.log @@ -0,0 +1,1203 @@ +2023-11-06 14:34:35,862 INFO Initializing Server... +2023-11-06 14:34:35,863 ERROR [Errno 55] No buffer space available +2023-11-06 14:34:35,863 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) +OSError: [Errno 55] No buffer space available + +2023-11-06 14:37:52,403 INFO Initializing Server... +2023-11-06 14:37:52,403 ERROR [Errno 55] No buffer space available +2023-11-06 14:37:52,403 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) +OSError: [Errno 55] No buffer space available + +2023-11-06 14:40:17,051 INFO Initializing Server... +2023-11-06 14:40:17,052 ERROR [Errno 55] No buffer space available +2023-11-06 14:40:17,054 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ + self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) +OSError: [Errno 55] No buffer space available + +2023-11-06 14:55:18,836 INFO Initializing Server... +2023-11-06 14:55:18,837 INFO Initializing ASR Service... +2023-11-06 14:55:20,331 INFO Initializing ChatGPT Service... +2023-11-06 14:55:20,332 INFO chatGPT prompt: paimon35.txt +2023-11-06 14:55:20,387 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 14:55:21,681 INFO you have your own api key. Great. +2023-11-06 14:55:25,676 INFO API Chatbot initialized. +2023-11-06 14:55:25,677 INFO Initializing TTS Service for character_paimon... +2023-11-06 14:55:26,687 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 14:55:26,696 INFO Initializing Sentiment Engine... +2023-11-06 14:55:30,988 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 14:56:43,022 INFO Connected by ('100.101.36.70', 39578) +2023-11-06 14:56:47,253 INFO WAV file received and saved. +2023-11-06 14:57:07,580 INFO ASR Result: ['你好啊']. time used 0.24. +2023-11-06 14:57:10,551 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情要找我吗?还是你肚子饿了,想找我一起吃点好吃的?, time used 2.97 +2023-11-06 14:57:10,924 ERROR Torch not compiled with CUDA enabled +2023-11-06 14:57:10,925 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read + x_tst = stn_tst.cuda().unsqueeze(0) + ^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init + raise AssertionError("Torch not compiled with CUDA enabled") +AssertionError: Torch not compiled with CUDA enabled + +2023-11-06 14:57:10,925 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 14:59:19,918 INFO Initializing Server... +2023-11-06 14:59:19,918 INFO Initializing ASR Service... +2023-11-06 14:59:21,260 INFO Initializing ChatGPT Service... +2023-11-06 14:59:21,261 INFO chatGPT prompt: paimon35.txt +2023-11-06 14:59:21,313 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 14:59:21,545 INFO you have your own api key. Great. +2023-11-06 14:59:21,731 INFO API Chatbot initialized. +2023-11-06 14:59:21,731 INFO Initializing TTS Service for character_paimon... +2023-11-06 14:59:22,707 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 14:59:22,714 INFO Initializing Sentiment Engine... +2023-11-06 14:59:23,748 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 14:59:28,203 INFO Connected by ('100.101.36.70', 41902) +2023-11-06 14:59:34,064 INFO WAV file received and saved. +2023-11-06 14:59:35,940 INFO ASR Result: ['你好啊']. time used 0.26. +2023-11-06 14:59:37,973 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?还是你肚子饿了,需要找点好吃的?, time used 2.03 +2023-11-06 14:59:38,319 ERROR Torch not compiled with CUDA enabled +2023-11-06 14:59:38,319 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 49, in read + x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init + raise AssertionError("Torch not compiled with CUDA enabled") +AssertionError: Torch not compiled with CUDA enabled + +2023-11-06 14:59:38,320 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 15:00:31,669 INFO Initializing Server... +2023-11-06 15:00:31,669 ERROR [Errno 48] Address already in use +2023-11-06 15:00:31,669 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:38,114 INFO Initializing Server... +2023-11-06 15:00:38,114 ERROR [Errno 48] Address already in use +2023-11-06 15:00:38,115 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:41,010 INFO Initializing Server... +2023-11-06 15:00:41,010 ERROR [Errno 48] Address already in use +2023-11-06 15:00:41,010 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:51,700 INFO Initializing Server... +2023-11-06 15:00:51,700 ERROR [Errno 48] Address already in use +2023-11-06 15:00:51,700 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:54,840 INFO Initializing Server... +2023-11-06 15:00:54,840 ERROR [Errno 48] Address already in use +2023-11-06 15:00:54,841 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:00:57,587 INFO Initializing Server... +2023-11-06 15:00:57,587 ERROR [Errno 48] Address already in use +2023-11-06 15:00:57,587 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:01:00,667 INFO Initializing Server... +2023-11-06 15:01:00,667 ERROR [Errno 48] Address already in use +2023-11-06 15:01:00,667 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:01:03,630 INFO Initializing Server... +2023-11-06 15:01:03,631 ERROR [Errno 48] Address already in use +2023-11-06 15:01:03,631 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 15:04:04,162 INFO Initializing Server... +2023-11-06 15:04:04,162 INFO Initializing ASR Service... +2023-11-06 15:04:05,395 INFO Initializing ChatGPT Service... +2023-11-06 15:04:05,396 INFO chatGPT prompt: paimon35.txt +2023-11-06 15:04:05,444 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 15:04:05,616 INFO you have your own api key. Great. +2023-11-06 15:04:05,780 INFO API Chatbot initialized. +2023-11-06 15:04:05,780 INFO Initializing TTS Service for character_paimon... +2023-11-06 15:04:06,699 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 15:04:06,706 INFO Initializing Sentiment Engine... +2023-11-06 15:04:07,757 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 15:04:27,047 INFO Initializing Server... +2023-11-06 15:04:27,047 INFO Initializing ASR Service... +2023-11-06 15:04:28,346 INFO Initializing ChatGPT Service... +2023-11-06 15:04:28,347 INFO chatGPT prompt: paimon35.txt +2023-11-06 15:04:28,401 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 15:04:28,573 INFO you have your own api key. Great. +2023-11-06 15:04:28,737 INFO API Chatbot initialized. +2023-11-06 15:04:28,738 INFO Initializing TTS Service for character_paimon... +2023-11-06 15:04:29,547 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 15:04:29,560 INFO Initializing Sentiment Engine... +2023-11-06 15:04:30,547 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 15:04:31,999 INFO Connected by ('100.101.36.70', 40230) +2023-11-06 15:04:36,837 INFO WAV file received and saved. +2023-11-06 15:04:38,448 INFO ASR Result: ['你好啊']. time used 0.24. +2023-11-06 15:04:41,322 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮助你的吗?是不是肚子饿得厉害?, time used 2.87 +2023-11-06 15:04:50,258 ERROR The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. +2023-11-06 15:04:50,275 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 50, in read + audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 521, in infer + z = self.flow(z_p, y_mask, g=g, reverse=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 208, in forward + x = flow(x, x_mask, g=g, reverse=reverse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 327, in forward + h = self.enc(h, x_mask, g=g) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl + return forward_call(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 156, in forward + x_in = self.in_layers[i](x) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl + result = hook(self, args) + ^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 65, in __call__ + setattr(module, self.name, self.compute_weight(module)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 25, in compute_weight + return _weight_norm(v, g, self.dim) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +NotImplementedError: The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. + +2023-11-06 15:04:50,275 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:32:03,122 INFO Initializing Server... +2023-11-06 16:32:03,122 INFO Initializing ASR Service... +2023-11-06 16:32:04,656 INFO Initializing ChatGPT Service... +2023-11-06 16:32:04,656 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:32:04,720 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:32:04,963 INFO you have your own api key. Great. +2023-11-06 16:32:05,138 INFO API Chatbot initialized. +2023-11-06 16:32:05,138 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:32:06,223 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:32:06,231 INFO Initializing Sentiment Engine... +2023-11-06 16:32:07,418 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:32:08,701 INFO Connected by ('100.101.36.70', 40416) +2023-11-06 16:32:16,872 INFO WAV file received and saved. +2023-11-06 16:32:18,844 INFO ASR Result: ['你好啊']. time used 0.30. +2023-11-06 16:32:21,438 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?是不是肚子饿得厉害?, time used 2.59 +2023-11-06 16:32:25,099 INFO VITS Synth Done, time used 3.66 +2023-11-06 16:32:25,128 INFO Sentiment Engine Infer: 0 +2023-11-06 16:32:25,633 INFO WAV SENT, size 526383 +2023-11-06 16:33:04,273 ERROR [Errno 54] Connection reset by peer +2023-11-06 16:33:04,276 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-06 16:33:04,277 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:33:11,629 INFO Connected by ('100.101.36.70', 39910) +2023-11-06 16:33:15,218 INFO WAV file received and saved. +2023-11-06 16:33:15,453 INFO ASR Result: ['你好啊']. time used 0.22. +2023-11-06 16:34:18,558 INFO Initializing Server... +2023-11-06 16:34:18,558 ERROR [Errno 48] Address already in use +2023-11-06 16:34:18,559 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:31,170 INFO Initializing Server... +2023-11-06 16:34:31,171 ERROR [Errno 48] Address already in use +2023-11-06 16:34:31,171 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:34,333 INFO Initializing Server... +2023-11-06 16:34:34,333 ERROR [Errno 48] Address already in use +2023-11-06 16:34:34,334 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:36,967 INFO Initializing Server... +2023-11-06 16:34:36,967 ERROR [Errno 48] Address already in use +2023-11-06 16:34:36,967 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:39,461 INFO Initializing Server... +2023-11-06 16:34:39,461 ERROR [Errno 48] Address already in use +2023-11-06 16:34:39,461 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:42,195 INFO Initializing Server... +2023-11-06 16:34:42,196 ERROR [Errno 48] Address already in use +2023-11-06 16:34:42,196 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:56,176 INFO Initializing Server... +2023-11-06 16:34:56,176 ERROR [Errno 48] Address already in use +2023-11-06 16:34:56,176 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:34:59,005 INFO Initializing Server... +2023-11-06 16:34:59,006 ERROR [Errno 48] Address already in use +2023-11-06 16:34:59,006 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:35:49,578 INFO Initializing Server... +2023-11-06 16:35:49,579 INFO Initializing ASR Service... +2023-11-06 16:35:51,076 INFO Initializing ChatGPT Service... +2023-11-06 16:35:51,077 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:35:51,129 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:35:51,310 INFO you have your own api key. Great. +2023-11-06 16:35:51,462 INFO API Chatbot initialized. +2023-11-06 16:35:51,463 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:35:52,451 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:35:52,465 INFO Initializing Sentiment Engine... +2023-11-06 16:35:53,454 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:35:56,342 INFO Connected by ('100.101.36.70', 49476) +2023-11-06 16:35:59,885 INFO WAV file received and saved. +2023-11-06 16:36:01,475 INFO ASR Result: ['你好啊']. time used 0.24. +2023-11-06 16:36:03,622 INFO ChatGPT Response: 嘿嘿,你好呀!有什么事情需要派蒙帮忙的吗?还是只是来找我聊天的?, time used 2.14 +2023-11-06 16:36:06,374 INFO VITS Synth Done, time used 2.75 +2023-11-06 16:36:06,413 INFO Sentiment Engine Infer: 0 +2023-11-06 16:36:06,919 INFO WAV SENT, size 586287 +2023-11-06 16:36:26,900 INFO WAV file received and saved. +2023-11-06 16:36:27,163 INFO ASR Result: ['你是谁呀']. time used 0.25. +2023-11-06 16:36:30,512 INFO ChatGPT Response: 我是派蒙!旅行者的小伙伴和向导,负责带领旅行者在提瓦特大陆探险。我可是个话痨、急性子、吃货、小财迷哦!有什么问题或者需求,尽管告诉我,我会尽力帮你解决!嘿嘿~, time used 3.35 +2023-11-06 16:36:36,780 INFO VITS Synth Done, time used 6.27 +2023-11-06 16:36:36,854 INFO Sentiment Engine Infer: 0 +2023-11-06 16:36:37,582 INFO WAV SENT, size 1961007 +2023-11-06 16:41:25,049 INFO Initializing Server... +2023-11-06 16:41:25,049 INFO Initializing ASR Service... +2023-11-06 16:41:26,529 INFO Initializing ChatGPT Service... +2023-11-06 16:41:26,530 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:41:26,581 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:41:26,802 INFO you have your own api key. Great. +2023-11-06 16:41:26,953 INFO API Chatbot initialized. +2023-11-06 16:41:26,953 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:41:27,617 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:41:27,630 INFO Initializing Sentiment Engine... +2023-11-06 16:41:28,639 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:41:30,952 INFO Connected by ('100.101.36.70', 38392) +2023-11-06 16:41:34,975 INFO WAV file received and saved. +2023-11-06 16:41:36,772 INFO ASR Result: ['你好啊']. time used 0.32. +2023-11-06 16:41:38,408 INFO ChatGPT Response: 嘿嘿,你好呀!你是不是肚子饿了?要不要来点好吃的?, time used 1.64 +2023-11-06 16:41:38,744 ERROR Torch not compiled with CUDA enabled +2023-11-06 16:41:38,745 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen + self.send_voice(resp_text) + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice + self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save + au = self.read(text) + ^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read + x_tst = stn_tst.cuda().unsqueeze(0) + ^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init + raise AssertionError("Torch not compiled with CUDA enabled") +AssertionError: Torch not compiled with CUDA enabled + +2023-11-06 16:41:38,746 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:42:27,955 INFO Initializing Server... +2023-11-06 16:42:27,955 ERROR [Errno 48] Address already in use +2023-11-06 16:42:27,956 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-06 16:44:39,628 INFO Initializing Server... +2023-11-06 16:44:39,628 INFO Initializing ASR Service... +2023-11-06 16:44:41,034 INFO Initializing ChatGPT Service... +2023-11-06 16:44:41,035 INFO chatGPT prompt: paimon35.txt +2023-11-06 16:44:41,083 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 16:44:41,280 INFO you have your own api key. Great. +2023-11-06 16:44:41,432 INFO API Chatbot initialized. +2023-11-06 16:44:41,433 INFO Initializing TTS Service for character_paimon... +2023-11-06 16:44:42,098 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 16:44:42,106 INFO Initializing Sentiment Engine... +2023-11-06 16:44:43,108 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 16:45:24,230 INFO Connected by ('100.101.36.70', 48306) +2023-11-06 16:45:27,776 INFO WAV file received and saved. +2023-11-06 16:45:29,389 INFO ASR Result: ['你好啊']. time used 0.33. +2023-11-06 16:45:31,246 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情需要我帮忙吗?或者是想找个地方吃点好吃的?, time used 1.86 +2023-11-06 16:45:34,751 INFO VITS Synth Done, time used 3.50 +2023-11-06 16:45:34,781 INFO Sentiment Engine Infer: 0 +2023-11-06 16:45:35,286 INFO WAV SENT, size 600623 +2023-11-06 16:45:50,774 INFO WAV file received and saved. +2023-11-06 16:45:51,020 INFO ASR Result: ['你是谁呀']. time used 0.23. +2023-11-06 16:45:53,452 INFO ChatGPT Response: 我是派蒙啊!你的忠实向导和伙伴。我是一个小小的生物,可以飘浮在空中,帮助你探索提瓦特大陆。有什么我可以帮助你的吗?, time used 2.42 +2023-11-06 16:45:58,646 INFO VITS Synth Done, time used 5.19 +2023-11-06 16:45:58,691 INFO Sentiment Engine Infer: 0 +2023-11-06 16:45:59,197 INFO WAV SENT, size 964655 +2023-11-06 16:46:41,536 ERROR [Errno 54] Connection reset by peer +2023-11-06 16:46:41,537 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-06 16:46:41,537 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 22:19:31,737 INFO Initializing Server... +2023-11-06 22:19:31,738 INFO Initializing ASR Service... +2023-11-06 22:19:33,420 INFO Initializing ChatGPT Service... +2023-11-06 22:19:33,421 INFO chatGPT prompt: paimon35.txt +2023-11-06 22:19:33,482 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 22:19:33,804 INFO you have your own api key. Great. +2023-11-06 22:19:33,983 INFO API Chatbot initialized. +2023-11-06 22:19:33,984 INFO Initializing TTS Service for character_paimon... +2023-11-06 22:19:34,705 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 22:19:34,718 INFO Initializing Sentiment Engine... +2023-11-06 22:19:36,002 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 22:21:37,610 INFO Connected by ('100.101.36.70', 42894) +2023-11-06 22:21:51,693 INFO WAV file received and saved. +2023-11-06 22:21:56,854 INFO ASR Result: ['你好啊']. time used 0.23. +2023-11-06 22:21:57,593 ERROR 401 Unauthorized { + "error": { + "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", + "type": "invalid_request_error", + "param": null, + "code": "invalid_api_key" + } +} + +2023-11-06 22:21:57,594 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 22:22:01,183 INFO VITS Synth Done, time used 3.59 +2023-11-06 22:22:01,695 INFO WAV SENT, size 582191 +2023-11-06 22:47:00,976 ERROR [Errno 54] Connection reset by peer +2023-11-06 22:47:00,982 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-06 22:47:00,984 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 23:21:41,044 INFO Initializing Server... +2023-11-06 23:21:41,044 INFO Initializing ASR Service... +2023-11-06 23:21:42,536 INFO Initializing ChatGPT Service... +2023-11-06 23:21:42,537 INFO chatGPT prompt: paimon35.txt +2023-11-06 23:21:42,589 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 23:21:42,853 INFO you have your own api key. Great. +2023-11-06 23:21:43,005 INFO API Chatbot initialized. +2023-11-06 23:21:43,006 INFO Initializing TTS Service for character_paimon... +2023-11-06 23:21:43,716 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 23:21:43,720 INFO Initializing Sentiment Engine... +2023-11-06 23:21:44,799 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 23:22:21,868 INFO Connected by ('100.101.36.70', 46774) +2023-11-06 23:22:30,001 INFO WAV file received and saved. +2023-11-06 23:22:32,202 INFO ASR Result: ['你好啊']. time used 0.34. +2023-11-06 23:22:32,820 ERROR 401 Unauthorized { + "error": { + "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", + "type": "invalid_request_error", + "param": null, + "code": "invalid_api_key" + } +} + +2023-11-06 23:22:32,822 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:22:36,268 INFO VITS Synth Done, time used 3.45 +2023-11-06 23:22:36,777 INFO WAV SENT, size 588847 +2023-11-06 23:22:49,548 INFO WAV file received and saved. +2023-11-06 23:22:49,807 INFO ASR Result: ['你是谁呀']. time used 0.24. +2023-11-06 23:22:50,213 ERROR 401 Unauthorized { + "error": { + "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", + "type": "invalid_request_error", + "param": null, + "code": "invalid_api_key" + } +} + +2023-11-06 23:22:50,221 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:22:53,268 INFO VITS Synth Done, time used 3.04 +2023-11-06 23:22:53,778 INFO WAV SENT, size 578607 +2023-11-06 23:38:06,174 INFO Initializing Server... +2023-11-06 23:38:06,175 INFO Initializing ASR Service... +2023-11-06 23:38:07,784 INFO Initializing ChatGPT Service... +2023-11-06 23:38:07,784 INFO chatGPT prompt: paimon35.txt +2023-11-06 23:38:07,839 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 23:38:08,125 INFO you have your own api key. Great. +2023-11-06 23:38:08,287 INFO API Chatbot initialized. +2023-11-06 23:38:08,287 INFO Initializing TTS Service for character_paimon... +2023-11-06 23:38:08,984 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 23:38:08,993 INFO Initializing Sentiment Engine... +2023-11-06 23:38:10,095 INFO Server is listening on 0.0.0.0:38438... +2023-11-06 23:40:52,845 INFO Connected by ('100.101.36.70', 43500) +2023-11-06 23:40:57,388 INFO WAV file received and saved. +2023-11-06 23:40:59,705 INFO ASR Result: ['你好啊']. time used 0.30. +2023-11-06 23:41:00,373 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-06 23:41:00,374 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:41:03,987 INFO VITS Synth Done, time used 3.61 +2023-11-06 23:41:04,498 INFO WAV SENT, size 583727 +2023-11-06 23:41:25,310 INFO WAV file received and saved. +2023-11-06 23:41:25,527 INFO ASR Result: ['你是谁呀']. time used 0.20. +2023-11-06 23:41:26,167 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-06 23:41:26,168 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-06 23:41:30,255 INFO VITS Synth Done, time used 4.09 +2023-11-06 23:41:30,764 INFO WAV SENT, size 581679 +2023-11-06 23:43:18,495 INFO Initializing Server... +2023-11-06 23:43:18,495 INFO Initializing ASR Service... +2023-11-06 23:43:19,908 INFO Initializing ChatGPT Service... +2023-11-06 23:43:19,909 INFO chatGPT prompt: paimon35.txt +2023-11-06 23:43:19,955 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-06 23:43:20,142 INFO you have your own api key. Great. +2023-11-06 23:43:20,290 INFO API Chatbot initialized. +2023-11-06 23:43:20,291 INFO Initializing TTS Service for character_paimon... +2023-11-06 23:43:20,956 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-06 23:43:20,962 INFO Initializing Sentiment Engine... +2023-11-06 23:43:21,823 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:05:21,653 INFO Connected by ('100.101.36.70', 43596) +2023-11-07 00:05:26,645 INFO WAV file received and saved. +2023-11-07 00:05:28,708 INFO ASR Result: ['你好啊']. time used 0.34. +2023-11-07 00:05:29,432 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-07 00:05:29,434 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-07 00:05:33,106 INFO VITS Synth Done, time used 3.67 +2023-11-07 00:05:33,618 INFO WAV SENT, size 583727 +2023-11-07 00:13:40,235 INFO Initializing Server... +2023-11-07 00:13:40,235 INFO Initializing ASR Service... +2023-11-07 00:13:41,721 INFO Initializing ChatGPT Service... +2023-11-07 00:13:41,721 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:13:41,784 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:13:42,057 INFO you have your own api key. Great. +2023-11-07 00:13:42,238 INFO API Chatbot initialized. +2023-11-07 00:13:42,238 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:13:42,982 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:13:42,990 INFO Initializing Sentiment Engine... +2023-11-07 00:13:44,023 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:13:47,626 INFO Connected by ('100.101.36.70', 46568) +2023-11-07 00:14:14,268 INFO WAV file received and saved. +2023-11-07 00:14:16,452 INFO ASR Result: ['你好啊']. time used 0.33. +2023-11-07 00:14:19,148 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-07 00:14:19,149 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-07 00:14:22,671 INFO VITS Synth Done, time used 3.52 +2023-11-07 00:14:23,179 INFO WAV SENT, size 583727 +2023-11-07 00:25:26,832 INFO WAV file received and saved. +2023-11-07 00:25:27,252 INFO ASR Result: ['你是谁']. time used 0.41. +2023-11-07 00:25:27,986 ERROR HTTPConnectionPool(host='75.63.212.152', port=41874): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) +2023-11-07 00:25:27,988 INFO Something wrong with internet, sending: +你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? + +2023-11-07 00:25:30,959 INFO VITS Synth Done, time used 2.97 +2023-11-07 00:25:31,470 INFO WAV SENT, size 531503 +2023-11-07 00:36:57,796 INFO Initializing Server... +2023-11-07 00:36:57,797 ERROR [Errno 48] Address already in use +2023-11-07 00:36:57,797 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:37:14,693 INFO Initializing Server... +2023-11-07 00:37:14,693 ERROR [Errno 48] Address already in use +2023-11-07 00:37:14,694 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:37:17,685 INFO Initializing Server... +2023-11-07 00:37:17,685 ERROR [Errno 48] Address already in use +2023-11-07 00:37:17,686 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:37:20,576 INFO Initializing Server... +2023-11-07 00:37:20,576 ERROR [Errno 48] Address already in use +2023-11-07 00:37:20,577 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:38:11,512 INFO Initializing Server... +2023-11-07 00:38:11,512 INFO Initializing ASR Service... +2023-11-07 00:38:13,046 INFO Initializing ChatGPT Service... +2023-11-07 00:38:13,047 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:38:13,097 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:38:13,342 INFO you have your own api key. Great. +2023-11-07 00:38:13,507 INFO API Chatbot initialized. +2023-11-07 00:38:13,507 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:38:14,265 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:38:14,275 INFO Initializing Sentiment Engine... +2023-11-07 00:38:15,612 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:38:41,905 INFO Connected by ('100.101.36.70', 46156) +2023-11-07 00:38:46,057 INFO WAV file received and saved. +2023-11-07 00:38:48,074 INFO ASR Result: ['你好吗']. time used 0.33. +2023-11-07 00:38:48,673 ERROR Expecting value: line 1 column 1 (char 0) +2023-11-07 00:38:48,698 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 115, in listen + resp_text = self.chat_gpt.ask(ask_text) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 81, in ask + prev_text = self.chatbot.ask(text) + ^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 356, in ask + full_response: str = "".join(response) + ^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 234, in ask_stream + resp: dict = json.loads(line) + ^^^^^^^^^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/__init__.py", line 346, in loads + return _default_decoder.decode(s) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 337, in decode + obj, end = self.raw_decode(s, idx=_w(s, 0).end()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 355, in raw_decode + raise JSONDecodeError("Expecting value", s, err.value) from None +json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) + +2023-11-07 00:38:48,699 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:44:51,325 INFO Connected by ('100.101.36.70', 40122) +2023-11-07 00:44:59,945 INFO WAV file received and saved. +2023-11-07 00:45:00,236 INFO ASR Result: ['你好啊']. time used 0.28. +2023-11-07 00:45:00,870 ERROR 404 Not Found + + + + Error response + + +

Error response

+

Error code: 404

+

Message: Not Found.

+

Error code explanation: 404 - Nothing matches the given URI.

+ + + +2023-11-07 00:45:00,871 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-07 00:45:04,600 INFO VITS Synth Done, time used 3.73 +2023-11-07 00:45:05,111 INFO WAV SENT, size 596015 +2023-11-07 00:45:46,999 INFO Initializing Server... +2023-11-07 00:45:46,999 ERROR [Errno 48] Address already in use +2023-11-07 00:45:46,999 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:48:04,349 INFO Initializing Server... +2023-11-07 00:48:04,349 INFO Initializing ASR Service... +2023-11-07 00:48:05,826 INFO Initializing ChatGPT Service... +2023-11-07 00:48:05,827 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:48:05,884 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:48:06,084 INFO you have your own api key. Great. +2023-11-07 00:48:06,233 INFO API Chatbot initialized. +2023-11-07 00:48:06,234 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:48:06,891 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:48:06,901 INFO Initializing Sentiment Engine... +2023-11-07 00:48:07,745 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:48:14,776 INFO Connected by ('100.101.36.70', 39596) +2023-11-07 00:48:18,983 INFO WAV file received and saved. +2023-11-07 00:48:20,761 INFO ASR Result: ['你是谁呀']. time used 0.32. +2023-11-07 00:48:21,294 ERROR HTTPConnectionPool(host='75.63.212.152', port=41841): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) +2023-11-07 00:48:21,295 INFO Something wrong with internet, sending: +你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? + +2023-11-07 00:48:24,501 INFO VITS Synth Done, time used 3.20 +2023-11-07 00:48:25,010 INFO WAV SENT, size 539183 +2023-11-07 00:49:13,962 INFO Initializing Server... +2023-11-07 00:49:13,963 ERROR [Errno 48] Address already in use +2023-11-07 00:49:13,963 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 00:49:40,571 INFO Initializing Server... +2023-11-07 00:49:40,571 INFO Initializing ASR Service... +2023-11-07 00:49:42,031 INFO Initializing ChatGPT Service... +2023-11-07 00:49:42,031 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:49:42,081 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:49:42,259 INFO you have your own api key. Great. +2023-11-07 00:49:42,410 INFO API Chatbot initialized. +2023-11-07 00:49:42,411 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:49:43,058 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:49:43,070 INFO Initializing Sentiment Engine... +2023-11-07 00:49:43,976 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:50:24,505 INFO Connected by ('100.101.36.70', 46034) +2023-11-07 00:50:28,583 INFO WAV file received and saved. +2023-11-07 00:50:30,186 INFO ASR Result: ['你好啊']. time used 0.25. +2023-11-07 00:50:34,116 INFO VITS Synth Done, time used 2.24 +2023-11-07 00:50:34,134 INFO Sentiment Engine Infer: 0 +2023-11-07 00:50:34,640 INFO WAV SENT, size 229423 +2023-11-07 00:50:43,853 INFO WAV file received and saved. +2023-11-07 00:50:44,104 INFO ASR Result: ['你是谁呀']. time used 0.23. +2023-11-07 00:50:49,971 INFO VITS Synth Done, time used 2.42 +2023-11-07 00:50:49,997 INFO Sentiment Engine Infer: 0 +2023-11-07 00:50:50,503 INFO WAV SENT, size 443951 +2023-11-07 00:54:21,532 INFO Initializing Server... +2023-11-07 00:54:21,532 INFO Initializing ASR Service... +2023-11-07 00:54:23,167 INFO Initializing ChatGPT Service... +2023-11-07 00:54:23,168 INFO chatGPT prompt: paimon35.txt +2023-11-07 00:54:23,227 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 00:54:23,416 INFO you have your own api key. Great. +2023-11-07 00:54:23,579 INFO API Chatbot initialized. +2023-11-07 00:54:23,579 INFO Initializing TTS Service for character_paimon... +2023-11-07 00:54:24,429 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 00:54:24,440 INFO Initializing Sentiment Engine... +2023-11-07 00:54:25,488 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 00:54:43,603 INFO Connected by ('100.101.36.70', 43594) +2023-11-07 00:54:47,213 INFO WAV file received and saved. +2023-11-07 00:54:48,925 INFO ASR Result: ['你好啊']. time used 0.32. +2023-11-07 00:54:53,961 INFO VITS Synth Done, time used 2.62 +2023-11-07 00:54:53,985 INFO Sentiment Engine Infer: 4 +2023-11-07 00:54:54,491 INFO WAV SENT, size 414767 +2023-11-07 01:02:21,600 INFO Initializing Server... +2023-11-07 01:02:21,600 ERROR [Errno 48] Address already in use +2023-11-07 01:02:21,600 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 01:02:54,007 INFO Initializing Server... +2023-11-07 01:02:54,007 INFO Initializing ASR Service... +2023-11-07 01:02:55,458 INFO Initializing ChatGPT Service... +2023-11-07 01:02:55,458 INFO chatGPT prompt: paimon35.txt +2023-11-07 01:02:55,508 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 01:02:55,700 INFO you have your own api key. Great. +2023-11-07 01:02:55,849 INFO API Chatbot initialized. +2023-11-07 01:02:55,850 INFO Initializing TTS Service for character_paimon... +2023-11-07 01:02:56,543 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 01:02:56,558 INFO Initializing Sentiment Engine... +2023-11-07 01:02:57,995 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 01:03:41,317 INFO Connected by ('100.101.36.70', 48426) +2023-11-07 01:03:44,961 INFO WAV file received and saved. +2023-11-07 01:03:46,717 INFO ASR Result: ['你好啊']. time used 0.32. +2023-11-07 01:03:55,938 INFO VITS Synth Done, time used 4.52 +2023-11-07 01:03:55,976 INFO Sentiment Engine Infer: 0 +2023-11-07 01:03:56,482 INFO WAV SENT, size 787503 +2023-11-07 01:04:08,916 INFO WAV file received and saved. +2023-11-07 01:04:09,169 INFO ASR Result: ['你是谁呀']. time used 0.24. +2023-11-07 01:04:17,429 INFO VITS Synth Done, time used 5.13 +2023-11-07 01:04:17,471 INFO Sentiment Engine Infer: 0 +2023-11-07 01:04:17,977 INFO WAV SENT, size 956463 +2023-11-07 01:04:38,539 INFO WAV file received and saved. +2023-11-07 01:04:38,826 INFO ASR Result: ['你多大了']. time used 0.27. +2023-11-07 01:04:47,507 INFO VITS Synth Done, time used 5.57 +2023-11-07 01:04:47,560 INFO Sentiment Engine Infer: 0 +2023-11-07 01:04:48,166 INFO WAV SENT, size 1093167 +2023-11-07 10:02:31,919 INFO Initializing Server... +2023-11-07 10:02:31,920 ERROR [Errno 48] Address already in use +2023-11-07 10:02:31,920 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-07 10:03:00,151 INFO Initializing Server... +2023-11-07 10:03:00,151 INFO Initializing ASR Service... +2023-11-07 10:03:01,627 INFO Initializing ChatGPT Service... +2023-11-07 10:03:01,628 INFO chatGPT prompt: paimon35.txt +2023-11-07 10:03:01,697 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-07 10:03:01,951 INFO you have your own api key. Great. +2023-11-07 10:03:02,102 INFO API Chatbot initialized. +2023-11-07 10:03:02,103 INFO Initializing TTS Service for character_paimon... +2023-11-07 10:03:02,820 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-07 10:03:02,827 INFO Initializing Sentiment Engine... +2023-11-07 10:03:03,880 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 10:03:08,937 INFO Connected by ('100.101.36.70', 42440) +2023-11-07 10:03:48,592 INFO WAV file received and saved. +2023-11-07 10:03:51,085 INFO ASR Result: ['嗯你好啊']. time used 0.33. +2023-11-07 10:03:56,989 INFO VITS Synth Done, time used 3.28 +2023-11-07 10:03:57,015 INFO Sentiment Engine Infer: 0 +2023-11-07 10:03:57,521 INFO WAV SENT, size 479279 +2023-11-07 10:04:51,565 INFO WAV file received and saved. +2023-11-07 10:04:51,888 INFO ASR Result: ['你叫什么名字']. time used 0.31. +2023-11-07 10:04:58,428 INFO VITS Synth Done, time used 3.95 +2023-11-07 10:04:58,459 INFO Sentiment Engine Infer: 2 +2023-11-07 10:04:58,965 INFO WAV SENT, size 732207 +2023-11-07 10:05:37,070 INFO WAV file received and saved. +2023-11-07 10:05:37,406 INFO ASR Result: ['呃你今天开心吗']. time used 0.32. +2023-11-07 10:05:45,561 INFO VITS Synth Done, time used 5.42 +2023-11-07 10:05:45,592 INFO Sentiment Engine Infer: 2 +2023-11-07 10:05:46,098 INFO WAV SENT, size 778287 +2023-11-07 10:06:08,739 INFO WAV file received and saved. +2023-11-07 10:06:09,101 INFO ASR Result: ['今天你能收到一个红包你开心吗']. time used 0.34. +2023-11-07 10:06:18,676 INFO VITS Synth Done, time used 6.27 +2023-11-07 10:06:18,722 INFO Sentiment Engine Infer: 0 +2023-11-07 10:06:19,358 INFO WAV SENT, size 1211439 +2023-11-07 10:08:05,355 INFO WAV file received and saved. +2023-11-07 10:08:05,615 INFO ASR Result: ['你今年多大了']. time used 0.24. +2023-11-07 10:08:15,586 INFO VITS Synth Done, time used 6.50 +2023-11-07 10:08:15,641 INFO Sentiment Engine Infer: 2 +2023-11-07 10:08:16,192 INFO WAV SENT, size 1268271 +2023-11-07 10:09:15,782 INFO WAV file received and saved. +2023-11-07 10:09:16,126 INFO ASR Result: ['呃你最伤心的是什么时候']. time used 0.33. +2023-11-07 10:09:29,299 INFO VITS Synth Done, time used 8.52 +2023-11-07 10:09:29,367 INFO Sentiment Engine Infer: 0 +2023-11-07 10:09:30,212 INFO WAV SENT, size 1684015 +2023-11-07 10:11:10,356 INFO WAV file received and saved. +2023-11-07 10:11:10,644 INFO ASR Result: ['呃派萌你给我笑一个']. time used 0.27. +2023-11-07 10:11:15,242 INFO VITS Synth Done, time used 2.44 +2023-11-07 10:11:15,261 INFO Sentiment Engine Infer: 2 +2023-11-07 10:11:15,772 INFO WAV SENT, size 459311 +2023-11-07 10:20:05,218 ERROR [Errno 54] Connection reset by peer +2023-11-07 10:20:05,221 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-07 10:20:05,221 INFO Server is listening on 0.0.0.0:38438... +2023-11-07 10:22:03,143 INFO Connected by ('100.101.36.70', 48596) +2023-11-07 10:25:27,750 ERROR [Errno 54] Connection reset by peer +2023-11-07 10:25:27,757 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-07 10:25:27,758 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:03:48,974 INFO Initializing Server... +2023-11-18 19:03:48,975 INFO Initializing ASR Service... +2023-11-18 19:03:50,652 INFO Initializing ChatGPT Service... +2023-11-18 19:03:50,652 INFO chatGPT prompt: paimon35.txt +2023-11-18 19:03:50,718 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-18 19:03:51,172 INFO you have your own api key. Great. +2023-11-18 19:03:56,133 INFO API Chatbot initialized. +2023-11-18 19:03:56,134 INFO Initializing TTS Service for character_paimon... +2023-11-18 19:03:56,827 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-18 19:03:56,837 INFO Initializing Sentiment Engine... +2023-11-18 19:03:58,351 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:04:40,539 INFO Initializing Server... +2023-11-18 19:04:40,539 INFO Initializing ASR Service... +2023-11-18 19:04:42,033 INFO Initializing ChatGPT Service... +2023-11-18 19:04:42,033 INFO chatGPT prompt: paimon35.txt +2023-11-18 19:04:42,090 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-18 19:04:42,262 INFO you have your own api key. Great. +2023-11-18 19:04:42,430 INFO API Chatbot initialized. +2023-11-18 19:04:42,430 INFO Initializing TTS Service for character_paimon... +2023-11-18 19:04:43,108 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-18 19:04:43,124 INFO Initializing Sentiment Engine... +2023-11-18 19:04:44,187 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:05:54,982 INFO Connected by ('100.67.8.121', 54466) +2023-11-18 19:06:04,394 INFO WAV file received and saved. +2023-11-18 19:06:15,834 INFO ASR Result: ['你好啊']. time used 0.38. +2023-11-18 19:06:20,958 INFO VITS Synth Done, time used 2.62 +2023-11-18 19:06:20,987 INFO Sentiment Engine Infer: 4 +2023-11-18 19:06:21,493 INFO WAV SENT, size 378927 +2023-11-18 19:06:36,485 INFO WAV file received and saved. +2023-11-18 19:06:36,766 INFO ASR Result: ['你是谁呀']. time used 0.27. +2023-11-18 19:06:42,482 INFO VITS Synth Done, time used 2.44 +2023-11-18 19:06:42,510 INFO Sentiment Engine Infer: 1 +2023-11-18 19:06:43,016 INFO WAV SENT, size 426543 +2023-11-18 19:06:59,175 INFO WAV file received and saved. +2023-11-18 19:06:59,554 INFO ASR Result: ['你那个你在要做什么呢']. time used 0.36. +2023-11-18 19:07:05,391 INFO VITS Synth Done, time used 2.98 +2023-11-18 19:07:05,481 INFO Sentiment Engine Infer: 2 +2023-11-18 19:07:05,987 INFO WAV SENT, size 517679 +2023-11-18 19:07:17,603 INFO WAV file received and saved. +2023-11-18 19:07:17,987 INFO ASR Result: ['你要不要跟我一起去登山']. time used 0.36. +2023-11-18 19:07:27,703 INFO VITS Synth Done, time used 6.16 +2023-11-18 19:07:27,757 INFO Sentiment Engine Infer: 0 +2023-11-18 19:07:28,333 INFO WAV SENT, size 1131055 +2023-11-18 19:07:51,016 INFO WAV file received and saved. +2023-11-18 19:07:51,544 INFO ASR Result: ['我想要去登泰山那你是走上去呢还是飞上去呢']. time used 0.50. +2023-11-18 19:08:06,046 INFO VITS Synth Done, time used 9.53 +2023-11-18 19:08:06,164 INFO Sentiment Engine Infer: 0 +2023-11-18 19:08:07,010 INFO WAV SENT, size 1785391 +2023-11-18 19:08:36,496 INFO WAV file received and saved. +2023-11-18 19:08:36,995 INFO ASR Result: ['你能登得了吗你到时候在中途你登不动的时候你又要下山我那我到时候怎么办呢']. time used 0.47. +2023-11-18 19:08:55,337 INFO VITS Synth Done, time used 13.26 +2023-11-18 19:08:55,479 INFO Sentiment Engine Infer: 0 +2023-11-18 19:08:56,410 INFO WAV SENT, size 2185263 +2023-11-18 19:09:28,428 INFO WAV file received and saved. +2023-11-18 19:09:28,969 INFO ASR Result: ['嗯你好好锻炼身体吧你锻炼好身体然后我们明天再去登山']. time used 0.51. +2023-11-18 19:09:30,790 ERROR 400 Bad Request { + "error": { + "message": "-2 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:09:30,791 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:09:33,865 INFO VITS Synth Done, time used 3.07 +2023-11-18 19:09:34,377 INFO WAV SENT, size 581167 +2023-11-18 19:11:39,011 INFO WAV file received and saved. +2023-11-18 19:11:39,470 INFO ASR Result: ['我看一下呃你我们来玩个文字冒险游戏好吗']. time used 0.42. +2023-11-18 19:11:40,592 ERROR 400 Bad Request { + "error": { + "message": "-28 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:11:40,593 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:11:44,679 INFO VITS Synth Done, time used 4.09 +2023-11-18 19:11:45,188 INFO WAV SENT, size 581679 +2023-11-18 19:12:00,198 ERROR [Errno 32] Broken pipe +2023-11-18 19:12:00,202 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file + self.conn.send(b'sb') +BrokenPipeError: [Errno 32] Broken pipe + +2023-11-18 19:12:00,204 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:12:03,265 INFO Connected by ('100.67.8.121', 54534) +2023-11-18 19:12:12,545 INFO WAV file received and saved. +2023-11-18 19:12:12,933 INFO ASR Result: ['潘们你会玩游戏吗']. time used 0.36. +2023-11-18 19:12:14,003 ERROR 400 Bad Request { + "error": { + "message": "-41 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:12:14,005 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:12:17,103 INFO VITS Synth Done, time used 3.10 +2023-11-18 19:12:17,610 INFO WAV SENT, size 584751 +2023-11-18 19:12:30,259 INFO Initializing Server... +2023-11-18 19:12:30,260 ERROR [Errno 48] Address already in use +2023-11-18 19:12:30,260 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-18 19:13:58,805 INFO Initializing Server... +2023-11-18 19:13:58,808 INFO Initializing ASR Service... +2023-11-18 19:14:00,607 INFO Initializing ChatGPT Service... +2023-11-18 19:14:00,608 INFO chatGPT prompt: paimon35.txt +2023-11-18 19:14:00,671 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-18 19:14:00,910 INFO you have your own api key. Great. +2023-11-18 19:14:01,082 INFO API Chatbot initialized. +2023-11-18 19:14:01,082 INFO Initializing TTS Service for character_paimon... +2023-11-18 19:14:01,774 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-18 19:14:01,784 INFO Initializing Sentiment Engine... +2023-11-18 19:14:03,391 INFO Server is listening on 0.0.0.0:38438... +2023-11-18 19:14:17,684 INFO Connected by ('100.67.8.121', 54548) +2023-11-18 19:14:23,441 INFO WAV file received and saved. +2023-11-18 19:14:25,299 INFO ASR Result: ['晚上好']. time used 0.34. +2023-11-18 19:14:33,770 INFO VITS Synth Done, time used 2.70 +2023-11-18 19:14:33,791 INFO Sentiment Engine Infer: 0 +2023-11-18 19:14:34,297 INFO WAV SENT, size 416815 +2023-11-18 19:14:45,067 INFO WAV file received and saved. +2023-11-18 19:14:45,447 INFO ASR Result: ['我一点都不饿我现在想要玩游戏']. time used 0.36. +2023-11-18 19:15:02,543 INFO VITS Synth Done, time used 5.91 +2023-11-18 19:15:02,625 INFO Sentiment Engine Infer: 2 +2023-11-18 19:15:03,185 INFO WAV SENT, size 1081903 +2023-11-18 19:15:22,101 INFO WAV file received and saved. +2023-11-18 19:15:22,501 INFO ASR Result: ['你我们来玩一个文字冒险游戏可以吗']. time used 0.38. +2023-11-18 19:15:27,507 ERROR HTTPSConnectionPool(host='translation.googleapis.com', port=443): Max retries exceeded with url: /language/translate/v2?target=EN&key=AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4&q=%E4%BD%A0%E6%88%91%E4%BB%AC%E6%9D%A5%E7%8E%A9%E4%B8%80%E4%B8%AA%E6%96%87%E5%AD%97%E5%86%92%E9%99%A9%E6%B8%B8%E6%88%8F%E5%8F%AF%E4%BB%A5%E5%90%97 (Caused by ProxyError('Cannot connect to proxy.', ConnectionResetError(54, 'Connection reset by peer'))) +2023-11-18 19:15:27,508 INFO Something wrong with internet, sending: +你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? + +2023-11-18 19:15:30,447 INFO VITS Synth Done, time used 2.94 +2023-11-18 19:15:30,957 INFO WAV SENT, size 537647 +2023-11-18 19:15:44,452 INFO WAV file received and saved. +2023-11-18 19:15:44,797 INFO ASR Result: ['没有啊']. time used 0.32. +2023-11-18 19:15:55,076 INFO VITS Synth Done, time used 3.53 +2023-11-18 19:15:55,113 INFO Sentiment Engine Infer: 2 +2023-11-18 19:15:55,616 INFO WAV SENT, size 546863 +2023-11-18 19:16:08,697 INFO WAV file received and saved. +2023-11-18 19:16:09,136 INFO ASR Result: ['我们现在玩一个文字冒险游戏好吗']. time used 0.42. +2023-11-18 19:16:28,975 INFO VITS Synth Done, time used 6.15 +2023-11-18 19:16:29,086 INFO Sentiment Engine Infer: 0 +2023-11-18 19:16:29,634 INFO WAV SENT, size 1060399 +2023-11-18 19:16:51,017 INFO WAV file received and saved. +2023-11-18 19:16:51,497 INFO ASR Result: ['我们玩一个去森林里面冒险的游戏你觉得如何']. time used 0.44. +2023-11-18 19:17:21,971 INFO VITS Synth Done, time used 13.88 +2023-11-18 19:17:22,065 INFO Sentiment Engine Infer: 0 +2023-11-18 19:17:22,900 INFO WAV SENT, size 1540143 +2023-11-18 19:17:44,336 INFO WAV file received and saved. +2023-11-18 19:17:44,731 INFO ASR Result: ['我已经准备好了']. time used 0.38. +2023-11-18 19:18:10,553 INFO VITS Synth Done, time used 8.93 +2023-11-18 19:18:10,657 INFO Sentiment Engine Infer: 0 +2023-11-18 19:18:11,342 INFO WAV SENT, size 1571375 +2023-11-18 19:18:43,776 INFO WAV file received and saved. +2023-11-18 19:18:44,205 INFO ASR Result: ['你是不是还没有说完请继续']. time used 0.40. +2023-11-18 19:18:45,522 ERROR 400 Bad Request { + "error": { + "message": "-21 is less than the minimum of 1 - 'max_tokens'", + "type": "invalid_request_error", + "param": null, + "code": null + } +} + +2023-11-18 19:18:45,523 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-18 19:18:48,835 INFO VITS Synth Done, time used 3.31 +2023-11-18 19:18:49,346 INFO WAV SENT, size 590383 +2023-11-18 19:24:14,842 ERROR [Errno 32] Broken pipe +2023-11-18 19:24:14,849 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file + self.conn.send(b'sb') +BrokenPipeError: [Errno 32] Broken pipe + +2023-11-18 19:24:14,850 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:33:47,379 INFO Initializing Server... +2023-11-19 16:33:47,380 INFO Initializing ASR Service... +2023-11-19 16:33:49,060 INFO Initializing ChatGPT Service... +2023-11-19 16:33:49,061 INFO chatGPT prompt: paimon35.txt +2023-11-19 16:33:49,146 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 16:33:49,506 INFO you have your own api key. Great. +2023-11-19 16:33:49,682 INFO API Chatbot initialized. +2023-11-19 16:33:49,682 INFO Initializing TTS Service for character_paimon... +2023-11-19 16:33:50,374 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-19 16:33:50,382 INFO Initializing Sentiment Engine... +2023-11-19 16:33:51,784 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:34:51,579 INFO Connected by ('100.67.8.121', 58508) +2023-11-19 16:35:18,809 ERROR [Errno 54] Connection reset by peer +2023-11-19 16:35:18,811 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen + file = self.__receive_file() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file + data = self.conn.recv(1024) + ^^^^^^^^^^^^^^^^^^^^ +ConnectionResetError: [Errno 54] Connection reset by peer + +2023-11-19 16:35:18,812 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:35:24,069 INFO Connected by ('100.67.8.121', 58530) +2023-11-19 16:35:28,394 INFO WAV file received and saved. +2023-11-19 16:35:37,126 INFO ASR Result: ['你好啊']. time used 0.23. +2023-11-19 16:35:43,058 INFO VITS Synth Done, time used 3.34 +2023-11-19 16:35:43,086 INFO Sentiment Engine Infer: 0 +2023-11-19 16:35:43,592 INFO WAV SENT, size 564271 +2023-11-19 16:35:54,331 INFO WAV file received and saved. +2023-11-19 16:35:54,653 INFO ASR Result: ['你是谁呀']. time used 0.30. +2023-11-19 16:35:59,976 INFO VITS Synth Done, time used 2.77 +2023-11-19 16:36:00,001 INFO Sentiment Engine Infer: 0 +2023-11-19 16:36:00,507 INFO WAV SENT, size 527407 diff --git a/utils/__pycache__/FlushingFileHandler.cpython-311.pyc b/utils/__pycache__/FlushingFileHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b673b435cfdbc1cc8b9d00cd83ce1878801fdcf GIT binary patch literal 2045 zcmbUiO-v(Y^nLTwPT47CrIKnmuwa%<;%=?$CRU9~g1{QL9Eciva8f&8*&#!V-#3*l zsYwqcvV;UoG>d!UU=YJ)k0zctdZU{r+f2gAlb*U^4`ffiZ-$m1i!r{BzIkun-#71% zpQF(pK!}y6=!^vLhhW;Eo)AalNIV1!EaE^mc#7w0Byhfd{+mP46Ga+!&I=u8+vi%3UbAo_tk1ecsjcaYrcu-j)OotIE0 zRjDdhl^q3j@fQGrs#*mTGZ%mbcqfuEWKZSgMZAb+ns(84P1B1MN^BwLx|A7VPvO)l zcv=CkT+A&{Pgy8g)YE7&U$XF1Jk_F3uEHYd)r**B-pO%pnmmmBkPo#NcaooS%6PKk z-b+r}?o|29ChO)0IGxKHcmKKs_*LHZaOR8=zR+xrvmj}BE+qV~i z`Rj;|YjCJVAB5M#PqoAoEwPo@erq@J_;y`OH?;JDmTtZ>ysE7CuHrdDeaLrmgN(?V zUxmMr_&B^Px?bw5zsqMfIv%PL;@&h$r&m6)fvHa3LH z9ZDAsnThfALX751%wjQQxJcm8P>uEBll3E7PIN1s@Gp#c1<`5QHuN=p^Rv1(*w6+K zw8567M24Gs-^SgwyIa@m`n86B?V$a4d>9*OffN}&MTdId`p296!Swp{>hxuH=%A&d z+41o)7gzr2<#*w?TVrp^`zeC>TuXEY^H)?nKb97;q#Z2nUZ=db;Tx$cT{56B-_hG{ zFBSB83Ktu~l9y3Xhcp9Iq7fH<4nZ zjXct0D4tSUq(x6%Vm8jcKhdFJ6`WL;C4AMwNnwYA!p8As_nB+w`0o_ai9kH1~l(+xd+pr>0h zYWpTWdM1pY3v~MKQVQ#PsmvGft9ZTdQe!cBKclbOiiCd36PHXts@ z9@E4vSat-ho90*LoD)d={p5E#6It=1Ckru89mg~c5{!k|2_FWz6KjSEB$|s;MA-lB z(~=~01RMGi6bh->?p;uyq+(9~4KeYxeq2NK!q^0JVwFoJ&IVB6T{-g)%Gde@0t+$7 zFSPf9kAI(yA}cPYyN3Mq~@O{T&ek|73w8;t$(7e(Z;Jco(aM8E>b`6 E-=o98`2YX_ literal 0 HcmV?d00001 diff --git a/utils/__pycache__/__init__.cpython-311.pyc b/utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5855b519b522fecc41aa2429ddd41c7dcc3d8c93 GIT binary patch literal 171 zcmZ3^%ge<81pK8QsUZ3>h=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%T7PEIJKx) zzp^Al-#xR$qcln1B{My;xwN<>KUcrBBr~U2KR!M)FS8^* pUaz3?7l%!5eoARhs$CH)&^VBV#r#0x12ZEd;|B&9QN#=s0|0$|DBb`7 literal 0 HcmV?d00001 From be8f301abbc5ccda01fbf0c0b95c52e90a946e5d Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 19 Nov 2023 17:02:00 +0800 Subject: [PATCH 11/17] remove history --- .history/GPT/GPTService_20231106211946.py | 127 ------------- .history/GPT/GPTService_20231106232125.py | 125 ------------- .history/GPT/GPTService_20231106233755.py | 125 ------------- .history/GPT/GPTService_20231107005410.py | 124 ------------- .history/GPT/GPTService_20231107010143.py | 124 ------------- .history/GPT/GPTService_20231107010217.py | 124 ------------- .history/GPT/GPTService_20231119162925.py | 106 ----------- .history/SocketServer_20231106140934.py | 203 --------------------- .history/SocketServer_20231106145512.py | 203 --------------------- .history/TTS/TTService_20231106140934.py | 62 ------- .history/TTS/TTService_20231106142808.py | 62 ------- .history/TTS/TTService_20231106143302.py | 62 ------- .history/TTS/TTService_20231106145859.py | 62 ------- .history/TTS/TTService_20231106150025.py | 62 ------- .history/TTS/TTService_20231106164111.py | 58 ------ .history/TTS/TTService_20231106164221.py | 58 ------ GPT/GPTService.py | 2 +- GPT/__pycache__/GPTService.cpython-311.pyc | Bin 6431 -> 6431 bytes log.log | 90 +++++++++ log_async.log | 90 +++++++++ 20 files changed, 181 insertions(+), 1688 deletions(-) delete mode 100644 .history/GPT/GPTService_20231106211946.py delete mode 100644 .history/GPT/GPTService_20231106232125.py delete mode 100644 .history/GPT/GPTService_20231106233755.py delete mode 100644 .history/GPT/GPTService_20231107005410.py delete mode 100644 .history/GPT/GPTService_20231107010143.py delete mode 100644 .history/GPT/GPTService_20231107010217.py delete mode 100644 .history/GPT/GPTService_20231119162925.py delete mode 100644 .history/SocketServer_20231106140934.py delete mode 100644 .history/SocketServer_20231106145512.py delete mode 100644 .history/TTS/TTService_20231106140934.py delete mode 100644 .history/TTS/TTService_20231106142808.py delete mode 100644 .history/TTS/TTService_20231106143302.py delete mode 100644 .history/TTS/TTService_20231106145859.py delete mode 100644 .history/TTS/TTService_20231106150025.py delete mode 100644 .history/TTS/TTService_20231106164111.py delete mode 100644 .history/TTS/TTService_20231106164221.py diff --git a/.history/GPT/GPTService_20231106211946.py b/.history/GPT/GPTService_20231106211946.py deleted file mode 100644 index d67a668..0000000 --- a/.history/GPT/GPTService_20231106211946.py +++ /dev/null @@ -1,127 +0,0 @@ -import logging -import os -import time - -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr)) - - #dest_lang: EN, zh-CN - def _translate(self, input_text, dest_lang): - print("translate--> input:" + str(input_text)) - URL = "https://translation.googleapis.com/language/translate/v2" - target = dest_lang - key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" - q = input_text - params = {'target': target, 'key': key, 'q': q} - - r = requests.get(url=URL, params=params) - data = r.json() - - translated_text = data['data']['translations'][0]['translatedText'] - print("translate -> translated:" + translated_text) - return translated_text - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://83.238.173.42:40530/v1/chat/completions" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - text = self._translate(text, "EN") - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._translate(prev_text, "zh-CN") - print("--->translated:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() diff --git a/.history/GPT/GPTService_20231106232125.py b/.history/GPT/GPTService_20231106232125.py deleted file mode 100644 index 0ea9869..0000000 --- a/.history/GPT/GPTService_20231106232125.py +++ /dev/null @@ -1,125 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr)) - - #dest_lang: EN, zh-CN - def _translate(self, input_text, dest_lang): - print("translate--> input:" + str(input_text)) - URL = "https://translation.googleapis.com/language/translate/v2" - target = dest_lang - key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" - q = input_text - params = {'target': target, 'key': key, 'q': q} - - r = requests.get(url=URL, params=params) - data = r.json() - - translated_text = data['data']['translations'][0]['translatedText'] - print("translate -> translated:" + translated_text) - return translated_text - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41874/v1/chat/completions" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - text = self._translate(text, "EN") - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._translate(prev_text, "zh-CN") - print("--->translated:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231106233755.py b/.history/GPT/GPTService_20231106233755.py deleted file mode 100644 index 8e8942d..0000000 --- a/.history/GPT/GPTService_20231106233755.py +++ /dev/null @@ -1,125 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr)) - - #dest_lang: EN, zh-CN - def _translate(self, input_text, dest_lang): - print("translate--> input:" + str(input_text)) - URL = "https://translation.googleapis.com/language/translate/v2" - target = dest_lang - key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" - q = input_text - params = {'target': target, 'key': key, 'q': q} - - r = requests.get(url=URL, params=params) - data = r.json() - - translated_text = data['data']['translations'][0]['translatedText'] - print("translate -> translated:" + translated_text) - return translated_text - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41874/v1/" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - text = self._translate(text, "EN") - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._translate(prev_text, "zh-CN") - print("--->translated:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231107005410.py b/.history/GPT/GPTService_20231107005410.py deleted file mode 100644 index f7abe13..0000000 --- a/.history/GPT/GPTService_20231107005410.py +++ /dev/null @@ -1,124 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字, .,?:"!以外的其他字符 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027]', desstr, re.UNICODE)) - #dest_lang: EN, zh-CN - def _translate(self, input_text, dest_lang): - print("translate--> input:" + str(input_text)) - URL = "https://translation.googleapis.com/language/translate/v2" - target = dest_lang - key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" - q = input_text - params = {'target': target, 'key': key, 'q': q} - - r = requests.get(url=URL, params=params) - data = r.json() - - translated_text = data['data']['translations'][0]['translatedText'] - print("translate -> translated:" + translated_text) - return translated_text - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - text = self._translate(text, "EN") - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._translate(prev_text, "zh-CN") - print("--->translated:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231107010143.py b/.history/GPT/GPTService_20231107010143.py deleted file mode 100644 index 265e589..0000000 --- a/.history/GPT/GPTService_20231107010143.py +++ /dev/null @@ -1,124 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) -,。?:“! #dest_lang: EN, zh-CN - def _translate(self, input_text, dest_lang): - print("translate--> input:" + str(input_text)) - URL = "https://translation.googleapis.com/language/translate/v2" - target = dest_lang - key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" - q = input_text - params = {'target': target, 'key': key, 'q': q} - - r = requests.get(url=URL, params=params) - data = r.json() - - translated_text = data['data']['translations'][0]['translatedText'] - print("translate -> translated:" + translated_text) - return translated_text - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - text = self._translate(text, "EN") - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._translate(prev_text, "zh-CN") - print("--->translated:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231107010217.py b/.history/GPT/GPTService_20231107010217.py deleted file mode 100644 index be00376..0000000 --- a/.history/GPT/GPTService_20231107010217.py +++ /dev/null @@ -1,124 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) - - def _translate(self, input_text, dest_lang): - print("translate--> input:" + str(input_text)) - URL = "https://translation.googleapis.com/language/translate/v2" - target = dest_lang - key = "AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4" - q = input_text - params = {'target': target, 'key': key, 'q': q} - - r = requests.get(url=URL, params=params) - data = r.json() - - translated_text = data['data']['translations'][0]['translatedText'] - print("translate -> translated:" + translated_text) - return translated_text - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - text = self._translate(text, "EN") - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._translate(prev_text, "zh-CN") - print("--->translated:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231119162925.py b/.history/GPT/GPTService_20231119162925.py deleted file mode 100644 index a9dc188..0000000 --- a/.history/GPT/GPTService_20231119162925.py +++ /dev/null @@ -1,106 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/SocketServer_20231106140934.py b/.history/SocketServer_20231106140934.py deleted file mode 100644 index 76ddab1..0000000 --- a/.history/SocketServer_20231106140934.py +++ /dev/null @@ -1,203 +0,0 @@ -import argparse -import os -import socket -import time -import logging -import traceback -from logging.handlers import TimedRotatingFileHandler - -import librosa -import requests -import revChatGPT -import soundfile - -import GPT.tune -from utils.FlushingFileHandler import FlushingFileHandler -from ASR import ASRService -from GPT import GPTService -from TTS import TTService -from SentimentEngine import SentimentEngine - -console_logger = logging.getLogger() -console_logger.setLevel(logging.INFO) -FORMAT = '%(asctime)s %(levelname)s %(message)s' -console_handler = console_logger.handlers[0] -console_handler.setFormatter(logging.Formatter(FORMAT)) -console_logger.setLevel(logging.INFO) -file_handler = FlushingFileHandler("log.log", formatter=logging.Formatter(FORMAT)) -file_handler.setFormatter(logging.Formatter(FORMAT)) -file_handler.setLevel(logging.INFO) -console_logger.addHandler(file_handler) -console_logger.addHandler(console_handler) - - -def str2bool(v): - if v.lower() in ('yes', 'true', 't', 'y', '1'): - return True - elif v.lower() in ('no', 'false', 'f', 'n', '0'): - return False - else: - raise argparse.ArgumentTypeError('Unsupported value encountered.') - -def parse_args(): - parser = argparse.ArgumentParser() - parser.add_argument("--chatVer", type=int, nargs='?', required=True) - parser.add_argument("--APIKey", type=str, nargs='?', required=False) - parser.add_argument("--email", type=str, nargs='?', required=False) - parser.add_argument("--password", type=str, nargs='?', required=False) - parser.add_argument("--accessToken", type=str, nargs='?', required=False) - parser.add_argument("--proxy", type=str, nargs='?', required=False) - parser.add_argument("--paid", type=str2bool, nargs='?', required=False) - parser.add_argument("--model", type=str, nargs='?', required=False) - parser.add_argument("--stream", type=str2bool, nargs='?', required=True) - parser.add_argument("--character", type=str, nargs='?', required=True) - parser.add_argument("--ip", type=str, nargs='?', required=False) - parser.add_argument("--brainwash", type=str2bool, nargs='?', required=False) - return parser.parse_args() - - -class Server(): - def __init__(self, args): - # SERVER STUFF - self.addr = None - self.conn = None - logging.info('Initializing Server...') - self.host = "0.0.0.0"# 所有地址上面监听 - self.port = 38438 - self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) - self.s.bind((self.host, self.port)) - self.tmp_recv_file = 'tmp/server_received.wav' - self.tmp_proc_file = 'tmp/server_processed.wav' - - ## hard coded character map - self.char_name = { - 'paimon': ['TTS/models/paimon6k.json', 'TTS/models/paimon6k_390k.pth', 'character_paimon', 1], - 'yunfei': ['TTS/models/yunfeimix2.json', 'TTS/models/yunfeimix2_53k.pth', 'character_yunfei', 1.1], - 'catmaid': ['TTS/models/catmix.json', 'TTS/models/catmix_107k.pth', 'character_catmaid', 1.2] - - } - - # PARAFORMER - self.paraformer = ASRService.ASRService('./ASR/resources/config.yaml') - - # CHAT GPT - self.chat_gpt = GPTService.GPTService(args) - - # TTS - self.tts = TTService.TTService(*self.char_name[args.character]) - - # Sentiment Engine - self.sentiment = SentimentEngine.SentimentEngine('SentimentEngine/models/paimon_sentiment.onnx') - - def listen(self): - # MAIN SERVER LOOP - while True: - self.s.listen() - logging.info(f"Server is listening on {self.host}:{self.port}...") - self.conn, self.addr = self.s.accept() - logging.info(f"Connected by {self.addr}") - self.conn.sendall(b'%s' % self.char_name[args.character][2].encode()) - while True: - try: - file = self.__receive_file() - # print('file received: %s' % file) - with open(self.tmp_recv_file, 'wb') as f: - f.write(file) - logging.info('WAV file received and saved.') - ask_text = self.process_voice() - if args.stream: - for sentence in self.chat_gpt.ask_stream(ask_text): - self.send_voice(sentence) - self.notice_stream_end() - logging.info('Stream finished.') - else: - resp_text = self.chat_gpt.ask(ask_text) - self.send_voice(resp_text) - self.notice_stream_end() - except revChatGPT.typings.APIConnectionError as e: - logging.error(e.__str__()) - logging.info('API rate limit exceeded, sending: %s' % GPT.tune.exceed_reply) - self.send_voice(GPT.tune.exceed_reply, 2) - self.notice_stream_end() - except revChatGPT.typings.Error as e: - logging.error(e.__str__()) - logging.info('Something wrong with OPENAI, sending: %s' % GPT.tune.error_reply) - self.send_voice(GPT.tune.error_reply, 1) - self.notice_stream_end() - except requests.exceptions.RequestException as e: - logging.error(e.__str__()) - logging.info('Something wrong with internet, sending: %s' % GPT.tune.error_reply) - self.send_voice(GPT.tune.error_reply, 1) - self.notice_stream_end() - except Exception as e: - logging.error(e.__str__()) - logging.error(traceback.format_exc()) - break - - def notice_stream_end(self): - time.sleep(0.5) - self.conn.sendall(b'stream_finished') - - def send_voice(self, resp_text, senti_or = None): - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - with open(self.tmp_proc_file, 'rb') as f: - senddata = f.read() - if senti_or: - senti = senti_or - else: - senti = self.sentiment.infer(resp_text) - senddata += b'?!' - senddata += b'%i' % senti - self.conn.sendall(senddata) - time.sleep(0.5) - logging.info('WAV SENT, size %i' % len(senddata)) - - def __receive_file(self): - file_data = b'' - while True: - data = self.conn.recv(1024) - # print(data) - self.conn.send(b'sb') - if data[-2:] == b'?!': - file_data += data[0:-2] - break - if not data: - # logging.info('Waiting for WAV...') - continue - file_data += data - - return file_data - - def fill_size_wav(self): - with open(self.tmp_recv_file, "r+b") as f: - # Get the size of the file - size = os.path.getsize(self.tmp_recv_file) - 8 - # Write the size of the file to the first 4 bytes - f.seek(4) - f.write(size.to_bytes(4, byteorder='little')) - f.seek(40) - f.write((size - 28).to_bytes(4, byteorder='little')) - f.flush() - - def process_voice(self): - # stereo to mono - self.fill_size_wav() - y, sr = librosa.load(self.tmp_recv_file, sr=None, mono=False) - y_mono = librosa.to_mono(y) - y_mono = librosa.resample(y_mono, orig_sr=sr, target_sr=16000) - soundfile.write(self.tmp_recv_file, y_mono, 16000) - text = self.paraformer.infer(self.tmp_recv_file) - - return text - - -if __name__ == '__main__': - try: - args = parse_args() - s = Server(args) - s.listen() - except Exception as e: - logging.error(e.__str__()) - logging.error(traceback.format_exc()) - raise e diff --git a/.history/SocketServer_20231106145512.py b/.history/SocketServer_20231106145512.py deleted file mode 100644 index b27929f..0000000 --- a/.history/SocketServer_20231106145512.py +++ /dev/null @@ -1,203 +0,0 @@ -import argparse -import os -import socket -import time -import logging -import traceback -from logging.handlers import TimedRotatingFileHandler - -import librosa -import requests -import revChatGPT -import soundfile - -import GPT.tune -from utils.FlushingFileHandler import FlushingFileHandler -from ASR import ASRService -from GPT import GPTService -from TTS import TTService -from SentimentEngine import SentimentEngine - -console_logger = logging.getLogger() -console_logger.setLevel(logging.INFO) -FORMAT = '%(asctime)s %(levelname)s %(message)s' -console_handler = console_logger.handlers[0] -console_handler.setFormatter(logging.Formatter(FORMAT)) -console_logger.setLevel(logging.INFO) -file_handler = FlushingFileHandler("log.log", formatter=logging.Formatter(FORMAT)) -file_handler.setFormatter(logging.Formatter(FORMAT)) -file_handler.setLevel(logging.INFO) -console_logger.addHandler(file_handler) -console_logger.addHandler(console_handler) - - -def str2bool(v): - if v.lower() in ('yes', 'true', 't', 'y', '1'): - return True - elif v.lower() in ('no', 'false', 'f', 'n', '0'): - return False - else: - raise argparse.ArgumentTypeError('Unsupported value encountered.') - -def parse_args(): - parser = argparse.ArgumentParser() - parser.add_argument("--chatVer", type=int, nargs='?', required=True) - parser.add_argument("--APIKey", type=str, nargs='?', required=False) - parser.add_argument("--email", type=str, nargs='?', required=False) - parser.add_argument("--password", type=str, nargs='?', required=False) - parser.add_argument("--accessToken", type=str, nargs='?', required=False) - parser.add_argument("--proxy", type=str, nargs='?', required=False) - parser.add_argument("--paid", type=str2bool, nargs='?', required=False) - parser.add_argument("--model", type=str, nargs='?', required=False) - parser.add_argument("--stream", type=str2bool, nargs='?', required=True) - parser.add_argument("--character", type=str, nargs='?', required=True) - parser.add_argument("--ip", type=str, nargs='?', required=False) - parser.add_argument("--brainwash", type=str2bool, nargs='?', required=False) - return parser.parse_args() - - -class Server(): - def __init__(self, args): - # SERVER STUFF - self.addr = None - self.conn = None - logging.info('Initializing Server...') - self.host = "0.0.0.0"# 所有地址上面监听 - self.port = 38438 - self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024000) - self.s.bind((self.host, self.port)) - self.tmp_recv_file = 'tmp/server_received.wav' - self.tmp_proc_file = 'tmp/server_processed.wav' - - ## hard coded character map - self.char_name = { - 'paimon': ['TTS/models/paimon6k.json', 'TTS/models/paimon6k_390k.pth', 'character_paimon', 1], - 'yunfei': ['TTS/models/yunfeimix2.json', 'TTS/models/yunfeimix2_53k.pth', 'character_yunfei', 1.1], - 'catmaid': ['TTS/models/catmix.json', 'TTS/models/catmix_107k.pth', 'character_catmaid', 1.2] - - } - - # PARAFORMER - self.paraformer = ASRService.ASRService('./ASR/resources/config.yaml') - - # CHAT GPT - self.chat_gpt = GPTService.GPTService(args) - - # TTS - self.tts = TTService.TTService(*self.char_name[args.character]) - - # Sentiment Engine - self.sentiment = SentimentEngine.SentimentEngine('SentimentEngine/models/paimon_sentiment.onnx') - - def listen(self): - # MAIN SERVER LOOP - while True: - self.s.listen() - logging.info(f"Server is listening on {self.host}:{self.port}...") - self.conn, self.addr = self.s.accept() - logging.info(f"Connected by {self.addr}") - self.conn.sendall(b'%s' % self.char_name[args.character][2].encode()) - while True: - try: - file = self.__receive_file() - # print('file received: %s' % file) - with open(self.tmp_recv_file, 'wb') as f: - f.write(file) - logging.info('WAV file received and saved.') - ask_text = self.process_voice() - if args.stream: - for sentence in self.chat_gpt.ask_stream(ask_text): - self.send_voice(sentence) - self.notice_stream_end() - logging.info('Stream finished.') - else: - resp_text = self.chat_gpt.ask(ask_text) - self.send_voice(resp_text) - self.notice_stream_end() - except revChatGPT.typings.APIConnectionError as e: - logging.error(e.__str__()) - logging.info('API rate limit exceeded, sending: %s' % GPT.tune.exceed_reply) - self.send_voice(GPT.tune.exceed_reply, 2) - self.notice_stream_end() - except revChatGPT.typings.Error as e: - logging.error(e.__str__()) - logging.info('Something wrong with OPENAI, sending: %s' % GPT.tune.error_reply) - self.send_voice(GPT.tune.error_reply, 1) - self.notice_stream_end() - except requests.exceptions.RequestException as e: - logging.error(e.__str__()) - logging.info('Something wrong with internet, sending: %s' % GPT.tune.error_reply) - self.send_voice(GPT.tune.error_reply, 1) - self.notice_stream_end() - except Exception as e: - logging.error(e.__str__()) - logging.error(traceback.format_exc()) - break - - def notice_stream_end(self): - time.sleep(0.5) - self.conn.sendall(b'stream_finished') - - def send_voice(self, resp_text, senti_or = None): - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - with open(self.tmp_proc_file, 'rb') as f: - senddata = f.read() - if senti_or: - senti = senti_or - else: - senti = self.sentiment.infer(resp_text) - senddata += b'?!' - senddata += b'%i' % senti - self.conn.sendall(senddata) - time.sleep(0.5) - logging.info('WAV SENT, size %i' % len(senddata)) - - def __receive_file(self): - file_data = b'' - while True: - data = self.conn.recv(1024) - # print(data) - self.conn.send(b'sb') - if data[-2:] == b'?!': - file_data += data[0:-2] - break - if not data: - # logging.info('Waiting for WAV...') - continue - file_data += data - - return file_data - - def fill_size_wav(self): - with open(self.tmp_recv_file, "r+b") as f: - # Get the size of the file - size = os.path.getsize(self.tmp_recv_file) - 8 - # Write the size of the file to the first 4 bytes - f.seek(4) - f.write(size.to_bytes(4, byteorder='little')) - f.seek(40) - f.write((size - 28).to_bytes(4, byteorder='little')) - f.flush() - - def process_voice(self): - # stereo to mono - self.fill_size_wav() - y, sr = librosa.load(self.tmp_recv_file, sr=None, mono=False) - y_mono = librosa.to_mono(y) - y_mono = librosa.resample(y_mono, orig_sr=sr, target_sr=16000) - soundfile.write(self.tmp_recv_file, y_mono, 16000) - text = self.paraformer.infer(self.tmp_recv_file) - - return text - - -if __name__ == '__main__': - try: - args = parse_args() - s = Server(args) - s.listen() - except Exception as e: - logging.error(e.__str__()) - logging.error(traceback.format_exc()) - raise e diff --git a/.history/TTS/TTService_20231106140934.py b/.history/TTS/TTService_20231106140934.py deleted file mode 100644 index 18e6de0..0000000 --- a/.history/TTS/TTService_20231106140934.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) - - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).cuda() - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.cuda().unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) - - - - diff --git a/.history/TTS/TTService_20231106142808.py b/.history/TTS/TTService_20231106142808.py deleted file mode 100644 index 2bc92ff..0000000 --- a/.history/TTS/TTService_20231106142808.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) - - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).cpu() - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.cuda().unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) - - - - diff --git a/.history/TTS/TTService_20231106143302.py b/.history/TTS/TTService_20231106143302.py deleted file mode 100644 index 98a0f47..0000000 --- a/.history/TTS/TTService_20231106143302.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) -device = torch.device("mps") - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).to(device) - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.cuda().unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) - - - - diff --git a/.history/TTS/TTService_20231106145859.py b/.history/TTS/TTService_20231106145859.py deleted file mode 100644 index 13a90db..0000000 --- a/.history/TTS/TTService_20231106145859.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) -device = torch.device("mps") - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).to(device) - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.to(device).unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) - - - - diff --git a/.history/TTS/TTService_20231106150025.py b/.history/TTS/TTService_20231106150025.py deleted file mode 100644 index 72b224e..0000000 --- a/.history/TTS/TTService_20231106150025.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) -device = torch.device("mps") - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).to(device) - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.to(device).unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).to(device) - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) - - - - diff --git a/.history/TTS/TTService_20231106164111.py b/.history/TTS/TTService_20231106164111.py deleted file mode 100644 index 752fd4a..0000000 --- a/.history/TTS/TTService_20231106164111.py +++ /dev/null @@ -1,58 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) - - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).cpu() - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.cuda().unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) \ No newline at end of file diff --git a/.history/TTS/TTService_20231106164221.py b/.history/TTS/TTService_20231106164221.py deleted file mode 100644 index 8564e6d..0000000 --- a/.history/TTS/TTService_20231106164221.py +++ /dev/null @@ -1,58 +0,0 @@ -import sys -import time - -sys.path.append('TTS/vits') - -import soundfile -import os -os.environ["PYTORCH_JIT"] = "0" -import torch - -import TTS.vits.commons as commons -import TTS.vits.utils as utils - -from TTS.vits.models import SynthesizerTrn -from TTS.vits.text.symbols import symbols -from TTS.vits.text import text_to_sequence - -import logging -logging.getLogger().setLevel(logging.INFO) -logging.basicConfig(level=logging.INFO) - - -def get_text(text, hps): - text_norm = text_to_sequence(text, hps.data.text_cleaners) - if hps.data.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - -class TTService(): - def __init__(self, cfg, model, char, speed): - logging.info('Initializing TTS Service for %s...' % char) - self.hps = utils.get_hparams_from_file(cfg) - self.speed = speed - self.net_g = SynthesizerTrn( - len(symbols), - self.hps.data.filter_length // 2 + 1, - self.hps.train.segment_size // self.hps.data.hop_length, - **self.hps.model).cpu() - _ = self.net_g.eval() - _ = utils.load_checkpoint(model, self.net_g, None) - - def read(self, text): - text = text.replace('~', '!') - stn_tst = get_text(text, self.hps) - with torch.no_grad(): - x_tst = stn_tst.cpu().unsqueeze(0) - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cpu() - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - 0, 0].data.cpu().float().numpy() - return audio - - def read_save(self, text, filename, sr): - stime = time.time() - au = self.read(text) - soundfile.write(filename, au, sr) - logging.info('VITS Synth Done, time used %.2f' % (time.time() - stime)) \ No newline at end of file diff --git a/GPT/GPTService.py b/GPT/GPTService.py index a9dc188..77f1699 100644 --- a/GPT/GPTService.py +++ b/GPT/GPTService.py @@ -54,7 +54,7 @@ def __init__(self, args): #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=2048) + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) logging.info('API Chatbot initialized.') def ask(self, text): diff --git a/GPT/__pycache__/GPTService.cpython-311.pyc b/GPT/__pycache__/GPTService.cpython-311.pyc index e71328d09bf4e065abedfa14cc7a28584b33b62f..07d3be93985c2e06322f11e5b46b5496c2ce1e19 100644 GIT binary patch delta 46 zcmbPlG~bAKIWI340}%W;8<{$BBkyw#rUtvs-#E;ex$-Ya7hIGsxFTJ!*^K8U4*+OC B5MKZQ delta 46 zcmbPlG~bAKIWI340}!Mhk4&Agk@q + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 85, in __init__ + self.chat_gpt = GPTService.GPTService(args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 57, in __init__ + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=512) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 124, in __init__ + raise t.ActionRefuseError("System prompt is too long") +revChatGPT.typings.ActionRefuseError: System prompt is too long +The current operation is not allowed, which may be intentional +Please check that the input is correct, or you can resolve this issue by filing an issue +Project URL: https://github.com/acheong08/ChatGPT + +2023-11-19 16:58:07,734 INFO Initializing Server... +2023-11-19 16:58:07,734 INFO Initializing ASR Service... +2023-11-19 16:58:09,069 INFO Initializing ChatGPT Service... +2023-11-19 16:58:09,070 INFO chatGPT prompt: paimon35.txt +2023-11-19 16:58:09,123 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 16:58:09,301 INFO you have your own api key. Great. +2023-11-19 16:58:09,469 INFO API Chatbot initialized. +2023-11-19 16:58:09,469 INFO Initializing TTS Service for character_paimon... +2023-11-19 16:58:10,197 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-19 16:58:10,207 INFO Initializing Sentiment Engine... +2023-11-19 16:58:11,357 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:58:19,222 INFO Connected by ('100.67.8.121', 58740) +2023-11-19 16:58:22,810 INFO WAV file received and saved. +2023-11-19 16:58:25,246 INFO ASR Result: ['你好啊啊']. time used 0.28. +2023-11-19 16:58:26,700 ERROR 400 Bad Request { + "error": { + "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", + "type": "invalid_request_error", + "param": "messages", + "code": "context_length_exceeded" + } +} + +2023-11-19 16:58:26,701 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-19 16:58:30,308 INFO VITS Synth Done, time used 3.61 +2023-11-19 16:58:30,818 INFO WAV SENT, size 592431 +2023-11-19 16:59:44,439 INFO Initializing Server... +2023-11-19 16:59:44,439 ERROR [Errno 48] Address already in use +2023-11-19 16:59:44,440 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-19 17:00:18,236 INFO Initializing Server... +2023-11-19 17:00:18,236 INFO Initializing ASR Service... +2023-11-19 17:00:19,749 INFO Initializing ChatGPT Service... +2023-11-19 17:00:19,750 INFO chatGPT prompt: paimon35.txt +2023-11-19 17:00:19,812 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 17:00:19,987 INFO you have your own api key. Great. +2023-11-19 17:00:20,143 INFO API Chatbot initialized. +2023-11-19 17:00:20,143 INFO Initializing TTS Service for character_paimon... +2023-11-19 17:00:20,806 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-19 17:00:20,814 INFO Initializing Sentiment Engine... +2023-11-19 17:00:22,037 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 17:00:25,242 INFO Connected by ('100.67.8.121', 58762) +2023-11-19 17:00:28,937 INFO WAV file received and saved. +2023-11-19 17:00:30,665 INFO ASR Result: ['你是谁呀']. time used 0.35. +2023-11-19 17:00:31,657 ERROR 400 Bad Request { + "error": { + "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", + "type": "invalid_request_error", + "param": "messages", + "code": "context_length_exceeded" + } +} + +2023-11-19 17:00:31,658 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-19 17:00:35,172 INFO VITS Synth Done, time used 3.51 +2023-11-19 17:00:35,681 INFO WAV SENT, size 585263 diff --git a/log_async.log b/log_async.log index 08dcbe8..1703a7e 100644 --- a/log_async.log +++ b/log_async.log @@ -1201,3 +1201,93 @@ ConnectionResetError: [Errno 54] Connection reset by peer 2023-11-19 16:35:59,976 INFO VITS Synth Done, time used 2.77 2023-11-19 16:36:00,001 INFO Sentiment Engine Infer: 0 2023-11-19 16:36:00,507 INFO WAV SENT, size 527407 +2023-11-19 16:56:41,529 INFO Initializing Server... +2023-11-19 16:56:41,530 INFO Initializing ASR Service... +2023-11-19 16:56:43,373 INFO Initializing ChatGPT Service... +2023-11-19 16:56:43,373 INFO chatGPT prompt: paimon35.txt +2023-11-19 16:56:43,448 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 16:56:43,725 INFO you have your own api key. Great. +2023-11-19 16:56:43,895 ERROR System prompt is too long +2023-11-19 16:56:43,905 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 85, in __init__ + self.chat_gpt = GPTService.GPTService(args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 57, in __init__ + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=512) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 124, in __init__ + raise t.ActionRefuseError("System prompt is too long") +revChatGPT.typings.ActionRefuseError: System prompt is too long +The current operation is not allowed, which may be intentional +Please check that the input is correct, or you can resolve this issue by filing an issue +Project URL: https://github.com/acheong08/ChatGPT + +2023-11-19 16:58:07,734 INFO Initializing Server... +2023-11-19 16:58:07,734 INFO Initializing ASR Service... +2023-11-19 16:58:09,069 INFO Initializing ChatGPT Service... +2023-11-19 16:58:09,070 INFO chatGPT prompt: paimon35.txt +2023-11-19 16:58:09,123 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 16:58:09,301 INFO you have your own api key. Great. +2023-11-19 16:58:09,469 INFO API Chatbot initialized. +2023-11-19 16:58:09,469 INFO Initializing TTS Service for character_paimon... +2023-11-19 16:58:10,197 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-19 16:58:10,207 INFO Initializing Sentiment Engine... +2023-11-19 16:58:11,357 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 16:58:19,222 INFO Connected by ('100.67.8.121', 58740) +2023-11-19 16:58:22,810 INFO WAV file received and saved. +2023-11-19 16:58:25,246 INFO ASR Result: ['你好啊啊']. time used 0.28. +2023-11-19 16:58:26,700 ERROR 400 Bad Request { + "error": { + "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", + "type": "invalid_request_error", + "param": "messages", + "code": "context_length_exceeded" + } +} + +2023-11-19 16:58:26,701 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-19 16:58:30,308 INFO VITS Synth Done, time used 3.61 +2023-11-19 16:58:30,818 INFO WAV SENT, size 592431 +2023-11-19 16:59:44,439 INFO Initializing Server... +2023-11-19 16:59:44,439 ERROR [Errno 48] Address already in use +2023-11-19 16:59:44,440 ERROR Traceback (most recent call last): + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in + s = Server(args) + ^^^^^^^^^^^^ + File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ + self.s.bind((self.host, self.port)) +OSError: [Errno 48] Address already in use + +2023-11-19 17:00:18,236 INFO Initializing Server... +2023-11-19 17:00:18,236 INFO Initializing ASR Service... +2023-11-19 17:00:19,749 INFO Initializing ChatGPT Service... +2023-11-19 17:00:19,750 INFO chatGPT prompt: paimon35.txt +2023-11-19 17:00:19,812 INFO machine identifier: 92:73:33:81:a7:50 +2023-11-19 17:00:19,987 INFO you have your own api key. Great. +2023-11-19 17:00:20,143 INFO API Chatbot initialized. +2023-11-19 17:00:20,143 INFO Initializing TTS Service for character_paimon... +2023-11-19 17:00:20,806 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) +2023-11-19 17:00:20,814 INFO Initializing Sentiment Engine... +2023-11-19 17:00:22,037 INFO Server is listening on 0.0.0.0:38438... +2023-11-19 17:00:25,242 INFO Connected by ('100.67.8.121', 58762) +2023-11-19 17:00:28,937 INFO WAV file received and saved. +2023-11-19 17:00:30,665 INFO ASR Result: ['你是谁呀']. time used 0.35. +2023-11-19 17:00:31,657 ERROR 400 Bad Request { + "error": { + "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", + "type": "invalid_request_error", + "param": "messages", + "code": "context_length_exceeded" + } +} + +2023-11-19 17:00:31,658 INFO API rate limit exceeded, sending: +你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 + +2023-11-19 17:00:35,172 INFO VITS Synth Done, time used 3.51 +2023-11-19 17:00:35,681 INFO WAV SENT, size 585263 From e4e162228f55ab217c23e9804b3cdebf9ba50f35 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 19 Nov 2023 17:36:33 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E6=94=AF=E6=8C=8116k=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .history/GPT/GPTService_20231119165727.py | 106 +++++++++++++++++++++ .history/GPT/GPTService_20231119173505.py | 106 +++++++++++++++++++++ GPT/GPTService.py | 2 +- GPT/__pycache__/GPTService.cpython-311.pyc | Bin 6431 -> 6468 bytes log.log | 17 ++++ log_async.log | 17 ++++ 6 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 .history/GPT/GPTService_20231119165727.py create mode 100644 .history/GPT/GPTService_20231119173505.py diff --git a/.history/GPT/GPTService_20231119165727.py b/.history/GPT/GPTService_20231119165727.py new file mode 100644 index 0000000..77f1699 --- /dev/null +++ b/.history/GPT/GPTService_20231119165727.py @@ -0,0 +1,106 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" + api_key = mach_id + self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231119173505.py b/.history/GPT/GPTService_20231119173505.py new file mode 100644 index 0000000..b746491 --- /dev/null +++ b/.history/GPT/GPTService_20231119173505.py @@ -0,0 +1,106 @@ +import logging +import os +import time +import GPT.machine_id +import GPT.tune as tune +import requests +import re + +class GPTService(): + #替换一些听起来不太顺畅的文字 + def _replace_str(self, desstr): + desstr = desstr.replace("!是派蒙!", "!我是派蒙!") + desstr = desstr.replace("Paimon", "派蒙") + desstr = desstr.replace("这是派蒙", "我是派蒙") + return desstr + + #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 + def _filter_str(self, desstr): + return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) + + def __init__(self, args): + logging.info('Initializing ChatGPT Service...') + self.chatVer = args.chatVer + self.tune = tune.get_tune(args.character, args.model) + self.counter = 0 + self.brainwash = args.brainwash + + if self.chatVer == 1: + from revChatGPT.V1 import Chatbot + config = {} + if args.accessToken: + logging.info('Try to login with access token.') + config['access_token'] = args.accessToken + else: + logging.info('Try to login with email and password.') + config['email'] = args.email + config['password'] = args.password + config['paid'] = args.paid + config['model'] = args.model + if type(args.proxy) == str: + config['proxy'] = args.proxy + + self.chatbot = Chatbot(config=config) + logging.info('WEB Chatbot initialized.') + + elif self.chatVer == 3: + mach_id = GPT.machine_id.get_machine_unique_identifier() + from revChatGPT.V3 import Chatbot + if args.APIKey: + logging.info('you have your own api key. Great.') + api_key = args.APIKey + else: + logging.info('using custom API proxy, with rate limit.') + #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" + os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" + api_key = mach_id + self.chatbot = Chatbot(engine=args.model, api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) + logging.info('API Chatbot initialized.') + + def ask(self, text): + print("--->ask text:" + text) + stime = time.time() + if self.chatVer == 3: + prev_text = self.chatbot.ask(text) + # V1 + elif self.chatVer == 1: + for data in self.chatbot.ask( + self.tune + '\n' + text + ): + prev_text = data["message"] + #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) + print("--->response:" + prev_text) + prev_text = self._filter_str(prev_text) + print("--->filterred:" + prev_text) + prev_text = self._replace_str(prev_text) + print("--->replaced:" + prev_text) + return prev_text + + def ask_stream(self, text): + prev_text = "" + complete_text = "" + stime = time.time() + if self.counter % 5 == 0 and self.chatVer == 1: + if self.brainwash: + logging.info('Brainwash mode activated, reinforce the tune.') + else: + logging.info('Injecting tunes') + asktext = self.tune + '\n' + text + else: + asktext = text + self.counter += 1 + for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): + message = data["message"][len(prev_text):] if self.chatVer == 1 else data + if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: + complete_text += message + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() + complete_text = "" + else: + complete_text += message + + prev_text = data["message"] if self.chatVer == 1 else data + + if complete_text.strip(): + logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) + yield complete_text.strip() \ No newline at end of file diff --git a/GPT/GPTService.py b/GPT/GPTService.py index 77f1699..b746491 100644 --- a/GPT/GPTService.py +++ b/GPT/GPTService.py @@ -54,7 +54,7 @@ def __init__(self, args): #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) + self.chatbot = Chatbot(engine=args.model, api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) logging.info('API Chatbot initialized.') def ask(self, text): diff --git a/GPT/__pycache__/GPTService.cpython-311.pyc b/GPT/__pycache__/GPTService.cpython-311.pyc index 07d3be93985c2e06322f11e5b46b5496c2ce1e19..1033976c2add6ed28bcf5c8d3797d0a6b136e8c0 100644 GIT binary patch delta 403 zcmbPlbi{~vIWI340}!0N7MZ$aBkwn6E_NV~8Hhj6+04u0$Hcg7atzyDZpJJ&kTMXM zY{4$i%F4j7nssvw`&>p&)>~|;dFh#XshfXs_%kvpPWIw5XMDQ3iEA#ShRPbP9qA`R z&O}{E&%Tmg@PUD$j?tM3NXfV`eFT$Vz~p8#o+>5*HK6H520-E#b7FCJk^1BVd`^rG zo0<8wS=nqra<-FAM0_;uK};*6k87FM!W$|NTTrfF??XEIw4P%x7NDTKX4#y{U9$z zW^$y6kER`nsR<&$8ni$xWe}kPBGf&6rbsa!VCm?Z)H#tAIASbmXHNGUZ zqNK Date: Sun, 19 Nov 2023 17:38:22 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E6=94=AF=E6=8C=8116k=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f31b5ba..8cb375e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.history/ /TTS/models/* /ASR/resources/models/* /SentimentEngine/models/* From c3cd485db83670c43481a16200faf94b9efad818 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 19 Nov 2023 17:40:00 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E6=94=AF=E6=8C=8116k=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8cb375e..8bb8e75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -/.history/ +/.history/* /TTS/models/* /ASR/resources/models/* /SentimentEngine/models/* From b73b7b257663f0db9e88054a9e28caead8266eb7 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 19 Nov 2023 17:42:39 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E6=94=AF=E6=8C=8116k=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .history/GPT/GPTService_20231119165727.py | 106 ---------------------- .history/GPT/GPTService_20231119173505.py | 106 ---------------------- 2 files changed, 212 deletions(-) delete mode 100644 .history/GPT/GPTService_20231119165727.py delete mode 100644 .history/GPT/GPTService_20231119173505.py diff --git a/.history/GPT/GPTService_20231119165727.py b/.history/GPT/GPTService_20231119165727.py deleted file mode 100644 index 77f1699..0000000 --- a/.history/GPT/GPTService_20231119165727.py +++ /dev/null @@ -1,106 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" - api_key = mach_id - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file diff --git a/.history/GPT/GPTService_20231119173505.py b/.history/GPT/GPTService_20231119173505.py deleted file mode 100644 index b746491..0000000 --- a/.history/GPT/GPTService_20231119173505.py +++ /dev/null @@ -1,106 +0,0 @@ -import logging -import os -import time -import GPT.machine_id -import GPT.tune as tune -import requests -import re - -class GPTService(): - #替换一些听起来不太顺畅的文字 - def _replace_str(self, desstr): - desstr = desstr.replace("!是派蒙!", "!我是派蒙!") - desstr = desstr.replace("Paimon", "派蒙") - desstr = desstr.replace("这是派蒙", "我是派蒙") - return desstr - - #过滤特殊字符, 过滤除中英文, 数字,半角(, .,?:"!),全角(,。?:“!)以外的其他字符,用于防止颜文字 - def _filter_str(self, desstr): - return ''.join(re.findall(u'[\u4e00-\u9fa5a-zA-Z0-9\u002E\u002C\u003B\u003A\u0022\u0021\u0020\u003F\u0027\uFF0C\u3002\uFF1F\uFF1A\u201C\uFF01]', desstr)) - - def __init__(self, args): - logging.info('Initializing ChatGPT Service...') - self.chatVer = args.chatVer - self.tune = tune.get_tune(args.character, args.model) - self.counter = 0 - self.brainwash = args.brainwash - - if self.chatVer == 1: - from revChatGPT.V1 import Chatbot - config = {} - if args.accessToken: - logging.info('Try to login with access token.') - config['access_token'] = args.accessToken - else: - logging.info('Try to login with email and password.') - config['email'] = args.email - config['password'] = args.password - config['paid'] = args.paid - config['model'] = args.model - if type(args.proxy) == str: - config['proxy'] = args.proxy - - self.chatbot = Chatbot(config=config) - logging.info('WEB Chatbot initialized.') - - elif self.chatVer == 3: - mach_id = GPT.machine_id.get_machine_unique_identifier() - from revChatGPT.V3 import Chatbot - if args.APIKey: - logging.info('you have your own api key. Great.') - api_key = args.APIKey - else: - logging.info('using custom API proxy, with rate limit.') - #os.environ['API_URL'] = "http://localhost:8000/v1/chat/completions" - os.environ['API_URL'] = "http://75.63.212.152:41841/v1/" - api_key = mach_id - self.chatbot = Chatbot(engine=args.model, api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=16000) - logging.info('API Chatbot initialized.') - - def ask(self, text): - print("--->ask text:" + text) - stime = time.time() - if self.chatVer == 3: - prev_text = self.chatbot.ask(text) - # V1 - elif self.chatVer == 1: - for data in self.chatbot.ask( - self.tune + '\n' + text - ): - prev_text = data["message"] - #logging.info('ChatGPT Response: %s, time used %.2f' % (prev_text, time.time() - stime)) - print("--->response:" + prev_text) - prev_text = self._filter_str(prev_text) - print("--->filterred:" + prev_text) - prev_text = self._replace_str(prev_text) - print("--->replaced:" + prev_text) - return prev_text - - def ask_stream(self, text): - prev_text = "" - complete_text = "" - stime = time.time() - if self.counter % 5 == 0 and self.chatVer == 1: - if self.brainwash: - logging.info('Brainwash mode activated, reinforce the tune.') - else: - logging.info('Injecting tunes') - asktext = self.tune + '\n' + text - else: - asktext = text - self.counter += 1 - for data in self.chatbot.ask(asktext) if self.chatVer == 1 else self.chatbot.ask_stream(text): - message = data["message"][len(prev_text):] if self.chatVer == 1 else data - if ("。" in message or "!" in message or "?" in message or "\n" in message) and len(complete_text) > 3: - complete_text += message - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() - complete_text = "" - else: - complete_text += message - - prev_text = data["message"] if self.chatVer == 1 else data - - if complete_text.strip(): - logging.info('ChatGPT Stream Response: %s, @Time %.2f' % (complete_text, time.time() - stime)) - yield complete_text.strip() \ No newline at end of file From 8a5b90220c47f1e9d4aec10d81b0e78f81023859 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 19 Nov 2023 17:44:23 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E6=94=AF=E6=8C=8116k=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- log.log | 1310 ------------------------------------------------- log_async.log | 1310 ------------------------------------------------- 2 files changed, 2620 deletions(-) delete mode 100644 log.log delete mode 100644 log_async.log diff --git a/log.log b/log.log deleted file mode 100644 index 6182eb0..0000000 --- a/log.log +++ /dev/null @@ -1,1310 +0,0 @@ -2023-11-06 14:34:35,862 INFO Initializing Server... -2023-11-06 14:34:35,863 ERROR [Errno 55] No buffer space available -2023-11-06 14:34:35,863 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) -OSError: [Errno 55] No buffer space available - -2023-11-06 14:37:52,403 INFO Initializing Server... -2023-11-06 14:37:52,403 ERROR [Errno 55] No buffer space available -2023-11-06 14:37:52,403 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) -OSError: [Errno 55] No buffer space available - -2023-11-06 14:40:17,051 INFO Initializing Server... -2023-11-06 14:40:17,052 ERROR [Errno 55] No buffer space available -2023-11-06 14:40:17,054 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) -OSError: [Errno 55] No buffer space available - -2023-11-06 14:55:18,836 INFO Initializing Server... -2023-11-06 14:55:18,837 INFO Initializing ASR Service... -2023-11-06 14:55:20,331 INFO Initializing ChatGPT Service... -2023-11-06 14:55:20,332 INFO chatGPT prompt: paimon35.txt -2023-11-06 14:55:20,387 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 14:55:21,681 INFO you have your own api key. Great. -2023-11-06 14:55:25,676 INFO API Chatbot initialized. -2023-11-06 14:55:25,677 INFO Initializing TTS Service for character_paimon... -2023-11-06 14:55:26,687 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 14:55:26,696 INFO Initializing Sentiment Engine... -2023-11-06 14:55:30,988 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 14:56:43,022 INFO Connected by ('100.101.36.70', 39578) -2023-11-06 14:56:47,253 INFO WAV file received and saved. -2023-11-06 14:57:07,580 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-06 14:57:10,551 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情要找我吗?还是你肚子饿了,想找我一起吃点好吃的?, time used 2.97 -2023-11-06 14:57:10,924 ERROR Torch not compiled with CUDA enabled -2023-11-06 14:57:10,925 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read - x_tst = stn_tst.cuda().unsqueeze(0) - ^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init - raise AssertionError("Torch not compiled with CUDA enabled") -AssertionError: Torch not compiled with CUDA enabled - -2023-11-06 14:57:10,925 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 14:59:19,918 INFO Initializing Server... -2023-11-06 14:59:19,918 INFO Initializing ASR Service... -2023-11-06 14:59:21,260 INFO Initializing ChatGPT Service... -2023-11-06 14:59:21,261 INFO chatGPT prompt: paimon35.txt -2023-11-06 14:59:21,313 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 14:59:21,545 INFO you have your own api key. Great. -2023-11-06 14:59:21,731 INFO API Chatbot initialized. -2023-11-06 14:59:21,731 INFO Initializing TTS Service for character_paimon... -2023-11-06 14:59:22,707 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 14:59:22,714 INFO Initializing Sentiment Engine... -2023-11-06 14:59:23,748 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 14:59:28,203 INFO Connected by ('100.101.36.70', 41902) -2023-11-06 14:59:34,064 INFO WAV file received and saved. -2023-11-06 14:59:35,940 INFO ASR Result: ['你好啊']. time used 0.26. -2023-11-06 14:59:37,973 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?还是你肚子饿了,需要找点好吃的?, time used 2.03 -2023-11-06 14:59:38,319 ERROR Torch not compiled with CUDA enabled -2023-11-06 14:59:38,319 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 49, in read - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init - raise AssertionError("Torch not compiled with CUDA enabled") -AssertionError: Torch not compiled with CUDA enabled - -2023-11-06 14:59:38,320 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 15:00:31,669 INFO Initializing Server... -2023-11-06 15:00:31,669 ERROR [Errno 48] Address already in use -2023-11-06 15:00:31,669 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:38,114 INFO Initializing Server... -2023-11-06 15:00:38,114 ERROR [Errno 48] Address already in use -2023-11-06 15:00:38,115 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:41,010 INFO Initializing Server... -2023-11-06 15:00:41,010 ERROR [Errno 48] Address already in use -2023-11-06 15:00:41,010 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:51,700 INFO Initializing Server... -2023-11-06 15:00:51,700 ERROR [Errno 48] Address already in use -2023-11-06 15:00:51,700 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:54,840 INFO Initializing Server... -2023-11-06 15:00:54,840 ERROR [Errno 48] Address already in use -2023-11-06 15:00:54,841 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:57,587 INFO Initializing Server... -2023-11-06 15:00:57,587 ERROR [Errno 48] Address already in use -2023-11-06 15:00:57,587 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:01:00,667 INFO Initializing Server... -2023-11-06 15:01:00,667 ERROR [Errno 48] Address already in use -2023-11-06 15:01:00,667 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:01:03,630 INFO Initializing Server... -2023-11-06 15:01:03,631 ERROR [Errno 48] Address already in use -2023-11-06 15:01:03,631 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:04:04,162 INFO Initializing Server... -2023-11-06 15:04:04,162 INFO Initializing ASR Service... -2023-11-06 15:04:05,395 INFO Initializing ChatGPT Service... -2023-11-06 15:04:05,396 INFO chatGPT prompt: paimon35.txt -2023-11-06 15:04:05,444 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 15:04:05,616 INFO you have your own api key. Great. -2023-11-06 15:04:05,780 INFO API Chatbot initialized. -2023-11-06 15:04:05,780 INFO Initializing TTS Service for character_paimon... -2023-11-06 15:04:06,699 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 15:04:06,706 INFO Initializing Sentiment Engine... -2023-11-06 15:04:07,757 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 15:04:27,047 INFO Initializing Server... -2023-11-06 15:04:27,047 INFO Initializing ASR Service... -2023-11-06 15:04:28,346 INFO Initializing ChatGPT Service... -2023-11-06 15:04:28,347 INFO chatGPT prompt: paimon35.txt -2023-11-06 15:04:28,401 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 15:04:28,573 INFO you have your own api key. Great. -2023-11-06 15:04:28,737 INFO API Chatbot initialized. -2023-11-06 15:04:28,738 INFO Initializing TTS Service for character_paimon... -2023-11-06 15:04:29,547 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 15:04:29,560 INFO Initializing Sentiment Engine... -2023-11-06 15:04:30,547 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 15:04:31,999 INFO Connected by ('100.101.36.70', 40230) -2023-11-06 15:04:36,837 INFO WAV file received and saved. -2023-11-06 15:04:38,448 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-06 15:04:41,322 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮助你的吗?是不是肚子饿得厉害?, time used 2.87 -2023-11-06 15:04:50,258 ERROR The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. -2023-11-06 15:04:50,275 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 50, in read - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 521, in infer - z = self.flow(z_p, y_mask, g=g, reverse=True) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl - return forward_call(*args, **kwargs) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 208, in forward - x = flow(x, x_mask, g=g, reverse=reverse) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl - return forward_call(*args, **kwargs) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 327, in forward - h = self.enc(h, x_mask, g=g) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl - return forward_call(*args, **kwargs) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 156, in forward - x_in = self.in_layers[i](x) - ^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl - result = hook(self, args) - ^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 65, in __call__ - setattr(module, self.name, self.compute_weight(module)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 25, in compute_weight - return _weight_norm(v, g, self.dim) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -NotImplementedError: The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. - -2023-11-06 15:04:50,275 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:32:03,122 INFO Initializing Server... -2023-11-06 16:32:03,122 INFO Initializing ASR Service... -2023-11-06 16:32:04,656 INFO Initializing ChatGPT Service... -2023-11-06 16:32:04,656 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:32:04,720 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:32:04,963 INFO you have your own api key. Great. -2023-11-06 16:32:05,138 INFO API Chatbot initialized. -2023-11-06 16:32:05,138 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:32:06,223 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:32:06,231 INFO Initializing Sentiment Engine... -2023-11-06 16:32:07,418 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:32:08,701 INFO Connected by ('100.101.36.70', 40416) -2023-11-06 16:32:16,872 INFO WAV file received and saved. -2023-11-06 16:32:18,844 INFO ASR Result: ['你好啊']. time used 0.30. -2023-11-06 16:32:21,438 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?是不是肚子饿得厉害?, time used 2.59 -2023-11-06 16:32:25,099 INFO VITS Synth Done, time used 3.66 -2023-11-06 16:32:25,128 INFO Sentiment Engine Infer: 0 -2023-11-06 16:32:25,633 INFO WAV SENT, size 526383 -2023-11-06 16:33:04,273 ERROR [Errno 54] Connection reset by peer -2023-11-06 16:33:04,276 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-06 16:33:04,277 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:33:11,629 INFO Connected by ('100.101.36.70', 39910) -2023-11-06 16:33:15,218 INFO WAV file received and saved. -2023-11-06 16:33:15,453 INFO ASR Result: ['你好啊']. time used 0.22. -2023-11-06 16:34:18,558 INFO Initializing Server... -2023-11-06 16:34:18,558 ERROR [Errno 48] Address already in use -2023-11-06 16:34:18,559 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:31,170 INFO Initializing Server... -2023-11-06 16:34:31,171 ERROR [Errno 48] Address already in use -2023-11-06 16:34:31,171 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:34,333 INFO Initializing Server... -2023-11-06 16:34:34,333 ERROR [Errno 48] Address already in use -2023-11-06 16:34:34,334 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:36,967 INFO Initializing Server... -2023-11-06 16:34:36,967 ERROR [Errno 48] Address already in use -2023-11-06 16:34:36,967 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:39,461 INFO Initializing Server... -2023-11-06 16:34:39,461 ERROR [Errno 48] Address already in use -2023-11-06 16:34:39,461 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:42,195 INFO Initializing Server... -2023-11-06 16:34:42,196 ERROR [Errno 48] Address already in use -2023-11-06 16:34:42,196 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:56,176 INFO Initializing Server... -2023-11-06 16:34:56,176 ERROR [Errno 48] Address already in use -2023-11-06 16:34:56,176 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:59,005 INFO Initializing Server... -2023-11-06 16:34:59,006 ERROR [Errno 48] Address already in use -2023-11-06 16:34:59,006 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:35:49,578 INFO Initializing Server... -2023-11-06 16:35:49,579 INFO Initializing ASR Service... -2023-11-06 16:35:51,076 INFO Initializing ChatGPT Service... -2023-11-06 16:35:51,077 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:35:51,129 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:35:51,310 INFO you have your own api key. Great. -2023-11-06 16:35:51,462 INFO API Chatbot initialized. -2023-11-06 16:35:51,463 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:35:52,451 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:35:52,465 INFO Initializing Sentiment Engine... -2023-11-06 16:35:53,454 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:35:56,342 INFO Connected by ('100.101.36.70', 49476) -2023-11-06 16:35:59,885 INFO WAV file received and saved. -2023-11-06 16:36:01,475 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-06 16:36:03,622 INFO ChatGPT Response: 嘿嘿,你好呀!有什么事情需要派蒙帮忙的吗?还是只是来找我聊天的?, time used 2.14 -2023-11-06 16:36:06,374 INFO VITS Synth Done, time used 2.75 -2023-11-06 16:36:06,413 INFO Sentiment Engine Infer: 0 -2023-11-06 16:36:06,919 INFO WAV SENT, size 586287 -2023-11-06 16:36:26,900 INFO WAV file received and saved. -2023-11-06 16:36:27,163 INFO ASR Result: ['你是谁呀']. time used 0.25. -2023-11-06 16:36:30,512 INFO ChatGPT Response: 我是派蒙!旅行者的小伙伴和向导,负责带领旅行者在提瓦特大陆探险。我可是个话痨、急性子、吃货、小财迷哦!有什么问题或者需求,尽管告诉我,我会尽力帮你解决!嘿嘿~, time used 3.35 -2023-11-06 16:36:36,780 INFO VITS Synth Done, time used 6.27 -2023-11-06 16:36:36,854 INFO Sentiment Engine Infer: 0 -2023-11-06 16:36:37,582 INFO WAV SENT, size 1961007 -2023-11-06 16:41:25,049 INFO Initializing Server... -2023-11-06 16:41:25,049 INFO Initializing ASR Service... -2023-11-06 16:41:26,529 INFO Initializing ChatGPT Service... -2023-11-06 16:41:26,530 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:41:26,581 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:41:26,802 INFO you have your own api key. Great. -2023-11-06 16:41:26,953 INFO API Chatbot initialized. -2023-11-06 16:41:26,953 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:41:27,617 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:41:27,630 INFO Initializing Sentiment Engine... -2023-11-06 16:41:28,639 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:41:30,952 INFO Connected by ('100.101.36.70', 38392) -2023-11-06 16:41:34,975 INFO WAV file received and saved. -2023-11-06 16:41:36,772 INFO ASR Result: ['你好啊']. time used 0.32. -2023-11-06 16:41:38,408 INFO ChatGPT Response: 嘿嘿,你好呀!你是不是肚子饿了?要不要来点好吃的?, time used 1.64 -2023-11-06 16:41:38,744 ERROR Torch not compiled with CUDA enabled -2023-11-06 16:41:38,745 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read - x_tst = stn_tst.cuda().unsqueeze(0) - ^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init - raise AssertionError("Torch not compiled with CUDA enabled") -AssertionError: Torch not compiled with CUDA enabled - -2023-11-06 16:41:38,746 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:42:27,955 INFO Initializing Server... -2023-11-06 16:42:27,955 ERROR [Errno 48] Address already in use -2023-11-06 16:42:27,956 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:44:39,628 INFO Initializing Server... -2023-11-06 16:44:39,628 INFO Initializing ASR Service... -2023-11-06 16:44:41,034 INFO Initializing ChatGPT Service... -2023-11-06 16:44:41,035 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:44:41,083 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:44:41,280 INFO you have your own api key. Great. -2023-11-06 16:44:41,432 INFO API Chatbot initialized. -2023-11-06 16:44:41,433 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:44:42,098 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:44:42,106 INFO Initializing Sentiment Engine... -2023-11-06 16:44:43,108 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:45:24,230 INFO Connected by ('100.101.36.70', 48306) -2023-11-06 16:45:27,776 INFO WAV file received and saved. -2023-11-06 16:45:29,389 INFO ASR Result: ['你好啊']. time used 0.33. -2023-11-06 16:45:31,246 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情需要我帮忙吗?或者是想找个地方吃点好吃的?, time used 1.86 -2023-11-06 16:45:34,751 INFO VITS Synth Done, time used 3.50 -2023-11-06 16:45:34,781 INFO Sentiment Engine Infer: 0 -2023-11-06 16:45:35,286 INFO WAV SENT, size 600623 -2023-11-06 16:45:50,774 INFO WAV file received and saved. -2023-11-06 16:45:51,020 INFO ASR Result: ['你是谁呀']. time used 0.23. -2023-11-06 16:45:53,452 INFO ChatGPT Response: 我是派蒙啊!你的忠实向导和伙伴。我是一个小小的生物,可以飘浮在空中,帮助你探索提瓦特大陆。有什么我可以帮助你的吗?, time used 2.42 -2023-11-06 16:45:58,646 INFO VITS Synth Done, time used 5.19 -2023-11-06 16:45:58,691 INFO Sentiment Engine Infer: 0 -2023-11-06 16:45:59,197 INFO WAV SENT, size 964655 -2023-11-06 16:46:41,536 ERROR [Errno 54] Connection reset by peer -2023-11-06 16:46:41,537 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-06 16:46:41,537 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 22:19:31,737 INFO Initializing Server... -2023-11-06 22:19:31,738 INFO Initializing ASR Service... -2023-11-06 22:19:33,420 INFO Initializing ChatGPT Service... -2023-11-06 22:19:33,421 INFO chatGPT prompt: paimon35.txt -2023-11-06 22:19:33,482 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 22:19:33,804 INFO you have your own api key. Great. -2023-11-06 22:19:33,983 INFO API Chatbot initialized. -2023-11-06 22:19:33,984 INFO Initializing TTS Service for character_paimon... -2023-11-06 22:19:34,705 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 22:19:34,718 INFO Initializing Sentiment Engine... -2023-11-06 22:19:36,002 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 22:21:37,610 INFO Connected by ('100.101.36.70', 42894) -2023-11-06 22:21:51,693 INFO WAV file received and saved. -2023-11-06 22:21:56,854 INFO ASR Result: ['你好啊']. time used 0.23. -2023-11-06 22:21:57,593 ERROR 401 Unauthorized { - "error": { - "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", - "type": "invalid_request_error", - "param": null, - "code": "invalid_api_key" - } -} - -2023-11-06 22:21:57,594 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 22:22:01,183 INFO VITS Synth Done, time used 3.59 -2023-11-06 22:22:01,695 INFO WAV SENT, size 582191 -2023-11-06 22:47:00,976 ERROR [Errno 54] Connection reset by peer -2023-11-06 22:47:00,982 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-06 22:47:00,984 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 23:21:41,044 INFO Initializing Server... -2023-11-06 23:21:41,044 INFO Initializing ASR Service... -2023-11-06 23:21:42,536 INFO Initializing ChatGPT Service... -2023-11-06 23:21:42,537 INFO chatGPT prompt: paimon35.txt -2023-11-06 23:21:42,589 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 23:21:42,853 INFO you have your own api key. Great. -2023-11-06 23:21:43,005 INFO API Chatbot initialized. -2023-11-06 23:21:43,006 INFO Initializing TTS Service for character_paimon... -2023-11-06 23:21:43,716 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 23:21:43,720 INFO Initializing Sentiment Engine... -2023-11-06 23:21:44,799 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 23:22:21,868 INFO Connected by ('100.101.36.70', 46774) -2023-11-06 23:22:30,001 INFO WAV file received and saved. -2023-11-06 23:22:32,202 INFO ASR Result: ['你好啊']. time used 0.34. -2023-11-06 23:22:32,820 ERROR 401 Unauthorized { - "error": { - "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", - "type": "invalid_request_error", - "param": null, - "code": "invalid_api_key" - } -} - -2023-11-06 23:22:32,822 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:22:36,268 INFO VITS Synth Done, time used 3.45 -2023-11-06 23:22:36,777 INFO WAV SENT, size 588847 -2023-11-06 23:22:49,548 INFO WAV file received and saved. -2023-11-06 23:22:49,807 INFO ASR Result: ['你是谁呀']. time used 0.24. -2023-11-06 23:22:50,213 ERROR 401 Unauthorized { - "error": { - "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", - "type": "invalid_request_error", - "param": null, - "code": "invalid_api_key" - } -} - -2023-11-06 23:22:50,221 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:22:53,268 INFO VITS Synth Done, time used 3.04 -2023-11-06 23:22:53,778 INFO WAV SENT, size 578607 -2023-11-06 23:38:06,174 INFO Initializing Server... -2023-11-06 23:38:06,175 INFO Initializing ASR Service... -2023-11-06 23:38:07,784 INFO Initializing ChatGPT Service... -2023-11-06 23:38:07,784 INFO chatGPT prompt: paimon35.txt -2023-11-06 23:38:07,839 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 23:38:08,125 INFO you have your own api key. Great. -2023-11-06 23:38:08,287 INFO API Chatbot initialized. -2023-11-06 23:38:08,287 INFO Initializing TTS Service for character_paimon... -2023-11-06 23:38:08,984 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 23:38:08,993 INFO Initializing Sentiment Engine... -2023-11-06 23:38:10,095 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 23:40:52,845 INFO Connected by ('100.101.36.70', 43500) -2023-11-06 23:40:57,388 INFO WAV file received and saved. -2023-11-06 23:40:59,705 INFO ASR Result: ['你好啊']. time used 0.30. -2023-11-06 23:41:00,373 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-06 23:41:00,374 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:41:03,987 INFO VITS Synth Done, time used 3.61 -2023-11-06 23:41:04,498 INFO WAV SENT, size 583727 -2023-11-06 23:41:25,310 INFO WAV file received and saved. -2023-11-06 23:41:25,527 INFO ASR Result: ['你是谁呀']. time used 0.20. -2023-11-06 23:41:26,167 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-06 23:41:26,168 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:41:30,255 INFO VITS Synth Done, time used 4.09 -2023-11-06 23:41:30,764 INFO WAV SENT, size 581679 -2023-11-06 23:43:18,495 INFO Initializing Server... -2023-11-06 23:43:18,495 INFO Initializing ASR Service... -2023-11-06 23:43:19,908 INFO Initializing ChatGPT Service... -2023-11-06 23:43:19,909 INFO chatGPT prompt: paimon35.txt -2023-11-06 23:43:19,955 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 23:43:20,142 INFO you have your own api key. Great. -2023-11-06 23:43:20,290 INFO API Chatbot initialized. -2023-11-06 23:43:20,291 INFO Initializing TTS Service for character_paimon... -2023-11-06 23:43:20,956 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 23:43:20,962 INFO Initializing Sentiment Engine... -2023-11-06 23:43:21,823 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:05:21,653 INFO Connected by ('100.101.36.70', 43596) -2023-11-07 00:05:26,645 INFO WAV file received and saved. -2023-11-07 00:05:28,708 INFO ASR Result: ['你好啊']. time used 0.34. -2023-11-07 00:05:29,432 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-07 00:05:29,434 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-07 00:05:33,106 INFO VITS Synth Done, time used 3.67 -2023-11-07 00:05:33,618 INFO WAV SENT, size 583727 -2023-11-07 00:13:40,235 INFO Initializing Server... -2023-11-07 00:13:40,235 INFO Initializing ASR Service... -2023-11-07 00:13:41,721 INFO Initializing ChatGPT Service... -2023-11-07 00:13:41,721 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:13:41,784 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:13:42,057 INFO you have your own api key. Great. -2023-11-07 00:13:42,238 INFO API Chatbot initialized. -2023-11-07 00:13:42,238 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:13:42,982 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:13:42,990 INFO Initializing Sentiment Engine... -2023-11-07 00:13:44,023 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:13:47,626 INFO Connected by ('100.101.36.70', 46568) -2023-11-07 00:14:14,268 INFO WAV file received and saved. -2023-11-07 00:14:16,452 INFO ASR Result: ['你好啊']. time used 0.33. -2023-11-07 00:14:19,148 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-07 00:14:19,149 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-07 00:14:22,671 INFO VITS Synth Done, time used 3.52 -2023-11-07 00:14:23,179 INFO WAV SENT, size 583727 -2023-11-07 00:25:26,832 INFO WAV file received and saved. -2023-11-07 00:25:27,252 INFO ASR Result: ['你是谁']. time used 0.41. -2023-11-07 00:25:27,986 ERROR HTTPConnectionPool(host='75.63.212.152', port=41874): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) -2023-11-07 00:25:27,988 INFO Something wrong with internet, sending: -你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? - -2023-11-07 00:25:30,959 INFO VITS Synth Done, time used 2.97 -2023-11-07 00:25:31,470 INFO WAV SENT, size 531503 -2023-11-07 00:36:57,796 INFO Initializing Server... -2023-11-07 00:36:57,797 ERROR [Errno 48] Address already in use -2023-11-07 00:36:57,797 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:37:14,693 INFO Initializing Server... -2023-11-07 00:37:14,693 ERROR [Errno 48] Address already in use -2023-11-07 00:37:14,694 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:37:17,685 INFO Initializing Server... -2023-11-07 00:37:17,685 ERROR [Errno 48] Address already in use -2023-11-07 00:37:17,686 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:37:20,576 INFO Initializing Server... -2023-11-07 00:37:20,576 ERROR [Errno 48] Address already in use -2023-11-07 00:37:20,577 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:38:11,512 INFO Initializing Server... -2023-11-07 00:38:11,512 INFO Initializing ASR Service... -2023-11-07 00:38:13,046 INFO Initializing ChatGPT Service... -2023-11-07 00:38:13,047 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:38:13,097 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:38:13,342 INFO you have your own api key. Great. -2023-11-07 00:38:13,507 INFO API Chatbot initialized. -2023-11-07 00:38:13,507 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:38:14,265 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:38:14,275 INFO Initializing Sentiment Engine... -2023-11-07 00:38:15,612 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:38:41,905 INFO Connected by ('100.101.36.70', 46156) -2023-11-07 00:38:46,057 INFO WAV file received and saved. -2023-11-07 00:38:48,074 INFO ASR Result: ['你好吗']. time used 0.33. -2023-11-07 00:38:48,673 ERROR Expecting value: line 1 column 1 (char 0) -2023-11-07 00:38:48,698 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 115, in listen - resp_text = self.chat_gpt.ask(ask_text) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 81, in ask - prev_text = self.chatbot.ask(text) - ^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 356, in ask - full_response: str = "".join(response) - ^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 234, in ask_stream - resp: dict = json.loads(line) - ^^^^^^^^^^^^^^^^ - File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/__init__.py", line 346, in loads - return _default_decoder.decode(s) - ^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 337, in decode - obj, end = self.raw_decode(s, idx=_w(s, 0).end()) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 355, in raw_decode - raise JSONDecodeError("Expecting value", s, err.value) from None -json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) - -2023-11-07 00:38:48,699 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:44:51,325 INFO Connected by ('100.101.36.70', 40122) -2023-11-07 00:44:59,945 INFO WAV file received and saved. -2023-11-07 00:45:00,236 INFO ASR Result: ['你好啊']. time used 0.28. -2023-11-07 00:45:00,870 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-07 00:45:00,871 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-07 00:45:04,600 INFO VITS Synth Done, time used 3.73 -2023-11-07 00:45:05,111 INFO WAV SENT, size 596015 -2023-11-07 00:45:46,999 INFO Initializing Server... -2023-11-07 00:45:46,999 ERROR [Errno 48] Address already in use -2023-11-07 00:45:46,999 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:48:04,349 INFO Initializing Server... -2023-11-07 00:48:04,349 INFO Initializing ASR Service... -2023-11-07 00:48:05,826 INFO Initializing ChatGPT Service... -2023-11-07 00:48:05,827 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:48:05,884 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:48:06,084 INFO you have your own api key. Great. -2023-11-07 00:48:06,233 INFO API Chatbot initialized. -2023-11-07 00:48:06,234 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:48:06,891 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:48:06,901 INFO Initializing Sentiment Engine... -2023-11-07 00:48:07,745 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:48:14,776 INFO Connected by ('100.101.36.70', 39596) -2023-11-07 00:48:18,983 INFO WAV file received and saved. -2023-11-07 00:48:20,761 INFO ASR Result: ['你是谁呀']. time used 0.32. -2023-11-07 00:48:21,294 ERROR HTTPConnectionPool(host='75.63.212.152', port=41841): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) -2023-11-07 00:48:21,295 INFO Something wrong with internet, sending: -你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? - -2023-11-07 00:48:24,501 INFO VITS Synth Done, time used 3.20 -2023-11-07 00:48:25,010 INFO WAV SENT, size 539183 -2023-11-07 00:49:13,962 INFO Initializing Server... -2023-11-07 00:49:13,963 ERROR [Errno 48] Address already in use -2023-11-07 00:49:13,963 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:49:40,571 INFO Initializing Server... -2023-11-07 00:49:40,571 INFO Initializing ASR Service... -2023-11-07 00:49:42,031 INFO Initializing ChatGPT Service... -2023-11-07 00:49:42,031 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:49:42,081 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:49:42,259 INFO you have your own api key. Great. -2023-11-07 00:49:42,410 INFO API Chatbot initialized. -2023-11-07 00:49:42,411 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:49:43,058 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:49:43,070 INFO Initializing Sentiment Engine... -2023-11-07 00:49:43,976 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:50:24,505 INFO Connected by ('100.101.36.70', 46034) -2023-11-07 00:50:28,583 INFO WAV file received and saved. -2023-11-07 00:50:30,186 INFO ASR Result: ['你好啊']. time used 0.25. -2023-11-07 00:50:34,116 INFO VITS Synth Done, time used 2.24 -2023-11-07 00:50:34,134 INFO Sentiment Engine Infer: 0 -2023-11-07 00:50:34,640 INFO WAV SENT, size 229423 -2023-11-07 00:50:43,853 INFO WAV file received and saved. -2023-11-07 00:50:44,104 INFO ASR Result: ['你是谁呀']. time used 0.23. -2023-11-07 00:50:49,971 INFO VITS Synth Done, time used 2.42 -2023-11-07 00:50:49,997 INFO Sentiment Engine Infer: 0 -2023-11-07 00:50:50,503 INFO WAV SENT, size 443951 -2023-11-07 00:54:21,532 INFO Initializing Server... -2023-11-07 00:54:21,532 INFO Initializing ASR Service... -2023-11-07 00:54:23,167 INFO Initializing ChatGPT Service... -2023-11-07 00:54:23,168 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:54:23,227 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:54:23,416 INFO you have your own api key. Great. -2023-11-07 00:54:23,579 INFO API Chatbot initialized. -2023-11-07 00:54:23,579 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:54:24,429 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:54:24,440 INFO Initializing Sentiment Engine... -2023-11-07 00:54:25,488 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:54:43,603 INFO Connected by ('100.101.36.70', 43594) -2023-11-07 00:54:47,213 INFO WAV file received and saved. -2023-11-07 00:54:48,925 INFO ASR Result: ['你好啊']. time used 0.32. -2023-11-07 00:54:53,961 INFO VITS Synth Done, time used 2.62 -2023-11-07 00:54:53,985 INFO Sentiment Engine Infer: 4 -2023-11-07 00:54:54,491 INFO WAV SENT, size 414767 -2023-11-07 01:02:21,600 INFO Initializing Server... -2023-11-07 01:02:21,600 ERROR [Errno 48] Address already in use -2023-11-07 01:02:21,600 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 01:02:54,007 INFO Initializing Server... -2023-11-07 01:02:54,007 INFO Initializing ASR Service... -2023-11-07 01:02:55,458 INFO Initializing ChatGPT Service... -2023-11-07 01:02:55,458 INFO chatGPT prompt: paimon35.txt -2023-11-07 01:02:55,508 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 01:02:55,700 INFO you have your own api key. Great. -2023-11-07 01:02:55,849 INFO API Chatbot initialized. -2023-11-07 01:02:55,850 INFO Initializing TTS Service for character_paimon... -2023-11-07 01:02:56,543 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 01:02:56,558 INFO Initializing Sentiment Engine... -2023-11-07 01:02:57,995 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 01:03:41,317 INFO Connected by ('100.101.36.70', 48426) -2023-11-07 01:03:44,961 INFO WAV file received and saved. -2023-11-07 01:03:46,717 INFO ASR Result: ['你好啊']. time used 0.32. -2023-11-07 01:03:55,938 INFO VITS Synth Done, time used 4.52 -2023-11-07 01:03:55,976 INFO Sentiment Engine Infer: 0 -2023-11-07 01:03:56,482 INFO WAV SENT, size 787503 -2023-11-07 01:04:08,916 INFO WAV file received and saved. -2023-11-07 01:04:09,169 INFO ASR Result: ['你是谁呀']. time used 0.24. -2023-11-07 01:04:17,429 INFO VITS Synth Done, time used 5.13 -2023-11-07 01:04:17,471 INFO Sentiment Engine Infer: 0 -2023-11-07 01:04:17,977 INFO WAV SENT, size 956463 -2023-11-07 01:04:38,539 INFO WAV file received and saved. -2023-11-07 01:04:38,826 INFO ASR Result: ['你多大了']. time used 0.27. -2023-11-07 01:04:47,507 INFO VITS Synth Done, time used 5.57 -2023-11-07 01:04:47,560 INFO Sentiment Engine Infer: 0 -2023-11-07 01:04:48,166 INFO WAV SENT, size 1093167 -2023-11-07 10:02:31,919 INFO Initializing Server... -2023-11-07 10:02:31,920 ERROR [Errno 48] Address already in use -2023-11-07 10:02:31,920 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 10:03:00,151 INFO Initializing Server... -2023-11-07 10:03:00,151 INFO Initializing ASR Service... -2023-11-07 10:03:01,627 INFO Initializing ChatGPT Service... -2023-11-07 10:03:01,628 INFO chatGPT prompt: paimon35.txt -2023-11-07 10:03:01,697 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 10:03:01,951 INFO you have your own api key. Great. -2023-11-07 10:03:02,102 INFO API Chatbot initialized. -2023-11-07 10:03:02,103 INFO Initializing TTS Service for character_paimon... -2023-11-07 10:03:02,820 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 10:03:02,827 INFO Initializing Sentiment Engine... -2023-11-07 10:03:03,880 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 10:03:08,937 INFO Connected by ('100.101.36.70', 42440) -2023-11-07 10:03:48,592 INFO WAV file received and saved. -2023-11-07 10:03:51,085 INFO ASR Result: ['嗯你好啊']. time used 0.33. -2023-11-07 10:03:56,989 INFO VITS Synth Done, time used 3.28 -2023-11-07 10:03:57,015 INFO Sentiment Engine Infer: 0 -2023-11-07 10:03:57,521 INFO WAV SENT, size 479279 -2023-11-07 10:04:51,565 INFO WAV file received and saved. -2023-11-07 10:04:51,888 INFO ASR Result: ['你叫什么名字']. time used 0.31. -2023-11-07 10:04:58,428 INFO VITS Synth Done, time used 3.95 -2023-11-07 10:04:58,459 INFO Sentiment Engine Infer: 2 -2023-11-07 10:04:58,965 INFO WAV SENT, size 732207 -2023-11-07 10:05:37,070 INFO WAV file received and saved. -2023-11-07 10:05:37,406 INFO ASR Result: ['呃你今天开心吗']. time used 0.32. -2023-11-07 10:05:45,561 INFO VITS Synth Done, time used 5.42 -2023-11-07 10:05:45,592 INFO Sentiment Engine Infer: 2 -2023-11-07 10:05:46,098 INFO WAV SENT, size 778287 -2023-11-07 10:06:08,739 INFO WAV file received and saved. -2023-11-07 10:06:09,101 INFO ASR Result: ['今天你能收到一个红包你开心吗']. time used 0.34. -2023-11-07 10:06:18,676 INFO VITS Synth Done, time used 6.27 -2023-11-07 10:06:18,722 INFO Sentiment Engine Infer: 0 -2023-11-07 10:06:19,358 INFO WAV SENT, size 1211439 -2023-11-07 10:08:05,355 INFO WAV file received and saved. -2023-11-07 10:08:05,615 INFO ASR Result: ['你今年多大了']. time used 0.24. -2023-11-07 10:08:15,586 INFO VITS Synth Done, time used 6.50 -2023-11-07 10:08:15,641 INFO Sentiment Engine Infer: 2 -2023-11-07 10:08:16,192 INFO WAV SENT, size 1268271 -2023-11-07 10:09:15,782 INFO WAV file received and saved. -2023-11-07 10:09:16,126 INFO ASR Result: ['呃你最伤心的是什么时候']. time used 0.33. -2023-11-07 10:09:29,299 INFO VITS Synth Done, time used 8.52 -2023-11-07 10:09:29,367 INFO Sentiment Engine Infer: 0 -2023-11-07 10:09:30,212 INFO WAV SENT, size 1684015 -2023-11-07 10:11:10,356 INFO WAV file received and saved. -2023-11-07 10:11:10,644 INFO ASR Result: ['呃派萌你给我笑一个']. time used 0.27. -2023-11-07 10:11:15,242 INFO VITS Synth Done, time used 2.44 -2023-11-07 10:11:15,261 INFO Sentiment Engine Infer: 2 -2023-11-07 10:11:15,772 INFO WAV SENT, size 459311 -2023-11-07 10:20:05,218 ERROR [Errno 54] Connection reset by peer -2023-11-07 10:20:05,221 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-07 10:20:05,221 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 10:22:03,143 INFO Connected by ('100.101.36.70', 48596) -2023-11-07 10:25:27,750 ERROR [Errno 54] Connection reset by peer -2023-11-07 10:25:27,757 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-07 10:25:27,758 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:03:48,974 INFO Initializing Server... -2023-11-18 19:03:48,975 INFO Initializing ASR Service... -2023-11-18 19:03:50,652 INFO Initializing ChatGPT Service... -2023-11-18 19:03:50,652 INFO chatGPT prompt: paimon35.txt -2023-11-18 19:03:50,718 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-18 19:03:51,172 INFO you have your own api key. Great. -2023-11-18 19:03:56,133 INFO API Chatbot initialized. -2023-11-18 19:03:56,134 INFO Initializing TTS Service for character_paimon... -2023-11-18 19:03:56,827 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-18 19:03:56,837 INFO Initializing Sentiment Engine... -2023-11-18 19:03:58,351 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:04:40,539 INFO Initializing Server... -2023-11-18 19:04:40,539 INFO Initializing ASR Service... -2023-11-18 19:04:42,033 INFO Initializing ChatGPT Service... -2023-11-18 19:04:42,033 INFO chatGPT prompt: paimon35.txt -2023-11-18 19:04:42,090 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-18 19:04:42,262 INFO you have your own api key. Great. -2023-11-18 19:04:42,430 INFO API Chatbot initialized. -2023-11-18 19:04:42,430 INFO Initializing TTS Service for character_paimon... -2023-11-18 19:04:43,108 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-18 19:04:43,124 INFO Initializing Sentiment Engine... -2023-11-18 19:04:44,187 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:05:54,982 INFO Connected by ('100.67.8.121', 54466) -2023-11-18 19:06:04,394 INFO WAV file received and saved. -2023-11-18 19:06:15,834 INFO ASR Result: ['你好啊']. time used 0.38. -2023-11-18 19:06:20,958 INFO VITS Synth Done, time used 2.62 -2023-11-18 19:06:20,987 INFO Sentiment Engine Infer: 4 -2023-11-18 19:06:21,493 INFO WAV SENT, size 378927 -2023-11-18 19:06:36,485 INFO WAV file received and saved. -2023-11-18 19:06:36,766 INFO ASR Result: ['你是谁呀']. time used 0.27. -2023-11-18 19:06:42,482 INFO VITS Synth Done, time used 2.44 -2023-11-18 19:06:42,510 INFO Sentiment Engine Infer: 1 -2023-11-18 19:06:43,016 INFO WAV SENT, size 426543 -2023-11-18 19:06:59,175 INFO WAV file received and saved. -2023-11-18 19:06:59,554 INFO ASR Result: ['你那个你在要做什么呢']. time used 0.36. -2023-11-18 19:07:05,391 INFO VITS Synth Done, time used 2.98 -2023-11-18 19:07:05,481 INFO Sentiment Engine Infer: 2 -2023-11-18 19:07:05,987 INFO WAV SENT, size 517679 -2023-11-18 19:07:17,603 INFO WAV file received and saved. -2023-11-18 19:07:17,987 INFO ASR Result: ['你要不要跟我一起去登山']. time used 0.36. -2023-11-18 19:07:27,703 INFO VITS Synth Done, time used 6.16 -2023-11-18 19:07:27,757 INFO Sentiment Engine Infer: 0 -2023-11-18 19:07:28,333 INFO WAV SENT, size 1131055 -2023-11-18 19:07:51,016 INFO WAV file received and saved. -2023-11-18 19:07:51,544 INFO ASR Result: ['我想要去登泰山那你是走上去呢还是飞上去呢']. time used 0.50. -2023-11-18 19:08:06,046 INFO VITS Synth Done, time used 9.53 -2023-11-18 19:08:06,164 INFO Sentiment Engine Infer: 0 -2023-11-18 19:08:07,010 INFO WAV SENT, size 1785391 -2023-11-18 19:08:36,496 INFO WAV file received and saved. -2023-11-18 19:08:36,995 INFO ASR Result: ['你能登得了吗你到时候在中途你登不动的时候你又要下山我那我到时候怎么办呢']. time used 0.47. -2023-11-18 19:08:55,337 INFO VITS Synth Done, time used 13.26 -2023-11-18 19:08:55,479 INFO Sentiment Engine Infer: 0 -2023-11-18 19:08:56,410 INFO WAV SENT, size 2185263 -2023-11-18 19:09:28,428 INFO WAV file received and saved. -2023-11-18 19:09:28,969 INFO ASR Result: ['嗯你好好锻炼身体吧你锻炼好身体然后我们明天再去登山']. time used 0.51. -2023-11-18 19:09:30,790 ERROR 400 Bad Request { - "error": { - "message": "-2 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:09:30,791 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:09:33,865 INFO VITS Synth Done, time used 3.07 -2023-11-18 19:09:34,377 INFO WAV SENT, size 581167 -2023-11-18 19:11:39,011 INFO WAV file received and saved. -2023-11-18 19:11:39,470 INFO ASR Result: ['我看一下呃你我们来玩个文字冒险游戏好吗']. time used 0.42. -2023-11-18 19:11:40,592 ERROR 400 Bad Request { - "error": { - "message": "-28 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:11:40,593 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:11:44,679 INFO VITS Synth Done, time used 4.09 -2023-11-18 19:11:45,188 INFO WAV SENT, size 581679 -2023-11-18 19:12:00,198 ERROR [Errno 32] Broken pipe -2023-11-18 19:12:00,202 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file - self.conn.send(b'sb') -BrokenPipeError: [Errno 32] Broken pipe - -2023-11-18 19:12:00,204 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:12:03,265 INFO Connected by ('100.67.8.121', 54534) -2023-11-18 19:12:12,545 INFO WAV file received and saved. -2023-11-18 19:12:12,933 INFO ASR Result: ['潘们你会玩游戏吗']. time used 0.36. -2023-11-18 19:12:14,003 ERROR 400 Bad Request { - "error": { - "message": "-41 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:12:14,005 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:12:17,103 INFO VITS Synth Done, time used 3.10 -2023-11-18 19:12:17,610 INFO WAV SENT, size 584751 -2023-11-18 19:12:30,259 INFO Initializing Server... -2023-11-18 19:12:30,260 ERROR [Errno 48] Address already in use -2023-11-18 19:12:30,260 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-18 19:13:58,805 INFO Initializing Server... -2023-11-18 19:13:58,808 INFO Initializing ASR Service... -2023-11-18 19:14:00,607 INFO Initializing ChatGPT Service... -2023-11-18 19:14:00,608 INFO chatGPT prompt: paimon35.txt -2023-11-18 19:14:00,671 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-18 19:14:00,910 INFO you have your own api key. Great. -2023-11-18 19:14:01,082 INFO API Chatbot initialized. -2023-11-18 19:14:01,082 INFO Initializing TTS Service for character_paimon... -2023-11-18 19:14:01,774 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-18 19:14:01,784 INFO Initializing Sentiment Engine... -2023-11-18 19:14:03,391 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:14:17,684 INFO Connected by ('100.67.8.121', 54548) -2023-11-18 19:14:23,441 INFO WAV file received and saved. -2023-11-18 19:14:25,299 INFO ASR Result: ['晚上好']. time used 0.34. -2023-11-18 19:14:33,770 INFO VITS Synth Done, time used 2.70 -2023-11-18 19:14:33,791 INFO Sentiment Engine Infer: 0 -2023-11-18 19:14:34,297 INFO WAV SENT, size 416815 -2023-11-18 19:14:45,067 INFO WAV file received and saved. -2023-11-18 19:14:45,447 INFO ASR Result: ['我一点都不饿我现在想要玩游戏']. time used 0.36. -2023-11-18 19:15:02,543 INFO VITS Synth Done, time used 5.91 -2023-11-18 19:15:02,625 INFO Sentiment Engine Infer: 2 -2023-11-18 19:15:03,185 INFO WAV SENT, size 1081903 -2023-11-18 19:15:22,101 INFO WAV file received and saved. -2023-11-18 19:15:22,501 INFO ASR Result: ['你我们来玩一个文字冒险游戏可以吗']. time used 0.38. -2023-11-18 19:15:27,507 ERROR HTTPSConnectionPool(host='translation.googleapis.com', port=443): Max retries exceeded with url: /language/translate/v2?target=EN&key=AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4&q=%E4%BD%A0%E6%88%91%E4%BB%AC%E6%9D%A5%E7%8E%A9%E4%B8%80%E4%B8%AA%E6%96%87%E5%AD%97%E5%86%92%E9%99%A9%E6%B8%B8%E6%88%8F%E5%8F%AF%E4%BB%A5%E5%90%97 (Caused by ProxyError('Cannot connect to proxy.', ConnectionResetError(54, 'Connection reset by peer'))) -2023-11-18 19:15:27,508 INFO Something wrong with internet, sending: -你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? - -2023-11-18 19:15:30,447 INFO VITS Synth Done, time used 2.94 -2023-11-18 19:15:30,957 INFO WAV SENT, size 537647 -2023-11-18 19:15:44,452 INFO WAV file received and saved. -2023-11-18 19:15:44,797 INFO ASR Result: ['没有啊']. time used 0.32. -2023-11-18 19:15:55,076 INFO VITS Synth Done, time used 3.53 -2023-11-18 19:15:55,113 INFO Sentiment Engine Infer: 2 -2023-11-18 19:15:55,616 INFO WAV SENT, size 546863 -2023-11-18 19:16:08,697 INFO WAV file received and saved. -2023-11-18 19:16:09,136 INFO ASR Result: ['我们现在玩一个文字冒险游戏好吗']. time used 0.42. -2023-11-18 19:16:28,975 INFO VITS Synth Done, time used 6.15 -2023-11-18 19:16:29,086 INFO Sentiment Engine Infer: 0 -2023-11-18 19:16:29,634 INFO WAV SENT, size 1060399 -2023-11-18 19:16:51,017 INFO WAV file received and saved. -2023-11-18 19:16:51,497 INFO ASR Result: ['我们玩一个去森林里面冒险的游戏你觉得如何']. time used 0.44. -2023-11-18 19:17:21,971 INFO VITS Synth Done, time used 13.88 -2023-11-18 19:17:22,065 INFO Sentiment Engine Infer: 0 -2023-11-18 19:17:22,900 INFO WAV SENT, size 1540143 -2023-11-18 19:17:44,336 INFO WAV file received and saved. -2023-11-18 19:17:44,731 INFO ASR Result: ['我已经准备好了']. time used 0.38. -2023-11-18 19:18:10,553 INFO VITS Synth Done, time used 8.93 -2023-11-18 19:18:10,657 INFO Sentiment Engine Infer: 0 -2023-11-18 19:18:11,342 INFO WAV SENT, size 1571375 -2023-11-18 19:18:43,776 INFO WAV file received and saved. -2023-11-18 19:18:44,205 INFO ASR Result: ['你是不是还没有说完请继续']. time used 0.40. -2023-11-18 19:18:45,522 ERROR 400 Bad Request { - "error": { - "message": "-21 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:18:45,523 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:18:48,835 INFO VITS Synth Done, time used 3.31 -2023-11-18 19:18:49,346 INFO WAV SENT, size 590383 -2023-11-18 19:24:14,842 ERROR [Errno 32] Broken pipe -2023-11-18 19:24:14,849 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file - self.conn.send(b'sb') -BrokenPipeError: [Errno 32] Broken pipe - -2023-11-18 19:24:14,850 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:33:47,379 INFO Initializing Server... -2023-11-19 16:33:47,380 INFO Initializing ASR Service... -2023-11-19 16:33:49,060 INFO Initializing ChatGPT Service... -2023-11-19 16:33:49,061 INFO chatGPT prompt: paimon35.txt -2023-11-19 16:33:49,146 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 16:33:49,506 INFO you have your own api key. Great. -2023-11-19 16:33:49,682 INFO API Chatbot initialized. -2023-11-19 16:33:49,682 INFO Initializing TTS Service for character_paimon... -2023-11-19 16:33:50,374 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 16:33:50,382 INFO Initializing Sentiment Engine... -2023-11-19 16:33:51,784 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:34:51,579 INFO Connected by ('100.67.8.121', 58508) -2023-11-19 16:35:18,809 ERROR [Errno 54] Connection reset by peer -2023-11-19 16:35:18,811 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-19 16:35:18,812 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:35:24,069 INFO Connected by ('100.67.8.121', 58530) -2023-11-19 16:35:28,394 INFO WAV file received and saved. -2023-11-19 16:35:37,126 INFO ASR Result: ['你好啊']. time used 0.23. -2023-11-19 16:35:43,058 INFO VITS Synth Done, time used 3.34 -2023-11-19 16:35:43,086 INFO Sentiment Engine Infer: 0 -2023-11-19 16:35:43,592 INFO WAV SENT, size 564271 -2023-11-19 16:35:54,331 INFO WAV file received and saved. -2023-11-19 16:35:54,653 INFO ASR Result: ['你是谁呀']. time used 0.30. -2023-11-19 16:35:59,976 INFO VITS Synth Done, time used 2.77 -2023-11-19 16:36:00,001 INFO Sentiment Engine Infer: 0 -2023-11-19 16:36:00,507 INFO WAV SENT, size 527407 -2023-11-19 16:56:41,529 INFO Initializing Server... -2023-11-19 16:56:41,530 INFO Initializing ASR Service... -2023-11-19 16:56:43,373 INFO Initializing ChatGPT Service... -2023-11-19 16:56:43,373 INFO chatGPT prompt: paimon35.txt -2023-11-19 16:56:43,448 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 16:56:43,725 INFO you have your own api key. Great. -2023-11-19 16:56:43,895 ERROR System prompt is too long -2023-11-19 16:56:43,905 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 85, in __init__ - self.chat_gpt = GPTService.GPTService(args) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 57, in __init__ - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=512) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 124, in __init__ - raise t.ActionRefuseError("System prompt is too long") -revChatGPT.typings.ActionRefuseError: System prompt is too long -The current operation is not allowed, which may be intentional -Please check that the input is correct, or you can resolve this issue by filing an issue -Project URL: https://github.com/acheong08/ChatGPT - -2023-11-19 16:58:07,734 INFO Initializing Server... -2023-11-19 16:58:07,734 INFO Initializing ASR Service... -2023-11-19 16:58:09,069 INFO Initializing ChatGPT Service... -2023-11-19 16:58:09,070 INFO chatGPT prompt: paimon35.txt -2023-11-19 16:58:09,123 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 16:58:09,301 INFO you have your own api key. Great. -2023-11-19 16:58:09,469 INFO API Chatbot initialized. -2023-11-19 16:58:09,469 INFO Initializing TTS Service for character_paimon... -2023-11-19 16:58:10,197 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 16:58:10,207 INFO Initializing Sentiment Engine... -2023-11-19 16:58:11,357 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:58:19,222 INFO Connected by ('100.67.8.121', 58740) -2023-11-19 16:58:22,810 INFO WAV file received and saved. -2023-11-19 16:58:25,246 INFO ASR Result: ['你好啊啊']. time used 0.28. -2023-11-19 16:58:26,700 ERROR 400 Bad Request { - "error": { - "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", - "type": "invalid_request_error", - "param": "messages", - "code": "context_length_exceeded" - } -} - -2023-11-19 16:58:26,701 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-19 16:58:30,308 INFO VITS Synth Done, time used 3.61 -2023-11-19 16:58:30,818 INFO WAV SENT, size 592431 -2023-11-19 16:59:44,439 INFO Initializing Server... -2023-11-19 16:59:44,439 ERROR [Errno 48] Address already in use -2023-11-19 16:59:44,440 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-19 17:00:18,236 INFO Initializing Server... -2023-11-19 17:00:18,236 INFO Initializing ASR Service... -2023-11-19 17:00:19,749 INFO Initializing ChatGPT Service... -2023-11-19 17:00:19,750 INFO chatGPT prompt: paimon35.txt -2023-11-19 17:00:19,812 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 17:00:19,987 INFO you have your own api key. Great. -2023-11-19 17:00:20,143 INFO API Chatbot initialized. -2023-11-19 17:00:20,143 INFO Initializing TTS Service for character_paimon... -2023-11-19 17:00:20,806 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 17:00:20,814 INFO Initializing Sentiment Engine... -2023-11-19 17:00:22,037 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 17:00:25,242 INFO Connected by ('100.67.8.121', 58762) -2023-11-19 17:00:28,937 INFO WAV file received and saved. -2023-11-19 17:00:30,665 INFO ASR Result: ['你是谁呀']. time used 0.35. -2023-11-19 17:00:31,657 ERROR 400 Bad Request { - "error": { - "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", - "type": "invalid_request_error", - "param": "messages", - "code": "context_length_exceeded" - } -} - -2023-11-19 17:00:31,658 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-19 17:00:35,172 INFO VITS Synth Done, time used 3.51 -2023-11-19 17:00:35,681 INFO WAV SENT, size 585263 -2023-11-19 17:35:16,842 INFO Initializing Server... -2023-11-19 17:35:16,843 INFO Initializing ASR Service... -2023-11-19 17:35:18,421 INFO Initializing ChatGPT Service... -2023-11-19 17:35:18,421 INFO chatGPT prompt: paimon35.txt -2023-11-19 17:35:18,475 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 17:35:18,702 INFO you have your own api key. Great. -2023-11-19 17:35:18,869 INFO API Chatbot initialized. -2023-11-19 17:35:18,870 INFO Initializing TTS Service for character_paimon... -2023-11-19 17:35:19,680 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 17:35:19,691 INFO Initializing Sentiment Engine... -2023-11-19 17:35:21,168 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 17:35:37,731 INFO Connected by ('100.67.8.121', 58878) -2023-11-19 17:35:51,113 INFO WAV file received and saved. -2023-11-19 17:35:53,004 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-19 17:36:06,543 INFO VITS Synth Done, time used 4.00 -2023-11-19 17:36:06,576 INFO Sentiment Engine Infer: 0 -2023-11-19 17:36:07,082 INFO WAV SENT, size 694831 diff --git a/log_async.log b/log_async.log deleted file mode 100644 index 6182eb0..0000000 --- a/log_async.log +++ /dev/null @@ -1,1310 +0,0 @@ -2023-11-06 14:34:35,862 INFO Initializing Server... -2023-11-06 14:34:35,863 ERROR [Errno 55] No buffer space available -2023-11-06 14:34:35,863 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) -OSError: [Errno 55] No buffer space available - -2023-11-06 14:37:52,403 INFO Initializing Server... -2023-11-06 14:37:52,403 ERROR [Errno 55] No buffer space available -2023-11-06 14:37:52,403 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) -OSError: [Errno 55] No buffer space available - -2023-11-06 14:40:17,051 INFO Initializing Server... -2023-11-06 14:40:17,052 ERROR [Errno 55] No buffer space available -2023-11-06 14:40:17,054 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 68, in __init__ - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10240000) -OSError: [Errno 55] No buffer space available - -2023-11-06 14:55:18,836 INFO Initializing Server... -2023-11-06 14:55:18,837 INFO Initializing ASR Service... -2023-11-06 14:55:20,331 INFO Initializing ChatGPT Service... -2023-11-06 14:55:20,332 INFO chatGPT prompt: paimon35.txt -2023-11-06 14:55:20,387 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 14:55:21,681 INFO you have your own api key. Great. -2023-11-06 14:55:25,676 INFO API Chatbot initialized. -2023-11-06 14:55:25,677 INFO Initializing TTS Service for character_paimon... -2023-11-06 14:55:26,687 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 14:55:26,696 INFO Initializing Sentiment Engine... -2023-11-06 14:55:30,988 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 14:56:43,022 INFO Connected by ('100.101.36.70', 39578) -2023-11-06 14:56:47,253 INFO WAV file received and saved. -2023-11-06 14:57:07,580 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-06 14:57:10,551 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情要找我吗?还是你肚子饿了,想找我一起吃点好吃的?, time used 2.97 -2023-11-06 14:57:10,924 ERROR Torch not compiled with CUDA enabled -2023-11-06 14:57:10,925 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read - x_tst = stn_tst.cuda().unsqueeze(0) - ^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init - raise AssertionError("Torch not compiled with CUDA enabled") -AssertionError: Torch not compiled with CUDA enabled - -2023-11-06 14:57:10,925 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 14:59:19,918 INFO Initializing Server... -2023-11-06 14:59:19,918 INFO Initializing ASR Service... -2023-11-06 14:59:21,260 INFO Initializing ChatGPT Service... -2023-11-06 14:59:21,261 INFO chatGPT prompt: paimon35.txt -2023-11-06 14:59:21,313 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 14:59:21,545 INFO you have your own api key. Great. -2023-11-06 14:59:21,731 INFO API Chatbot initialized. -2023-11-06 14:59:21,731 INFO Initializing TTS Service for character_paimon... -2023-11-06 14:59:22,707 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 14:59:22,714 INFO Initializing Sentiment Engine... -2023-11-06 14:59:23,748 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 14:59:28,203 INFO Connected by ('100.101.36.70', 41902) -2023-11-06 14:59:34,064 INFO WAV file received and saved. -2023-11-06 14:59:35,940 INFO ASR Result: ['你好啊']. time used 0.26. -2023-11-06 14:59:37,973 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?还是你肚子饿了,需要找点好吃的?, time used 2.03 -2023-11-06 14:59:38,319 ERROR Torch not compiled with CUDA enabled -2023-11-06 14:59:38,319 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 49, in read - x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda() - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init - raise AssertionError("Torch not compiled with CUDA enabled") -AssertionError: Torch not compiled with CUDA enabled - -2023-11-06 14:59:38,320 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 15:00:31,669 INFO Initializing Server... -2023-11-06 15:00:31,669 ERROR [Errno 48] Address already in use -2023-11-06 15:00:31,669 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:38,114 INFO Initializing Server... -2023-11-06 15:00:38,114 ERROR [Errno 48] Address already in use -2023-11-06 15:00:38,115 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:41,010 INFO Initializing Server... -2023-11-06 15:00:41,010 ERROR [Errno 48] Address already in use -2023-11-06 15:00:41,010 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:51,700 INFO Initializing Server... -2023-11-06 15:00:51,700 ERROR [Errno 48] Address already in use -2023-11-06 15:00:51,700 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:54,840 INFO Initializing Server... -2023-11-06 15:00:54,840 ERROR [Errno 48] Address already in use -2023-11-06 15:00:54,841 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:00:57,587 INFO Initializing Server... -2023-11-06 15:00:57,587 ERROR [Errno 48] Address already in use -2023-11-06 15:00:57,587 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:01:00,667 INFO Initializing Server... -2023-11-06 15:01:00,667 ERROR [Errno 48] Address already in use -2023-11-06 15:01:00,667 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:01:03,630 INFO Initializing Server... -2023-11-06 15:01:03,631 ERROR [Errno 48] Address already in use -2023-11-06 15:01:03,631 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 15:04:04,162 INFO Initializing Server... -2023-11-06 15:04:04,162 INFO Initializing ASR Service... -2023-11-06 15:04:05,395 INFO Initializing ChatGPT Service... -2023-11-06 15:04:05,396 INFO chatGPT prompt: paimon35.txt -2023-11-06 15:04:05,444 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 15:04:05,616 INFO you have your own api key. Great. -2023-11-06 15:04:05,780 INFO API Chatbot initialized. -2023-11-06 15:04:05,780 INFO Initializing TTS Service for character_paimon... -2023-11-06 15:04:06,699 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 15:04:06,706 INFO Initializing Sentiment Engine... -2023-11-06 15:04:07,757 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 15:04:27,047 INFO Initializing Server... -2023-11-06 15:04:27,047 INFO Initializing ASR Service... -2023-11-06 15:04:28,346 INFO Initializing ChatGPT Service... -2023-11-06 15:04:28,347 INFO chatGPT prompt: paimon35.txt -2023-11-06 15:04:28,401 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 15:04:28,573 INFO you have your own api key. Great. -2023-11-06 15:04:28,737 INFO API Chatbot initialized. -2023-11-06 15:04:28,738 INFO Initializing TTS Service for character_paimon... -2023-11-06 15:04:29,547 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 15:04:29,560 INFO Initializing Sentiment Engine... -2023-11-06 15:04:30,547 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 15:04:31,999 INFO Connected by ('100.101.36.70', 40230) -2023-11-06 15:04:36,837 INFO WAV file received and saved. -2023-11-06 15:04:38,448 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-06 15:04:41,322 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮助你的吗?是不是肚子饿得厉害?, time used 2.87 -2023-11-06 15:04:50,258 ERROR The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. -2023-11-06 15:04:50,275 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 50, in read - audio = self.net_g.infer(x_tst, x_tst_lengths, noise_scale=.667, noise_scale_w=0.2, length_scale=self.speed)[0][ - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 521, in infer - z = self.flow(z_p, y_mask, g=g, reverse=True) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl - return forward_call(*args, **kwargs) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/models.py", line 208, in forward - x = flow(x, x_mask, g=g, reverse=reverse) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl - return forward_call(*args, **kwargs) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 327, in forward - h = self.enc(h, x_mask, g=g) - ^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl - return forward_call(*args, **kwargs) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/vits/modules.py", line 156, in forward - x_in = self.in_layers[i](x) - ^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl - result = hook(self, args) - ^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 65, in __call__ - setattr(module, self.name, self.compute_weight(module)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/nn/utils/weight_norm.py", line 25, in compute_weight - return _weight_norm(v, g, self.dim) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -NotImplementedError: The operator 'aten::_weight_norm_interface' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS. - -2023-11-06 15:04:50,275 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:32:03,122 INFO Initializing Server... -2023-11-06 16:32:03,122 INFO Initializing ASR Service... -2023-11-06 16:32:04,656 INFO Initializing ChatGPT Service... -2023-11-06 16:32:04,656 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:32:04,720 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:32:04,963 INFO you have your own api key. Great. -2023-11-06 16:32:05,138 INFO API Chatbot initialized. -2023-11-06 16:32:05,138 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:32:06,223 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:32:06,231 INFO Initializing Sentiment Engine... -2023-11-06 16:32:07,418 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:32:08,701 INFO Connected by ('100.101.36.70', 40416) -2023-11-06 16:32:16,872 INFO WAV file received and saved. -2023-11-06 16:32:18,844 INFO ASR Result: ['你好啊']. time used 0.30. -2023-11-06 16:32:21,438 INFO ChatGPT Response: 嘿嘿,你好你好!有什么我可以帮你的吗?是不是肚子饿得厉害?, time used 2.59 -2023-11-06 16:32:25,099 INFO VITS Synth Done, time used 3.66 -2023-11-06 16:32:25,128 INFO Sentiment Engine Infer: 0 -2023-11-06 16:32:25,633 INFO WAV SENT, size 526383 -2023-11-06 16:33:04,273 ERROR [Errno 54] Connection reset by peer -2023-11-06 16:33:04,276 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-06 16:33:04,277 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:33:11,629 INFO Connected by ('100.101.36.70', 39910) -2023-11-06 16:33:15,218 INFO WAV file received and saved. -2023-11-06 16:33:15,453 INFO ASR Result: ['你好啊']. time used 0.22. -2023-11-06 16:34:18,558 INFO Initializing Server... -2023-11-06 16:34:18,558 ERROR [Errno 48] Address already in use -2023-11-06 16:34:18,559 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:31,170 INFO Initializing Server... -2023-11-06 16:34:31,171 ERROR [Errno 48] Address already in use -2023-11-06 16:34:31,171 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:34,333 INFO Initializing Server... -2023-11-06 16:34:34,333 ERROR [Errno 48] Address already in use -2023-11-06 16:34:34,334 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:36,967 INFO Initializing Server... -2023-11-06 16:34:36,967 ERROR [Errno 48] Address already in use -2023-11-06 16:34:36,967 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:39,461 INFO Initializing Server... -2023-11-06 16:34:39,461 ERROR [Errno 48] Address already in use -2023-11-06 16:34:39,461 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:42,195 INFO Initializing Server... -2023-11-06 16:34:42,196 ERROR [Errno 48] Address already in use -2023-11-06 16:34:42,196 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:56,176 INFO Initializing Server... -2023-11-06 16:34:56,176 ERROR [Errno 48] Address already in use -2023-11-06 16:34:56,176 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:34:59,005 INFO Initializing Server... -2023-11-06 16:34:59,006 ERROR [Errno 48] Address already in use -2023-11-06 16:34:59,006 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:35:49,578 INFO Initializing Server... -2023-11-06 16:35:49,579 INFO Initializing ASR Service... -2023-11-06 16:35:51,076 INFO Initializing ChatGPT Service... -2023-11-06 16:35:51,077 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:35:51,129 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:35:51,310 INFO you have your own api key. Great. -2023-11-06 16:35:51,462 INFO API Chatbot initialized. -2023-11-06 16:35:51,463 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:35:52,451 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:35:52,465 INFO Initializing Sentiment Engine... -2023-11-06 16:35:53,454 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:35:56,342 INFO Connected by ('100.101.36.70', 49476) -2023-11-06 16:35:59,885 INFO WAV file received and saved. -2023-11-06 16:36:01,475 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-06 16:36:03,622 INFO ChatGPT Response: 嘿嘿,你好呀!有什么事情需要派蒙帮忙的吗?还是只是来找我聊天的?, time used 2.14 -2023-11-06 16:36:06,374 INFO VITS Synth Done, time used 2.75 -2023-11-06 16:36:06,413 INFO Sentiment Engine Infer: 0 -2023-11-06 16:36:06,919 INFO WAV SENT, size 586287 -2023-11-06 16:36:26,900 INFO WAV file received and saved. -2023-11-06 16:36:27,163 INFO ASR Result: ['你是谁呀']. time used 0.25. -2023-11-06 16:36:30,512 INFO ChatGPT Response: 我是派蒙!旅行者的小伙伴和向导,负责带领旅行者在提瓦特大陆探险。我可是个话痨、急性子、吃货、小财迷哦!有什么问题或者需求,尽管告诉我,我会尽力帮你解决!嘿嘿~, time used 3.35 -2023-11-06 16:36:36,780 INFO VITS Synth Done, time used 6.27 -2023-11-06 16:36:36,854 INFO Sentiment Engine Infer: 0 -2023-11-06 16:36:37,582 INFO WAV SENT, size 1961007 -2023-11-06 16:41:25,049 INFO Initializing Server... -2023-11-06 16:41:25,049 INFO Initializing ASR Service... -2023-11-06 16:41:26,529 INFO Initializing ChatGPT Service... -2023-11-06 16:41:26,530 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:41:26,581 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:41:26,802 INFO you have your own api key. Great. -2023-11-06 16:41:26,953 INFO API Chatbot initialized. -2023-11-06 16:41:26,953 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:41:27,617 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:41:27,630 INFO Initializing Sentiment Engine... -2023-11-06 16:41:28,639 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:41:30,952 INFO Connected by ('100.101.36.70', 38392) -2023-11-06 16:41:34,975 INFO WAV file received and saved. -2023-11-06 16:41:36,772 INFO ASR Result: ['你好啊']. time used 0.32. -2023-11-06 16:41:38,408 INFO ChatGPT Response: 嘿嘿,你好呀!你是不是肚子饿了?要不要来点好吃的?, time used 1.64 -2023-11-06 16:41:38,744 ERROR Torch not compiled with CUDA enabled -2023-11-06 16:41:38,745 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 116, in listen - self.send_voice(resp_text) - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 143, in send_voice - self.tts.read_save(resp_text, self.tmp_proc_file, self.tts.hps.data.sampling_rate) - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 56, in read_save - au = self.read(text) - ^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/TTS/TTService.py", line 48, in read - x_tst = stn_tst.cuda().unsqueeze(0) - ^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 239, in _lazy_init - raise AssertionError("Torch not compiled with CUDA enabled") -AssertionError: Torch not compiled with CUDA enabled - -2023-11-06 16:41:38,746 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:42:27,955 INFO Initializing Server... -2023-11-06 16:42:27,955 ERROR [Errno 48] Address already in use -2023-11-06 16:42:27,956 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-06 16:44:39,628 INFO Initializing Server... -2023-11-06 16:44:39,628 INFO Initializing ASR Service... -2023-11-06 16:44:41,034 INFO Initializing ChatGPT Service... -2023-11-06 16:44:41,035 INFO chatGPT prompt: paimon35.txt -2023-11-06 16:44:41,083 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 16:44:41,280 INFO you have your own api key. Great. -2023-11-06 16:44:41,432 INFO API Chatbot initialized. -2023-11-06 16:44:41,433 INFO Initializing TTS Service for character_paimon... -2023-11-06 16:44:42,098 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 16:44:42,106 INFO Initializing Sentiment Engine... -2023-11-06 16:44:43,108 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 16:45:24,230 INFO Connected by ('100.101.36.70', 48306) -2023-11-06 16:45:27,776 INFO WAV file received and saved. -2023-11-06 16:45:29,389 INFO ASR Result: ['你好啊']. time used 0.33. -2023-11-06 16:45:31,246 INFO ChatGPT Response: 嘿嘿,你好你好!有什么事情需要我帮忙吗?或者是想找个地方吃点好吃的?, time used 1.86 -2023-11-06 16:45:34,751 INFO VITS Synth Done, time used 3.50 -2023-11-06 16:45:34,781 INFO Sentiment Engine Infer: 0 -2023-11-06 16:45:35,286 INFO WAV SENT, size 600623 -2023-11-06 16:45:50,774 INFO WAV file received and saved. -2023-11-06 16:45:51,020 INFO ASR Result: ['你是谁呀']. time used 0.23. -2023-11-06 16:45:53,452 INFO ChatGPT Response: 我是派蒙啊!你的忠实向导和伙伴。我是一个小小的生物,可以飘浮在空中,帮助你探索提瓦特大陆。有什么我可以帮助你的吗?, time used 2.42 -2023-11-06 16:45:58,646 INFO VITS Synth Done, time used 5.19 -2023-11-06 16:45:58,691 INFO Sentiment Engine Infer: 0 -2023-11-06 16:45:59,197 INFO WAV SENT, size 964655 -2023-11-06 16:46:41,536 ERROR [Errno 54] Connection reset by peer -2023-11-06 16:46:41,537 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-06 16:46:41,537 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 22:19:31,737 INFO Initializing Server... -2023-11-06 22:19:31,738 INFO Initializing ASR Service... -2023-11-06 22:19:33,420 INFO Initializing ChatGPT Service... -2023-11-06 22:19:33,421 INFO chatGPT prompt: paimon35.txt -2023-11-06 22:19:33,482 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 22:19:33,804 INFO you have your own api key. Great. -2023-11-06 22:19:33,983 INFO API Chatbot initialized. -2023-11-06 22:19:33,984 INFO Initializing TTS Service for character_paimon... -2023-11-06 22:19:34,705 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 22:19:34,718 INFO Initializing Sentiment Engine... -2023-11-06 22:19:36,002 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 22:21:37,610 INFO Connected by ('100.101.36.70', 42894) -2023-11-06 22:21:51,693 INFO WAV file received and saved. -2023-11-06 22:21:56,854 INFO ASR Result: ['你好啊']. time used 0.23. -2023-11-06 22:21:57,593 ERROR 401 Unauthorized { - "error": { - "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", - "type": "invalid_request_error", - "param": null, - "code": "invalid_api_key" - } -} - -2023-11-06 22:21:57,594 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 22:22:01,183 INFO VITS Synth Done, time used 3.59 -2023-11-06 22:22:01,695 INFO WAV SENT, size 582191 -2023-11-06 22:47:00,976 ERROR [Errno 54] Connection reset by peer -2023-11-06 22:47:00,982 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-06 22:47:00,984 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 23:21:41,044 INFO Initializing Server... -2023-11-06 23:21:41,044 INFO Initializing ASR Service... -2023-11-06 23:21:42,536 INFO Initializing ChatGPT Service... -2023-11-06 23:21:42,537 INFO chatGPT prompt: paimon35.txt -2023-11-06 23:21:42,589 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 23:21:42,853 INFO you have your own api key. Great. -2023-11-06 23:21:43,005 INFO API Chatbot initialized. -2023-11-06 23:21:43,006 INFO Initializing TTS Service for character_paimon... -2023-11-06 23:21:43,716 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 23:21:43,720 INFO Initializing Sentiment Engine... -2023-11-06 23:21:44,799 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 23:22:21,868 INFO Connected by ('100.101.36.70', 46774) -2023-11-06 23:22:30,001 INFO WAV file received and saved. -2023-11-06 23:22:32,202 INFO ASR Result: ['你好啊']. time used 0.34. -2023-11-06 23:22:32,820 ERROR 401 Unauthorized { - "error": { - "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", - "type": "invalid_request_error", - "param": null, - "code": "invalid_api_key" - } -} - -2023-11-06 23:22:32,822 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:22:36,268 INFO VITS Synth Done, time used 3.45 -2023-11-06 23:22:36,777 INFO WAV SENT, size 588847 -2023-11-06 23:22:49,548 INFO WAV file received and saved. -2023-11-06 23:22:49,807 INFO ASR Result: ['你是谁呀']. time used 0.24. -2023-11-06 23:22:50,213 ERROR 401 Unauthorized { - "error": { - "message": "Incorrect API key provided: Xk62HrLq************************zIB2. You can find your API key at https://platform.openai.com/account/api-keys.", - "type": "invalid_request_error", - "param": null, - "code": "invalid_api_key" - } -} - -2023-11-06 23:22:50,221 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:22:53,268 INFO VITS Synth Done, time used 3.04 -2023-11-06 23:22:53,778 INFO WAV SENT, size 578607 -2023-11-06 23:38:06,174 INFO Initializing Server... -2023-11-06 23:38:06,175 INFO Initializing ASR Service... -2023-11-06 23:38:07,784 INFO Initializing ChatGPT Service... -2023-11-06 23:38:07,784 INFO chatGPT prompt: paimon35.txt -2023-11-06 23:38:07,839 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 23:38:08,125 INFO you have your own api key. Great. -2023-11-06 23:38:08,287 INFO API Chatbot initialized. -2023-11-06 23:38:08,287 INFO Initializing TTS Service for character_paimon... -2023-11-06 23:38:08,984 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 23:38:08,993 INFO Initializing Sentiment Engine... -2023-11-06 23:38:10,095 INFO Server is listening on 0.0.0.0:38438... -2023-11-06 23:40:52,845 INFO Connected by ('100.101.36.70', 43500) -2023-11-06 23:40:57,388 INFO WAV file received and saved. -2023-11-06 23:40:59,705 INFO ASR Result: ['你好啊']. time used 0.30. -2023-11-06 23:41:00,373 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-06 23:41:00,374 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:41:03,987 INFO VITS Synth Done, time used 3.61 -2023-11-06 23:41:04,498 INFO WAV SENT, size 583727 -2023-11-06 23:41:25,310 INFO WAV file received and saved. -2023-11-06 23:41:25,527 INFO ASR Result: ['你是谁呀']. time used 0.20. -2023-11-06 23:41:26,167 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-06 23:41:26,168 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-06 23:41:30,255 INFO VITS Synth Done, time used 4.09 -2023-11-06 23:41:30,764 INFO WAV SENT, size 581679 -2023-11-06 23:43:18,495 INFO Initializing Server... -2023-11-06 23:43:18,495 INFO Initializing ASR Service... -2023-11-06 23:43:19,908 INFO Initializing ChatGPT Service... -2023-11-06 23:43:19,909 INFO chatGPT prompt: paimon35.txt -2023-11-06 23:43:19,955 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-06 23:43:20,142 INFO you have your own api key. Great. -2023-11-06 23:43:20,290 INFO API Chatbot initialized. -2023-11-06 23:43:20,291 INFO Initializing TTS Service for character_paimon... -2023-11-06 23:43:20,956 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-06 23:43:20,962 INFO Initializing Sentiment Engine... -2023-11-06 23:43:21,823 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:05:21,653 INFO Connected by ('100.101.36.70', 43596) -2023-11-07 00:05:26,645 INFO WAV file received and saved. -2023-11-07 00:05:28,708 INFO ASR Result: ['你好啊']. time used 0.34. -2023-11-07 00:05:29,432 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-07 00:05:29,434 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-07 00:05:33,106 INFO VITS Synth Done, time used 3.67 -2023-11-07 00:05:33,618 INFO WAV SENT, size 583727 -2023-11-07 00:13:40,235 INFO Initializing Server... -2023-11-07 00:13:40,235 INFO Initializing ASR Service... -2023-11-07 00:13:41,721 INFO Initializing ChatGPT Service... -2023-11-07 00:13:41,721 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:13:41,784 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:13:42,057 INFO you have your own api key. Great. -2023-11-07 00:13:42,238 INFO API Chatbot initialized. -2023-11-07 00:13:42,238 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:13:42,982 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:13:42,990 INFO Initializing Sentiment Engine... -2023-11-07 00:13:44,023 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:13:47,626 INFO Connected by ('100.101.36.70', 46568) -2023-11-07 00:14:14,268 INFO WAV file received and saved. -2023-11-07 00:14:16,452 INFO ASR Result: ['你好啊']. time used 0.33. -2023-11-07 00:14:19,148 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-07 00:14:19,149 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-07 00:14:22,671 INFO VITS Synth Done, time used 3.52 -2023-11-07 00:14:23,179 INFO WAV SENT, size 583727 -2023-11-07 00:25:26,832 INFO WAV file received and saved. -2023-11-07 00:25:27,252 INFO ASR Result: ['你是谁']. time used 0.41. -2023-11-07 00:25:27,986 ERROR HTTPConnectionPool(host='75.63.212.152', port=41874): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) -2023-11-07 00:25:27,988 INFO Something wrong with internet, sending: -你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? - -2023-11-07 00:25:30,959 INFO VITS Synth Done, time used 2.97 -2023-11-07 00:25:31,470 INFO WAV SENT, size 531503 -2023-11-07 00:36:57,796 INFO Initializing Server... -2023-11-07 00:36:57,797 ERROR [Errno 48] Address already in use -2023-11-07 00:36:57,797 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:37:14,693 INFO Initializing Server... -2023-11-07 00:37:14,693 ERROR [Errno 48] Address already in use -2023-11-07 00:37:14,694 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:37:17,685 INFO Initializing Server... -2023-11-07 00:37:17,685 ERROR [Errno 48] Address already in use -2023-11-07 00:37:17,686 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:37:20,576 INFO Initializing Server... -2023-11-07 00:37:20,576 ERROR [Errno 48] Address already in use -2023-11-07 00:37:20,577 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:38:11,512 INFO Initializing Server... -2023-11-07 00:38:11,512 INFO Initializing ASR Service... -2023-11-07 00:38:13,046 INFO Initializing ChatGPT Service... -2023-11-07 00:38:13,047 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:38:13,097 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:38:13,342 INFO you have your own api key. Great. -2023-11-07 00:38:13,507 INFO API Chatbot initialized. -2023-11-07 00:38:13,507 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:38:14,265 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:38:14,275 INFO Initializing Sentiment Engine... -2023-11-07 00:38:15,612 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:38:41,905 INFO Connected by ('100.101.36.70', 46156) -2023-11-07 00:38:46,057 INFO WAV file received and saved. -2023-11-07 00:38:48,074 INFO ASR Result: ['你好吗']. time used 0.33. -2023-11-07 00:38:48,673 ERROR Expecting value: line 1 column 1 (char 0) -2023-11-07 00:38:48,698 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 115, in listen - resp_text = self.chat_gpt.ask(ask_text) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 81, in ask - prev_text = self.chatbot.ask(text) - ^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 356, in ask - full_response: str = "".join(response) - ^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 234, in ask_stream - resp: dict = json.loads(line) - ^^^^^^^^^^^^^^^^ - File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/__init__.py", line 346, in loads - return _default_decoder.decode(s) - ^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 337, in decode - obj, end = self.raw_decode(s, idx=_w(s, 0).end()) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 355, in raw_decode - raise JSONDecodeError("Expecting value", s, err.value) from None -json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) - -2023-11-07 00:38:48,699 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:44:51,325 INFO Connected by ('100.101.36.70', 40122) -2023-11-07 00:44:59,945 INFO WAV file received and saved. -2023-11-07 00:45:00,236 INFO ASR Result: ['你好啊']. time used 0.28. -2023-11-07 00:45:00,870 ERROR 404 Not Found - - - - Error response - - -

Error response

-

Error code: 404

-

Message: Not Found.

-

Error code explanation: 404 - Nothing matches the given URI.

- - - -2023-11-07 00:45:00,871 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-07 00:45:04,600 INFO VITS Synth Done, time used 3.73 -2023-11-07 00:45:05,111 INFO WAV SENT, size 596015 -2023-11-07 00:45:46,999 INFO Initializing Server... -2023-11-07 00:45:46,999 ERROR [Errno 48] Address already in use -2023-11-07 00:45:46,999 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:48:04,349 INFO Initializing Server... -2023-11-07 00:48:04,349 INFO Initializing ASR Service... -2023-11-07 00:48:05,826 INFO Initializing ChatGPT Service... -2023-11-07 00:48:05,827 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:48:05,884 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:48:06,084 INFO you have your own api key. Great. -2023-11-07 00:48:06,233 INFO API Chatbot initialized. -2023-11-07 00:48:06,234 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:48:06,891 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:48:06,901 INFO Initializing Sentiment Engine... -2023-11-07 00:48:07,745 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:48:14,776 INFO Connected by ('100.101.36.70', 39596) -2023-11-07 00:48:18,983 INFO WAV file received and saved. -2023-11-07 00:48:20,761 INFO ASR Result: ['你是谁呀']. time used 0.32. -2023-11-07 00:48:21,294 ERROR HTTPConnectionPool(host='75.63.212.152', port=41841): Max retries exceeded with url: /v1 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) -2023-11-07 00:48:21,295 INFO Something wrong with internet, sending: -你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? - -2023-11-07 00:48:24,501 INFO VITS Synth Done, time used 3.20 -2023-11-07 00:48:25,010 INFO WAV SENT, size 539183 -2023-11-07 00:49:13,962 INFO Initializing Server... -2023-11-07 00:49:13,963 ERROR [Errno 48] Address already in use -2023-11-07 00:49:13,963 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 00:49:40,571 INFO Initializing Server... -2023-11-07 00:49:40,571 INFO Initializing ASR Service... -2023-11-07 00:49:42,031 INFO Initializing ChatGPT Service... -2023-11-07 00:49:42,031 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:49:42,081 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:49:42,259 INFO you have your own api key. Great. -2023-11-07 00:49:42,410 INFO API Chatbot initialized. -2023-11-07 00:49:42,411 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:49:43,058 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:49:43,070 INFO Initializing Sentiment Engine... -2023-11-07 00:49:43,976 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:50:24,505 INFO Connected by ('100.101.36.70', 46034) -2023-11-07 00:50:28,583 INFO WAV file received and saved. -2023-11-07 00:50:30,186 INFO ASR Result: ['你好啊']. time used 0.25. -2023-11-07 00:50:34,116 INFO VITS Synth Done, time used 2.24 -2023-11-07 00:50:34,134 INFO Sentiment Engine Infer: 0 -2023-11-07 00:50:34,640 INFO WAV SENT, size 229423 -2023-11-07 00:50:43,853 INFO WAV file received and saved. -2023-11-07 00:50:44,104 INFO ASR Result: ['你是谁呀']. time used 0.23. -2023-11-07 00:50:49,971 INFO VITS Synth Done, time used 2.42 -2023-11-07 00:50:49,997 INFO Sentiment Engine Infer: 0 -2023-11-07 00:50:50,503 INFO WAV SENT, size 443951 -2023-11-07 00:54:21,532 INFO Initializing Server... -2023-11-07 00:54:21,532 INFO Initializing ASR Service... -2023-11-07 00:54:23,167 INFO Initializing ChatGPT Service... -2023-11-07 00:54:23,168 INFO chatGPT prompt: paimon35.txt -2023-11-07 00:54:23,227 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 00:54:23,416 INFO you have your own api key. Great. -2023-11-07 00:54:23,579 INFO API Chatbot initialized. -2023-11-07 00:54:23,579 INFO Initializing TTS Service for character_paimon... -2023-11-07 00:54:24,429 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 00:54:24,440 INFO Initializing Sentiment Engine... -2023-11-07 00:54:25,488 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 00:54:43,603 INFO Connected by ('100.101.36.70', 43594) -2023-11-07 00:54:47,213 INFO WAV file received and saved. -2023-11-07 00:54:48,925 INFO ASR Result: ['你好啊']. time used 0.32. -2023-11-07 00:54:53,961 INFO VITS Synth Done, time used 2.62 -2023-11-07 00:54:53,985 INFO Sentiment Engine Infer: 4 -2023-11-07 00:54:54,491 INFO WAV SENT, size 414767 -2023-11-07 01:02:21,600 INFO Initializing Server... -2023-11-07 01:02:21,600 ERROR [Errno 48] Address already in use -2023-11-07 01:02:21,600 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 01:02:54,007 INFO Initializing Server... -2023-11-07 01:02:54,007 INFO Initializing ASR Service... -2023-11-07 01:02:55,458 INFO Initializing ChatGPT Service... -2023-11-07 01:02:55,458 INFO chatGPT prompt: paimon35.txt -2023-11-07 01:02:55,508 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 01:02:55,700 INFO you have your own api key. Great. -2023-11-07 01:02:55,849 INFO API Chatbot initialized. -2023-11-07 01:02:55,850 INFO Initializing TTS Service for character_paimon... -2023-11-07 01:02:56,543 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 01:02:56,558 INFO Initializing Sentiment Engine... -2023-11-07 01:02:57,995 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 01:03:41,317 INFO Connected by ('100.101.36.70', 48426) -2023-11-07 01:03:44,961 INFO WAV file received and saved. -2023-11-07 01:03:46,717 INFO ASR Result: ['你好啊']. time used 0.32. -2023-11-07 01:03:55,938 INFO VITS Synth Done, time used 4.52 -2023-11-07 01:03:55,976 INFO Sentiment Engine Infer: 0 -2023-11-07 01:03:56,482 INFO WAV SENT, size 787503 -2023-11-07 01:04:08,916 INFO WAV file received and saved. -2023-11-07 01:04:09,169 INFO ASR Result: ['你是谁呀']. time used 0.24. -2023-11-07 01:04:17,429 INFO VITS Synth Done, time used 5.13 -2023-11-07 01:04:17,471 INFO Sentiment Engine Infer: 0 -2023-11-07 01:04:17,977 INFO WAV SENT, size 956463 -2023-11-07 01:04:38,539 INFO WAV file received and saved. -2023-11-07 01:04:38,826 INFO ASR Result: ['你多大了']. time used 0.27. -2023-11-07 01:04:47,507 INFO VITS Synth Done, time used 5.57 -2023-11-07 01:04:47,560 INFO Sentiment Engine Infer: 0 -2023-11-07 01:04:48,166 INFO WAV SENT, size 1093167 -2023-11-07 10:02:31,919 INFO Initializing Server... -2023-11-07 10:02:31,920 ERROR [Errno 48] Address already in use -2023-11-07 10:02:31,920 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-07 10:03:00,151 INFO Initializing Server... -2023-11-07 10:03:00,151 INFO Initializing ASR Service... -2023-11-07 10:03:01,627 INFO Initializing ChatGPT Service... -2023-11-07 10:03:01,628 INFO chatGPT prompt: paimon35.txt -2023-11-07 10:03:01,697 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-07 10:03:01,951 INFO you have your own api key. Great. -2023-11-07 10:03:02,102 INFO API Chatbot initialized. -2023-11-07 10:03:02,103 INFO Initializing TTS Service for character_paimon... -2023-11-07 10:03:02,820 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-07 10:03:02,827 INFO Initializing Sentiment Engine... -2023-11-07 10:03:03,880 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 10:03:08,937 INFO Connected by ('100.101.36.70', 42440) -2023-11-07 10:03:48,592 INFO WAV file received and saved. -2023-11-07 10:03:51,085 INFO ASR Result: ['嗯你好啊']. time used 0.33. -2023-11-07 10:03:56,989 INFO VITS Synth Done, time used 3.28 -2023-11-07 10:03:57,015 INFO Sentiment Engine Infer: 0 -2023-11-07 10:03:57,521 INFO WAV SENT, size 479279 -2023-11-07 10:04:51,565 INFO WAV file received and saved. -2023-11-07 10:04:51,888 INFO ASR Result: ['你叫什么名字']. time used 0.31. -2023-11-07 10:04:58,428 INFO VITS Synth Done, time used 3.95 -2023-11-07 10:04:58,459 INFO Sentiment Engine Infer: 2 -2023-11-07 10:04:58,965 INFO WAV SENT, size 732207 -2023-11-07 10:05:37,070 INFO WAV file received and saved. -2023-11-07 10:05:37,406 INFO ASR Result: ['呃你今天开心吗']. time used 0.32. -2023-11-07 10:05:45,561 INFO VITS Synth Done, time used 5.42 -2023-11-07 10:05:45,592 INFO Sentiment Engine Infer: 2 -2023-11-07 10:05:46,098 INFO WAV SENT, size 778287 -2023-11-07 10:06:08,739 INFO WAV file received and saved. -2023-11-07 10:06:09,101 INFO ASR Result: ['今天你能收到一个红包你开心吗']. time used 0.34. -2023-11-07 10:06:18,676 INFO VITS Synth Done, time used 6.27 -2023-11-07 10:06:18,722 INFO Sentiment Engine Infer: 0 -2023-11-07 10:06:19,358 INFO WAV SENT, size 1211439 -2023-11-07 10:08:05,355 INFO WAV file received and saved. -2023-11-07 10:08:05,615 INFO ASR Result: ['你今年多大了']. time used 0.24. -2023-11-07 10:08:15,586 INFO VITS Synth Done, time used 6.50 -2023-11-07 10:08:15,641 INFO Sentiment Engine Infer: 2 -2023-11-07 10:08:16,192 INFO WAV SENT, size 1268271 -2023-11-07 10:09:15,782 INFO WAV file received and saved. -2023-11-07 10:09:16,126 INFO ASR Result: ['呃你最伤心的是什么时候']. time used 0.33. -2023-11-07 10:09:29,299 INFO VITS Synth Done, time used 8.52 -2023-11-07 10:09:29,367 INFO Sentiment Engine Infer: 0 -2023-11-07 10:09:30,212 INFO WAV SENT, size 1684015 -2023-11-07 10:11:10,356 INFO WAV file received and saved. -2023-11-07 10:11:10,644 INFO ASR Result: ['呃派萌你给我笑一个']. time used 0.27. -2023-11-07 10:11:15,242 INFO VITS Synth Done, time used 2.44 -2023-11-07 10:11:15,261 INFO Sentiment Engine Infer: 2 -2023-11-07 10:11:15,772 INFO WAV SENT, size 459311 -2023-11-07 10:20:05,218 ERROR [Errno 54] Connection reset by peer -2023-11-07 10:20:05,221 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-07 10:20:05,221 INFO Server is listening on 0.0.0.0:38438... -2023-11-07 10:22:03,143 INFO Connected by ('100.101.36.70', 48596) -2023-11-07 10:25:27,750 ERROR [Errno 54] Connection reset by peer -2023-11-07 10:25:27,757 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-07 10:25:27,758 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:03:48,974 INFO Initializing Server... -2023-11-18 19:03:48,975 INFO Initializing ASR Service... -2023-11-18 19:03:50,652 INFO Initializing ChatGPT Service... -2023-11-18 19:03:50,652 INFO chatGPT prompt: paimon35.txt -2023-11-18 19:03:50,718 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-18 19:03:51,172 INFO you have your own api key. Great. -2023-11-18 19:03:56,133 INFO API Chatbot initialized. -2023-11-18 19:03:56,134 INFO Initializing TTS Service for character_paimon... -2023-11-18 19:03:56,827 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-18 19:03:56,837 INFO Initializing Sentiment Engine... -2023-11-18 19:03:58,351 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:04:40,539 INFO Initializing Server... -2023-11-18 19:04:40,539 INFO Initializing ASR Service... -2023-11-18 19:04:42,033 INFO Initializing ChatGPT Service... -2023-11-18 19:04:42,033 INFO chatGPT prompt: paimon35.txt -2023-11-18 19:04:42,090 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-18 19:04:42,262 INFO you have your own api key. Great. -2023-11-18 19:04:42,430 INFO API Chatbot initialized. -2023-11-18 19:04:42,430 INFO Initializing TTS Service for character_paimon... -2023-11-18 19:04:43,108 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-18 19:04:43,124 INFO Initializing Sentiment Engine... -2023-11-18 19:04:44,187 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:05:54,982 INFO Connected by ('100.67.8.121', 54466) -2023-11-18 19:06:04,394 INFO WAV file received and saved. -2023-11-18 19:06:15,834 INFO ASR Result: ['你好啊']. time used 0.38. -2023-11-18 19:06:20,958 INFO VITS Synth Done, time used 2.62 -2023-11-18 19:06:20,987 INFO Sentiment Engine Infer: 4 -2023-11-18 19:06:21,493 INFO WAV SENT, size 378927 -2023-11-18 19:06:36,485 INFO WAV file received and saved. -2023-11-18 19:06:36,766 INFO ASR Result: ['你是谁呀']. time used 0.27. -2023-11-18 19:06:42,482 INFO VITS Synth Done, time used 2.44 -2023-11-18 19:06:42,510 INFO Sentiment Engine Infer: 1 -2023-11-18 19:06:43,016 INFO WAV SENT, size 426543 -2023-11-18 19:06:59,175 INFO WAV file received and saved. -2023-11-18 19:06:59,554 INFO ASR Result: ['你那个你在要做什么呢']. time used 0.36. -2023-11-18 19:07:05,391 INFO VITS Synth Done, time used 2.98 -2023-11-18 19:07:05,481 INFO Sentiment Engine Infer: 2 -2023-11-18 19:07:05,987 INFO WAV SENT, size 517679 -2023-11-18 19:07:17,603 INFO WAV file received and saved. -2023-11-18 19:07:17,987 INFO ASR Result: ['你要不要跟我一起去登山']. time used 0.36. -2023-11-18 19:07:27,703 INFO VITS Synth Done, time used 6.16 -2023-11-18 19:07:27,757 INFO Sentiment Engine Infer: 0 -2023-11-18 19:07:28,333 INFO WAV SENT, size 1131055 -2023-11-18 19:07:51,016 INFO WAV file received and saved. -2023-11-18 19:07:51,544 INFO ASR Result: ['我想要去登泰山那你是走上去呢还是飞上去呢']. time used 0.50. -2023-11-18 19:08:06,046 INFO VITS Synth Done, time used 9.53 -2023-11-18 19:08:06,164 INFO Sentiment Engine Infer: 0 -2023-11-18 19:08:07,010 INFO WAV SENT, size 1785391 -2023-11-18 19:08:36,496 INFO WAV file received and saved. -2023-11-18 19:08:36,995 INFO ASR Result: ['你能登得了吗你到时候在中途你登不动的时候你又要下山我那我到时候怎么办呢']. time used 0.47. -2023-11-18 19:08:55,337 INFO VITS Synth Done, time used 13.26 -2023-11-18 19:08:55,479 INFO Sentiment Engine Infer: 0 -2023-11-18 19:08:56,410 INFO WAV SENT, size 2185263 -2023-11-18 19:09:28,428 INFO WAV file received and saved. -2023-11-18 19:09:28,969 INFO ASR Result: ['嗯你好好锻炼身体吧你锻炼好身体然后我们明天再去登山']. time used 0.51. -2023-11-18 19:09:30,790 ERROR 400 Bad Request { - "error": { - "message": "-2 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:09:30,791 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:09:33,865 INFO VITS Synth Done, time used 3.07 -2023-11-18 19:09:34,377 INFO WAV SENT, size 581167 -2023-11-18 19:11:39,011 INFO WAV file received and saved. -2023-11-18 19:11:39,470 INFO ASR Result: ['我看一下呃你我们来玩个文字冒险游戏好吗']. time used 0.42. -2023-11-18 19:11:40,592 ERROR 400 Bad Request { - "error": { - "message": "-28 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:11:40,593 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:11:44,679 INFO VITS Synth Done, time used 4.09 -2023-11-18 19:11:45,188 INFO WAV SENT, size 581679 -2023-11-18 19:12:00,198 ERROR [Errno 32] Broken pipe -2023-11-18 19:12:00,202 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file - self.conn.send(b'sb') -BrokenPipeError: [Errno 32] Broken pipe - -2023-11-18 19:12:00,204 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:12:03,265 INFO Connected by ('100.67.8.121', 54534) -2023-11-18 19:12:12,545 INFO WAV file received and saved. -2023-11-18 19:12:12,933 INFO ASR Result: ['潘们你会玩游戏吗']. time used 0.36. -2023-11-18 19:12:14,003 ERROR 400 Bad Request { - "error": { - "message": "-41 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:12:14,005 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:12:17,103 INFO VITS Synth Done, time used 3.10 -2023-11-18 19:12:17,610 INFO WAV SENT, size 584751 -2023-11-18 19:12:30,259 INFO Initializing Server... -2023-11-18 19:12:30,260 ERROR [Errno 48] Address already in use -2023-11-18 19:12:30,260 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-18 19:13:58,805 INFO Initializing Server... -2023-11-18 19:13:58,808 INFO Initializing ASR Service... -2023-11-18 19:14:00,607 INFO Initializing ChatGPT Service... -2023-11-18 19:14:00,608 INFO chatGPT prompt: paimon35.txt -2023-11-18 19:14:00,671 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-18 19:14:00,910 INFO you have your own api key. Great. -2023-11-18 19:14:01,082 INFO API Chatbot initialized. -2023-11-18 19:14:01,082 INFO Initializing TTS Service for character_paimon... -2023-11-18 19:14:01,774 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-18 19:14:01,784 INFO Initializing Sentiment Engine... -2023-11-18 19:14:03,391 INFO Server is listening on 0.0.0.0:38438... -2023-11-18 19:14:17,684 INFO Connected by ('100.67.8.121', 54548) -2023-11-18 19:14:23,441 INFO WAV file received and saved. -2023-11-18 19:14:25,299 INFO ASR Result: ['晚上好']. time used 0.34. -2023-11-18 19:14:33,770 INFO VITS Synth Done, time used 2.70 -2023-11-18 19:14:33,791 INFO Sentiment Engine Infer: 0 -2023-11-18 19:14:34,297 INFO WAV SENT, size 416815 -2023-11-18 19:14:45,067 INFO WAV file received and saved. -2023-11-18 19:14:45,447 INFO ASR Result: ['我一点都不饿我现在想要玩游戏']. time used 0.36. -2023-11-18 19:15:02,543 INFO VITS Synth Done, time used 5.91 -2023-11-18 19:15:02,625 INFO Sentiment Engine Infer: 2 -2023-11-18 19:15:03,185 INFO WAV SENT, size 1081903 -2023-11-18 19:15:22,101 INFO WAV file received and saved. -2023-11-18 19:15:22,501 INFO ASR Result: ['你我们来玩一个文字冒险游戏可以吗']. time used 0.38. -2023-11-18 19:15:27,507 ERROR HTTPSConnectionPool(host='translation.googleapis.com', port=443): Max retries exceeded with url: /language/translate/v2?target=EN&key=AIzaSyDPKOFt2ZN0Ncg176DzjkoixtmwX18puD4&q=%E4%BD%A0%E6%88%91%E4%BB%AC%E6%9D%A5%E7%8E%A9%E4%B8%80%E4%B8%AA%E6%96%87%E5%AD%97%E5%86%92%E9%99%A9%E6%B8%B8%E6%88%8F%E5%8F%AF%E4%BB%A5%E5%90%97 (Caused by ProxyError('Cannot connect to proxy.', ConnectionResetError(54, 'Connection reset by peer'))) -2023-11-18 19:15:27,508 INFO Something wrong with internet, sending: -你等一下,我连接不上大脑了。你是不是网有问题,或者是账号填错了? - -2023-11-18 19:15:30,447 INFO VITS Synth Done, time used 2.94 -2023-11-18 19:15:30,957 INFO WAV SENT, size 537647 -2023-11-18 19:15:44,452 INFO WAV file received and saved. -2023-11-18 19:15:44,797 INFO ASR Result: ['没有啊']. time used 0.32. -2023-11-18 19:15:55,076 INFO VITS Synth Done, time used 3.53 -2023-11-18 19:15:55,113 INFO Sentiment Engine Infer: 2 -2023-11-18 19:15:55,616 INFO WAV SENT, size 546863 -2023-11-18 19:16:08,697 INFO WAV file received and saved. -2023-11-18 19:16:09,136 INFO ASR Result: ['我们现在玩一个文字冒险游戏好吗']. time used 0.42. -2023-11-18 19:16:28,975 INFO VITS Synth Done, time used 6.15 -2023-11-18 19:16:29,086 INFO Sentiment Engine Infer: 0 -2023-11-18 19:16:29,634 INFO WAV SENT, size 1060399 -2023-11-18 19:16:51,017 INFO WAV file received and saved. -2023-11-18 19:16:51,497 INFO ASR Result: ['我们玩一个去森林里面冒险的游戏你觉得如何']. time used 0.44. -2023-11-18 19:17:21,971 INFO VITS Synth Done, time used 13.88 -2023-11-18 19:17:22,065 INFO Sentiment Engine Infer: 0 -2023-11-18 19:17:22,900 INFO WAV SENT, size 1540143 -2023-11-18 19:17:44,336 INFO WAV file received and saved. -2023-11-18 19:17:44,731 INFO ASR Result: ['我已经准备好了']. time used 0.38. -2023-11-18 19:18:10,553 INFO VITS Synth Done, time used 8.93 -2023-11-18 19:18:10,657 INFO Sentiment Engine Infer: 0 -2023-11-18 19:18:11,342 INFO WAV SENT, size 1571375 -2023-11-18 19:18:43,776 INFO WAV file received and saved. -2023-11-18 19:18:44,205 INFO ASR Result: ['你是不是还没有说完请继续']. time used 0.40. -2023-11-18 19:18:45,522 ERROR 400 Bad Request { - "error": { - "message": "-21 is less than the minimum of 1 - 'max_tokens'", - "type": "invalid_request_error", - "param": null, - "code": null - } -} - -2023-11-18 19:18:45,523 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-18 19:18:48,835 INFO VITS Synth Done, time used 3.31 -2023-11-18 19:18:49,346 INFO WAV SENT, size 590383 -2023-11-18 19:24:14,842 ERROR [Errno 32] Broken pipe -2023-11-18 19:24:14,849 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 161, in __receive_file - self.conn.send(b'sb') -BrokenPipeError: [Errno 32] Broken pipe - -2023-11-18 19:24:14,850 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:33:47,379 INFO Initializing Server... -2023-11-19 16:33:47,380 INFO Initializing ASR Service... -2023-11-19 16:33:49,060 INFO Initializing ChatGPT Service... -2023-11-19 16:33:49,061 INFO chatGPT prompt: paimon35.txt -2023-11-19 16:33:49,146 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 16:33:49,506 INFO you have your own api key. Great. -2023-11-19 16:33:49,682 INFO API Chatbot initialized. -2023-11-19 16:33:49,682 INFO Initializing TTS Service for character_paimon... -2023-11-19 16:33:50,374 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 16:33:50,382 INFO Initializing Sentiment Engine... -2023-11-19 16:33:51,784 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:34:51,579 INFO Connected by ('100.67.8.121', 58508) -2023-11-19 16:35:18,809 ERROR [Errno 54] Connection reset by peer -2023-11-19 16:35:18,811 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 103, in listen - file = self.__receive_file() - ^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 159, in __receive_file - data = self.conn.recv(1024) - ^^^^^^^^^^^^^^^^^^^^ -ConnectionResetError: [Errno 54] Connection reset by peer - -2023-11-19 16:35:18,812 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:35:24,069 INFO Connected by ('100.67.8.121', 58530) -2023-11-19 16:35:28,394 INFO WAV file received and saved. -2023-11-19 16:35:37,126 INFO ASR Result: ['你好啊']. time used 0.23. -2023-11-19 16:35:43,058 INFO VITS Synth Done, time used 3.34 -2023-11-19 16:35:43,086 INFO Sentiment Engine Infer: 0 -2023-11-19 16:35:43,592 INFO WAV SENT, size 564271 -2023-11-19 16:35:54,331 INFO WAV file received and saved. -2023-11-19 16:35:54,653 INFO ASR Result: ['你是谁呀']. time used 0.30. -2023-11-19 16:35:59,976 INFO VITS Synth Done, time used 2.77 -2023-11-19 16:36:00,001 INFO Sentiment Engine Infer: 0 -2023-11-19 16:36:00,507 INFO WAV SENT, size 527407 -2023-11-19 16:56:41,529 INFO Initializing Server... -2023-11-19 16:56:41,530 INFO Initializing ASR Service... -2023-11-19 16:56:43,373 INFO Initializing ChatGPT Service... -2023-11-19 16:56:43,373 INFO chatGPT prompt: paimon35.txt -2023-11-19 16:56:43,448 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 16:56:43,725 INFO you have your own api key. Great. -2023-11-19 16:56:43,895 ERROR System prompt is too long -2023-11-19 16:56:43,905 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 85, in __init__ - self.chat_gpt = GPTService.GPTService(args) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/GPT/GPTService.py", line 57, in __init__ - self.chatbot = Chatbot(api_key=api_key, proxy=args.proxy, system_prompt=self.tune, max_tokens=512) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/Users/yth/GitHub/venv/lib/python3.11/site-packages/revChatGPT/V3.py", line 124, in __init__ - raise t.ActionRefuseError("System prompt is too long") -revChatGPT.typings.ActionRefuseError: System prompt is too long -The current operation is not allowed, which may be intentional -Please check that the input is correct, or you can resolve this issue by filing an issue -Project URL: https://github.com/acheong08/ChatGPT - -2023-11-19 16:58:07,734 INFO Initializing Server... -2023-11-19 16:58:07,734 INFO Initializing ASR Service... -2023-11-19 16:58:09,069 INFO Initializing ChatGPT Service... -2023-11-19 16:58:09,070 INFO chatGPT prompt: paimon35.txt -2023-11-19 16:58:09,123 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 16:58:09,301 INFO you have your own api key. Great. -2023-11-19 16:58:09,469 INFO API Chatbot initialized. -2023-11-19 16:58:09,469 INFO Initializing TTS Service for character_paimon... -2023-11-19 16:58:10,197 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 16:58:10,207 INFO Initializing Sentiment Engine... -2023-11-19 16:58:11,357 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 16:58:19,222 INFO Connected by ('100.67.8.121', 58740) -2023-11-19 16:58:22,810 INFO WAV file received and saved. -2023-11-19 16:58:25,246 INFO ASR Result: ['你好啊啊']. time used 0.28. -2023-11-19 16:58:26,700 ERROR 400 Bad Request { - "error": { - "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", - "type": "invalid_request_error", - "param": "messages", - "code": "context_length_exceeded" - } -} - -2023-11-19 16:58:26,701 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-19 16:58:30,308 INFO VITS Synth Done, time used 3.61 -2023-11-19 16:58:30,818 INFO WAV SENT, size 592431 -2023-11-19 16:59:44,439 INFO Initializing Server... -2023-11-19 16:59:44,439 ERROR [Errno 48] Address already in use -2023-11-19 16:59:44,440 ERROR Traceback (most recent call last): - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 198, in - s = Server(args) - ^^^^^^^^^^^^ - File "/Users/yth/GitHub/Digital_Life_Server_custom/SocketServer.py", line 69, in __init__ - self.s.bind((self.host, self.port)) -OSError: [Errno 48] Address already in use - -2023-11-19 17:00:18,236 INFO Initializing Server... -2023-11-19 17:00:18,236 INFO Initializing ASR Service... -2023-11-19 17:00:19,749 INFO Initializing ChatGPT Service... -2023-11-19 17:00:19,750 INFO chatGPT prompt: paimon35.txt -2023-11-19 17:00:19,812 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 17:00:19,987 INFO you have your own api key. Great. -2023-11-19 17:00:20,143 INFO API Chatbot initialized. -2023-11-19 17:00:20,143 INFO Initializing TTS Service for character_paimon... -2023-11-19 17:00:20,806 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 17:00:20,814 INFO Initializing Sentiment Engine... -2023-11-19 17:00:22,037 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 17:00:25,242 INFO Connected by ('100.67.8.121', 58762) -2023-11-19 17:00:28,937 INFO WAV file received and saved. -2023-11-19 17:00:30,665 INFO ASR Result: ['你是谁呀']. time used 0.35. -2023-11-19 17:00:31,657 ERROR 400 Bad Request { - "error": { - "message": "This model's maximum context length is 4097 tokens. However, you requested 15994 tokens (1446 in the messages, 14548 in the completion). Please reduce the length of the messages or completion.", - "type": "invalid_request_error", - "param": "messages", - "code": "context_length_exceeded" - } -} - -2023-11-19 17:00:31,658 INFO API rate limit exceeded, sending: -你问的太多了,我们的毛都被你撸秃了,你自己去准备一个API,或者一小时后再来吧。 - -2023-11-19 17:00:35,172 INFO VITS Synth Done, time used 3.51 -2023-11-19 17:00:35,681 INFO WAV SENT, size 585263 -2023-11-19 17:35:16,842 INFO Initializing Server... -2023-11-19 17:35:16,843 INFO Initializing ASR Service... -2023-11-19 17:35:18,421 INFO Initializing ChatGPT Service... -2023-11-19 17:35:18,421 INFO chatGPT prompt: paimon35.txt -2023-11-19 17:35:18,475 INFO machine identifier: 92:73:33:81:a7:50 -2023-11-19 17:35:18,702 INFO you have your own api key. Great. -2023-11-19 17:35:18,869 INFO API Chatbot initialized. -2023-11-19 17:35:18,870 INFO Initializing TTS Service for character_paimon... -2023-11-19 17:35:19,680 INFO Loaded checkpoint 'TTS/models/paimon6k_390k.pth' (iteration 8864) -2023-11-19 17:35:19,691 INFO Initializing Sentiment Engine... -2023-11-19 17:35:21,168 INFO Server is listening on 0.0.0.0:38438... -2023-11-19 17:35:37,731 INFO Connected by ('100.67.8.121', 58878) -2023-11-19 17:35:51,113 INFO WAV file received and saved. -2023-11-19 17:35:53,004 INFO ASR Result: ['你好啊']. time used 0.24. -2023-11-19 17:36:06,543 INFO VITS Synth Done, time used 4.00 -2023-11-19 17:36:06,576 INFO Sentiment Engine Infer: 0 -2023-11-19 17:36:07,082 INFO WAV SENT, size 694831 From cb7c6a5d8af778fb46f47a9301709b105d22e1d3 Mon Sep 17 00:00:00 2001 From: mike Date: Fri, 1 Dec 2023 15:05:59 +0000 Subject: [PATCH 17/17] playground works using python -m TTS.playground --- TTS/__init__.py | 0 TTS/__pycache__/TTService.cpython-310.pyc | Bin 0 -> 2346 bytes TTS/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 141 bytes .../playground-save.cpython-310.pyc | Bin 0 -> 1108 bytes TTS/__pycache__/playground.cpython-310.pyc | Bin 0 -> 1027 bytes TTS/__pycache__/playground3.cpython-310.pyc | Bin 0 -> 1124 bytes TTS/__pycache__/playground4.cpython-310.pyc | Bin 0 -> 936 bytes TTS/playground.py | 9 ++-- TTS/playground4.py | 39 ++++++++++++++++++ audio.mp3 | Bin 7750 -> 0 bytes audio.wav | Bin 79404 -> 0 bytes 11 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 TTS/__init__.py create mode 100644 TTS/__pycache__/TTService.cpython-310.pyc create mode 100644 TTS/__pycache__/__init__.cpython-310.pyc create mode 100644 TTS/__pycache__/playground-save.cpython-310.pyc create mode 100644 TTS/__pycache__/playground.cpython-310.pyc create mode 100644 TTS/__pycache__/playground3.cpython-310.pyc create mode 100644 TTS/__pycache__/playground4.cpython-310.pyc create mode 100644 TTS/playground4.py delete mode 100644 audio.mp3 delete mode 100644 audio.wav diff --git a/TTS/__init__.py b/TTS/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/TTS/__pycache__/TTService.cpython-310.pyc b/TTS/__pycache__/TTService.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a63edc33c25e57e1d4004747e6c63908bc22ed3e GIT binary patch literal 2346 zcmZuy&2Jk;6rb6hwb!39ueLPPW8_|A8|SSB@ibLL7QR;#jE4d$Vb1DrPkw?_=J~zTbOq(nh07pndsU zD6WxR{bHtlD#+NH+uT}ETJTt(86BtZa9cRz5@%NmNx5G( z5;v|`gp#=0uO9BH9dhdZy5TrcBX0JaW?hPw;#R+9*5&9#-0rszcP;mq#q#{*g3MRM z^7s_q0Or%U=I$fBPlZ<>lKz?Z39s?`L&EC^R)3Y#Ez)f~hJPWOGk1G?YkfD&l%^MT z?UUQvAAfq|1MkC)?Jm{Lt-T~02^G$S+?EM&%4#p(Nh1ZzRwnLeUY2@F+?|Rf5WsUH zu`8m$Leqy0eaE2RfUYjWkdd6^bWF$Afwga$l`T(XZ0_V1rwia^rFl6Ae}dG4n_8Qa z!oIF6OE781{mj=5b9xX7KM_*tiqE;X6Zy#|ZRaqLZ zqvxOlFAPL)vZvjl0FQvp(_lbhOf{)X>$FN4l_!A=pdV}Ksq4_yYcL4Xr=0Y`3)}+K zY;JP~Gvf{~!R+udc*E6|qcZ~sc0F(C9Hfn-AHX6bbINIMpCT9-83bug7c?gx%NdML zR?5nmdjOm<8&}3vZmkh+p9Xkh%wu8x3I|&>K*ATmYq?e-9=Uy-p!JSD8G1V<; zrbILV)xl7n!?Rd0@}+zQm((-iQw+<A^WPIZ!S}kTXP4BM2Xvw zR5tJ-z2+`bLx>2J?L$Oh4CHpsI0PI}HC}oI1#Fe@@+ukEjfDnSX(HmELqTKk9oS&q z*&>&SdiNeg8Gg5+Bd_ajKA{h$HeB(~pT06VJpAj|k9JyL{Bdpg{dd@YxdvHSOVUsY zPX&G?bmIlWyQk{~dWEoS86!nCSkh%FCXpWqlUXJlWCPC9T&XB(J^SlK%_(?ne8WMM2iQzdxk zeDCrA!y7sBZ8%C-R60#KCY*Ne$q*9i46x-Y496VgqDtb&LR(5gTA~GQ`O}wuQo-Nz zl)o$91QQAa*@gPp1gFfFk2}F=ZNhaRfzYz&>8j^JmQEvF*FEp<)Q<{@d;@QVHy@O3p+OgE0n%;RUA zuPaaxZ$YILQo9P4_~vT1vH9M|y0+u1Fu0K>gK${n1^)H_xkI~G3Rhmm;;XQXx!{w! Xg`kf-es;Q$h4&5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H4eo=mYiM~r_ zdS*#tPP|WMT55c7YEfBgQG9Y~aY=rzen?2LetdjpUS>&ryk0@&Ee@O9{FKt1R6CGK K#Y{kgg#iFc{U5gg literal 0 HcmV?d00001 diff --git a/TTS/__pycache__/playground-save.cpython-310.pyc b/TTS/__pycache__/playground-save.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c87abff4786ef65149161edcfe27260d22db4cf0 GIT binary patch literal 1108 zcmZWn&yUl*m$tC&Zd-QwRn37NmP#Nbgo;#gLKRY1LPS(iHhwdk*(45$ zv%|~*ksZVVfqI4unNw9jAmG%h;t%oFm0Sq{rVX zgkMaARINNYI$F7|SN;k{h#`g}0 ztthmh%}hoX)V08qeb%J0~@R;cEl1%n? z`&71uJd1rHtzh3z5{Pn1GhcvgE$`1Z-Y!_kH*^0G*k)b?0p$6xh@$DH;QgzT>Ubc{ zq=?h0BuOgU>C~@1GNUGO0-g-Rkr(iIk4qyMj-(lL29d3=^^Q znlxhnW7+a^F-<{s8$xesp*)2|TKYvN%sGhU31$#A$CBC6wuYi%>rS#zK%?ifE%@G4 zf1~WA{yP!(#kE&uD;N5Ku{4{DvYQK@dZ%YW#B-1x0a+X-b?wbG(;3}E*^aJZv;Fn@ zvT1IFqfq#f_ii`@ukJO-yr9t0;(_kHK^pnfQO1jey%%n}8q$Q3#$S2w4ytrRkk|GuxByuC}{o z$JtYQCwLGgXLGUV6r!Strv&j2sgqIx-MbeB!Ph;j1gz#&y^s3+>b=)b_IfVC^~y!Gdu`S;cOjt2bxX&pOd_sL2>>K2x{6prq{5EiC zL0i~@ExGT2RdrUxcfqN;qP3#F2kx{7)^tNKaHi*`{pmBJEu1g7e;&N*Szyx(D_T8= zm_D4Zo`?R5;wv40Q!sx^xc=Br0T(@=&snk9sdek zsa}Mwng_L);NqF~GHjn|ufR_A>Wb9X`&ct4oGdL$QfH48cjxG>zYkD8-W2o}8F;64 z&u*S#kH~=P&i?)_$d95C4A}AJFqcvdk0MnB$A`ltx-EC7g-nkx{XY=wU3=s9Zl(@3 zS5T*tVvOCVh1lII+6s2RS z?I=}yuWKs_KhfPL$6)Pou>3Q|0#y1GBdD5m&FEpQA#GCbHu*Gmq1#FxEbzBJB>4~< z)@*-WT@S&HXcDO~4&IH%5Y)2+c`%w4N+v^`rC}C_i%BkLso2HdJJ+$Vvl!m2$E~=I vn?oGtP>-<<{)cyNgF4hjVU4u@?%OWqj9VPN+t!BVG8eVJb@@+rhoAlfa;jBU literal 0 HcmV?d00001 diff --git a/TTS/__pycache__/playground3.cpython-310.pyc b/TTS/__pycache__/playground3.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..232952b30057151f8b4c73f1a77b11c90458f9e3 GIT binary patch literal 1124 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 M0f6X#vB&WL09i-n^Z)<= diff --git a/audio.wav b/audio.wav deleted file mode 100644 index eefee3b6df048fed88571fb66581305d09e6fa6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79404 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 hM9zMW-g{{qvB-yHw|