File size: 2,880 Bytes
2b7fd6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# -*- coding: utf-8 -*-
import argparse
import logging
import logging.handlers
import os
import tornado.ioloop
import tornado.web
import config
import api.main
import api.svc
import api.tool
import api.vm

logger = logging.getLogger(__name__)

BASE_PATH = os.path.dirname(os.path.realpath(__file__))
WEB_ROOT = os.path.join(BASE_PATH, 'frontend', 'dist')
LOG_FILE_NAME = os.path.join(BASE_PATH, 'log', 'sovits-webui.log')

routes = [
    (r'/api/svc/model', api.svc.ModelListHandler),
    (r'/api/svc/switch', api.svc.SwitchHandler),
    (r'/api/svc/run', api.svc.SingleInferenceHandler),
    (r'/api/svc/batch', api.svc.BatchInferenceHandler),

    (r'/api/vm/run', api.vm.VocalRemoverHandler),

    (r'/api/tool/norm', api.tool.AudioNormalizerHandler),

    (r'/(.*)', api.main.MainHandler, {'path': WEB_ROOT, 'default_filename': 'index.html'})
]


def main():
    args = parse_args()

    init_logging(args.debug)
    config.init()
    api.svc.init()

    run_server(args.host, args.port, args.debug)


def parse_args():
    parser = argparse.ArgumentParser(description="SOVITS WEBUI")
    parser.add_argument('--host', help='Server host, default to 127.0.0.1', default='127.0.0.1')
    parser.add_argument('--port', help='Server port, default to 7870', type=int, default=7870)
    parser.add_argument('--debug', help='debug mode', action='store_true')
    return parser.parse_args()


def init_logging(debug):
    stream_handler = logging.StreamHandler()
    file_handler = logging.handlers.TimedRotatingFileHandler(
        LOG_FILE_NAME, encoding='utf-8', when='midnight', backupCount=7, delay=True
    )
    # noinspection PyArgumentList
    logging.basicConfig(
        format='{asctime} {levelname} [{name}]: {message}',
        datefmt='%Y-%m-%d %H:%M:%S',
        style='{',
        level=logging.INFO if not debug else logging.DEBUG,
        handlers=[stream_handler, file_handler]
    )

    # 屏蔽访问日志
    logging.getLogger('tornado.access').setLevel(logging.WARNING)


def run_server(host, port, debug):
    app = tornado.web.Application(
        routes,
        websocket_ping_interval=10,
        debug=debug,
        autoreload=True
    )
    cfg = config.get_config()
    try:
        app.listen(
            port=port,
            address=host,
            xheaders=cfg.tornado_xheaders
        )
    except OSError:
        logger.warning('Address is used %s:%d', host, port)
        return
    # finally:
    #     url = f'http://{host}/' if port == 80 else f'http://{host}:{port}/'
    #     # 防止更新版本后浏览器加载缓存
    #     url += '?_v=' + update.VERSION
    #     webbrowser.open(url)
    logger.info('Server started: %s:%d', host, port)
    try:
        tornado.ioloop.IOLoop.current().start()
    except KeyboardInterrupt:
        tornado.ioloop.IOLoop.current().instance().stop()


if __name__ == '__main__':
    main()