From 94ed5969fa1bfd439a20a3cdaed9d5289f783637 Mon Sep 17 00:00:00 2001
From: KP <109694228@qq.com>
Date: Tue, 22 Feb 2022 12:38:52 +0800
Subject: [PATCH] Add cli logger control.

---
 paddlespeech/cli/asr/infer.py  | 16 +++++++++++-----
 paddlespeech/cli/cls/infer.py  | 16 +++++++++++-----
 paddlespeech/cli/executor.py   | 23 ++++++++++++++++++++---
 paddlespeech/cli/st/infer.py   | 16 +++++++++++-----
 paddlespeech/cli/text/infer.py | 16 +++++++++++-----
 paddlespeech/cli/tts/infer.py  | 17 ++++++++++++-----
 6 files changed, 76 insertions(+), 28 deletions(-)

diff --git a/paddlespeech/cli/asr/infer.py b/paddlespeech/cli/asr/infer.py
index 72edd9d14..1304c511f 100644
--- a/paddlespeech/cli/asr/infer.py
+++ b/paddlespeech/cli/asr/infer.py
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
-import ast
 import os
 import sys
 from collections import OrderedDict
@@ -183,10 +182,15 @@ class ASRExecutor(BaseExecutor):
             default=paddle.get_device(),
             help='Choose device to execute model inference.')
         self.parser.add_argument(
+            '-d',
             '--job_dump_result',
-            type=ast.literal_eval,
-            default=False,
+            action='store_true',
             help='Save job result into file.')
+        self.parser.add_argument(
+            '-v',
+            '--verbose',
+            action='store_true',
+            help='Increase logger verbosity of current task.')
 
     def _get_pretrained_path(self, tag: str) -> os.PathLike:
         """
@@ -479,7 +483,9 @@ class ASRExecutor(BaseExecutor):
         decode_method = parser_args.decode_method
         force_yes = parser_args.yes
         device = parser_args.device
-        job_dump_result = parser_args.job_dump_result
+
+        if not args.verbose:
+            self.disable_task_loggers()
 
         task_source = self.get_task_source(parser_args.input)
         task_results = OrderedDict()
@@ -495,7 +501,7 @@ class ASRExecutor(BaseExecutor):
                 task_results[id_] = f'{e.__class__.__name__}: {e}'
 
         self.process_task_results(parser_args.input, task_results,
-                                  job_dump_result)
+                                  args.job_dump_result)
 
         if has_exceptions:
             return False
diff --git a/paddlespeech/cli/cls/infer.py b/paddlespeech/cli/cls/infer.py
index e5d4b546f..d74645cb5 100644
--- a/paddlespeech/cli/cls/infer.py
+++ b/paddlespeech/cli/cls/infer.py
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
-import ast
 import os
 from collections import OrderedDict
 from typing import List
@@ -112,10 +111,15 @@ class CLSExecutor(BaseExecutor):
             default=paddle.get_device(),
             help='Choose device to execute model inference.')
         self.parser.add_argument(
+            '-d',
             '--job_dump_result',
-            type=ast.literal_eval,
-            default=False,
+            action='store_true',
             help='Save job result into file.')
+        self.parser.add_argument(
+            '-v',
+            '--verbose',
+            action='store_true',
+            help='Increase logger verbosity of current task.')
 
     def _get_pretrained_path(self, tag: str) -> os.PathLike:
         """
@@ -243,7 +247,9 @@ class CLSExecutor(BaseExecutor):
         ckpt_path = parser_args.ckpt_path
         topk = parser_args.topk
         device = parser_args.device
-        job_dump_result = parser_args.job_dump_result
+
+        if not args.verbose:
+            self.disable_task_loggers()
 
         task_source = self.get_task_source(parser_args.input)
         task_results = OrderedDict()
@@ -259,7 +265,7 @@ class CLSExecutor(BaseExecutor):
                 task_results[id_] = f'{e.__class__.__name__}: {e}'
 
         self.process_task_results(parser_args.input, task_results,
-                                  job_dump_result)
+                                  args.job_dump_result)
 
         if has_exceptions:
             return False
diff --git a/paddlespeech/cli/executor.py b/paddlespeech/cli/executor.py
index d81f8f9fd..d77d27b03 100644
--- a/paddlespeech/cli/executor.py
+++ b/paddlespeech/cli/executor.py
@@ -11,6 +11,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+import logging
 import os
 import sys
 from abc import ABC
@@ -149,10 +150,16 @@ class BaseExecutor(ABC):
             job_dump_result (bool, optional): if True, dumps job results into file. Defaults to False.
         """
 
-        raw_text = self._format_task_results(results)
-        print(raw_text, end='')
+        if not self._is_job_input(input_) and len(
+                results) == 1:  # Only one input sample
+            raw_text = list(results.values())[0]
+        else:
+            raw_text = self._format_task_results(results)
+
+        print(raw_text, end='')  # Stdout
 
-        if self._is_job_input(input_) and job_dump_result:
+        if self._is_job_input(
+                input_) and job_dump_result:  # Dump to *.job.done 
             try:
                 job_output_file = os.path.abspath(input_) + '.done'
                 sys.stdout = open(job_output_file, 'w')
@@ -209,3 +216,13 @@ class BaseExecutor(ABC):
         for k, v in results.items():
             ret += f'{k} {v}\n'
         return ret
+
+    def disable_task_loggers(self):
+        """
+        Disable all loggers in current task.
+        """
+        loggers = [
+            logging.getLogger(name) for name in logging.root.manager.loggerDict
+        ]
+        for l in loggers:
+            l.disabled = True
diff --git a/paddlespeech/cli/st/infer.py b/paddlespeech/cli/st/infer.py
index a11509ea7..1e4dedd0f 100644
--- a/paddlespeech/cli/st/infer.py
+++ b/paddlespeech/cli/st/infer.py
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
-import ast
 import os
 import subprocess
 from collections import OrderedDict
@@ -110,10 +109,15 @@ class STExecutor(BaseExecutor):
             default=paddle.get_device(),
             help="Choose device to execute model inference.")
         self.parser.add_argument(
+            '-d',
             '--job_dump_result',
-            type=ast.literal_eval,
-            default=False,
+            action='store_true',
             help='Save job result into file.')
+        self.parser.add_argument(
+            '-v',
+            '--verbose',
+            action='store_true',
+            help='Increase logger verbosity of current task.')
 
     def _get_pretrained_path(self, tag: str) -> os.PathLike:
         """
@@ -327,7 +331,9 @@ class STExecutor(BaseExecutor):
         config = parser_args.config
         ckpt_path = parser_args.ckpt_path
         device = parser_args.device
-        job_dump_result = parser_args.job_dump_result
+
+        if not args.verbose:
+            self.disable_task_loggers()
 
         task_source = self.get_task_source(parser_args.input)
         task_results = OrderedDict()
@@ -343,7 +349,7 @@ class STExecutor(BaseExecutor):
                 task_results[id_] = f'{e.__class__.__name__}: {e}'
 
         self.process_task_results(parser_args.input, task_results,
-                                  job_dump_result)
+                                  args.job_dump_result)
 
         if has_exceptions:
             return False
diff --git a/paddlespeech/cli/text/infer.py b/paddlespeech/cli/text/infer.py
index cc902be26..f57ce6b7e 100644
--- a/paddlespeech/cli/text/infer.py
+++ b/paddlespeech/cli/text/infer.py
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
-import ast
 import os
 import re
 from collections import OrderedDict
@@ -122,10 +121,15 @@ class TextExecutor(BaseExecutor):
             default=paddle.get_device(),
             help='Choose device to execute model inference.')
         self.parser.add_argument(
+            '-d',
             '--job_dump_result',
-            type=ast.literal_eval,
-            default=False,
+            action='store_true',
             help='Save job result into file.')
+        self.parser.add_argument(
+            '-v',
+            '--verbose',
+            action='store_true',
+            help='Increase logger verbosity of current task.')
 
     def _get_pretrained_path(self, tag: str) -> os.PathLike:
         """
@@ -270,7 +274,9 @@ class TextExecutor(BaseExecutor):
         ckpt_path = parser_args.ckpt_path
         punc_vocab = parser_args.punc_vocab
         device = parser_args.device
-        job_dump_result = parser_args.job_dump_result
+
+        if not args.verbose:
+            self.disable_task_loggers()
 
         task_source = self.get_task_source(parser_args.input)
         task_results = OrderedDict()
@@ -286,7 +292,7 @@ class TextExecutor(BaseExecutor):
                 task_results[id_] = f'{e.__class__.__name__}: {e}'
 
         self.process_task_results(parser_args.input, task_results,
-                                  job_dump_result)
+                                  args.job_dump_result)
 
         if has_exceptions:
             return False
diff --git a/paddlespeech/cli/tts/infer.py b/paddlespeech/cli/tts/infer.py
index 3f650c40a..ba15d6524 100644
--- a/paddlespeech/cli/tts/infer.py
+++ b/paddlespeech/cli/tts/infer.py
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
-import ast
 import os
 from collections import OrderedDict
 from typing import Any
@@ -400,10 +399,15 @@ class TTSExecutor(BaseExecutor):
         self.parser.add_argument(
             '--output', type=str, default='output.wav', help='output file name')
         self.parser.add_argument(
+            '-d',
             '--job_dump_result',
-            type=ast.literal_eval,
-            default=False,
+            action='store_true',
             help='Save job result into file.')
+        self.parser.add_argument(
+            '-v',
+            '--verbose',
+            action='store_true',
+            help='Increase logger verbosity of current task.')
 
     def _get_pretrained_path(self, tag: str) -> os.PathLike:
         """
@@ -693,7 +697,9 @@ class TTSExecutor(BaseExecutor):
         lang = args.lang
         device = args.device
         spk_id = args.spk_id
-        job_dump_result = args.job_dump_result
+
+        if not args.verbose:
+            self.disable_task_loggers()
 
         task_source = self.get_task_source(args.input)
         task_results = OrderedDict()
@@ -733,7 +739,8 @@ class TTSExecutor(BaseExecutor):
                 has_exceptions = True
                 task_results[id_] = f'{e.__class__.__name__}: {e}'
 
-        self.process_task_results(args.input, task_results, job_dump_result)
+        self.process_task_results(args.input, task_results,
+                                  args.job_dump_result)
 
         if has_exceptions:
             return False