2022-09-20 17:49:31 +08:00
|
|
|
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
|
|
|
|
2022-06-17 19:56:11 +08:00
|
|
|
import os.path
|
|
|
|
|
import unittest
|
|
|
|
|
|
2022-06-22 14:15:32 +08:00
|
|
|
from modelscope.metainfo import Pipelines
|
2023-03-07 21:55:10 +08:00
|
|
|
from modelscope.outputs import OutputKeys
|
2022-06-17 19:56:11 +08:00
|
|
|
from modelscope.pipelines import pipeline
|
|
|
|
|
from modelscope.utils.constant import Tasks
|
2022-06-23 16:55:48 +08:00
|
|
|
from modelscope.utils.test_utils import test_level
|
2022-06-17 19:56:11 +08:00
|
|
|
|
2022-08-16 20:23:55 +08:00
|
|
|
NEAREND_MIC_FILE = 'data/test/audios/nearend_mic.wav'
|
|
|
|
|
FAREND_SPEECH_FILE = 'data/test/audios/farend_speech.wav'
|
2022-10-25 12:10:07 +08:00
|
|
|
NEAREND_MIC_URL = 'https://modelscope.oss-cn-beijing.aliyuncs.com/' \
|
|
|
|
|
'test/audios/nearend_mic.wav'
|
|
|
|
|
FAREND_SPEECH_URL = 'https://modelscope.oss-cn-beijing.aliyuncs.com/' \
|
|
|
|
|
'test/audios/farend_speech.wav'
|
2022-06-17 19:56:11 +08:00
|
|
|
|
2022-08-16 20:23:55 +08:00
|
|
|
NOISE_SPEECH_FILE = 'data/test/audios/speech_with_noise.wav'
|
2023-03-07 21:55:10 +08:00
|
|
|
NOISE_SPEECH_FILE_48K = 'data/test/audios/speech_with_noise_48k.wav'
|
|
|
|
|
NOISE_SPEECH_FILE_48K_PCM = 'data/test/audios/speech_with_noise_48k.PCM'
|
2022-10-25 12:10:07 +08:00
|
|
|
NOISE_SPEECH_URL = 'https://modelscope.oss-cn-beijing.aliyuncs.com/' \
|
|
|
|
|
'test/audios/speech_with_noise.wav'
|
2022-06-17 19:56:11 +08:00
|
|
|
|
|
|
|
|
|
2023-08-22 23:04:31 +08:00
|
|
|
@unittest.skip('For librosa numpy compatible')
|
2023-05-14 23:41:40 +08:00
|
|
|
class SpeechSignalProcessTest(unittest.TestCase):
|
2022-06-17 19:56:11 +08:00
|
|
|
|
|
|
|
|
def setUp(self) -> None:
|
2022-06-28 14:41:08 +08:00
|
|
|
pass
|
|
|
|
|
|
2022-09-09 13:51:09 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
2022-06-28 14:41:08 +08:00
|
|
|
def test_aec(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_aec_psm_16k'
|
2022-06-17 19:56:11 +08:00
|
|
|
input = {
|
2022-08-16 20:23:55 +08:00
|
|
|
'nearend_mic': os.path.join(os.getcwd(), NEAREND_MIC_FILE),
|
|
|
|
|
'farend_speech': os.path.join(os.getcwd(), FAREND_SPEECH_FILE)
|
2022-06-17 19:56:11 +08:00
|
|
|
}
|
2022-08-06 12:35:38 +08:00
|
|
|
aec = pipeline(Tasks.acoustic_echo_cancellation, model=model_id)
|
2022-06-28 14:41:08 +08:00
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
aec(input, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2022-09-09 13:51:09 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
|
|
|
|
def test_aec_url(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_aec_psm_16k'
|
|
|
|
|
input = {
|
|
|
|
|
'nearend_mic': NEAREND_MIC_URL,
|
|
|
|
|
'farend_speech': FAREND_SPEECH_URL
|
|
|
|
|
}
|
|
|
|
|
aec = pipeline(Tasks.acoustic_echo_cancellation, model=model_id)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
aec(input, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2022-08-01 20:56:32 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
|
|
|
|
def test_aec_bytes(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_aec_psm_16k'
|
|
|
|
|
input = {}
|
2022-08-16 20:23:55 +08:00
|
|
|
with open(os.path.join(os.getcwd(), NEAREND_MIC_FILE), 'rb') as f:
|
2022-08-01 20:56:32 +08:00
|
|
|
input['nearend_mic'] = f.read()
|
2022-08-16 20:23:55 +08:00
|
|
|
with open(os.path.join(os.getcwd(), FAREND_SPEECH_FILE), 'rb') as f:
|
2022-08-01 20:56:32 +08:00
|
|
|
input['farend_speech'] = f.read()
|
|
|
|
|
aec = pipeline(
|
|
|
|
|
Tasks.acoustic_echo_cancellation,
|
|
|
|
|
model=model_id,
|
|
|
|
|
pipeline_name=Pipelines.speech_dfsmn_aec_psm_16k)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
aec(input, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2022-08-02 14:03:11 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
|
|
|
|
def test_aec_tuple_bytes(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_aec_psm_16k'
|
2022-08-16 20:23:55 +08:00
|
|
|
with open(os.path.join(os.getcwd(), NEAREND_MIC_FILE), 'rb') as f:
|
2022-08-02 14:03:11 +08:00
|
|
|
nearend_bytes = f.read()
|
2022-08-16 20:23:55 +08:00
|
|
|
with open(os.path.join(os.getcwd(), FAREND_SPEECH_FILE), 'rb') as f:
|
2022-08-02 14:03:11 +08:00
|
|
|
farend_bytes = f.read()
|
|
|
|
|
inputs = (nearend_bytes, farend_bytes)
|
|
|
|
|
aec = pipeline(
|
|
|
|
|
Tasks.acoustic_echo_cancellation,
|
|
|
|
|
model=model_id,
|
|
|
|
|
pipeline_name=Pipelines.speech_dfsmn_aec_psm_16k)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
aec(inputs, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2022-09-09 13:51:09 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
2023-03-07 21:55:10 +08:00
|
|
|
def test_frcrn_ans(self):
|
2022-06-28 14:41:08 +08:00
|
|
|
model_id = 'damo/speech_frcrn_ans_cirm_16k'
|
2022-08-06 12:35:38 +08:00
|
|
|
ans = pipeline(Tasks.acoustic_noise_suppression, model=model_id)
|
2022-06-28 14:41:08 +08:00
|
|
|
output_path = os.path.abspath('output.wav')
|
2022-08-16 20:23:55 +08:00
|
|
|
ans(os.path.join(os.getcwd(), NOISE_SPEECH_FILE),
|
|
|
|
|
output_path=output_path)
|
2022-06-28 14:41:08 +08:00
|
|
|
print(f'Processed audio saved to {output_path}')
|
2022-06-17 19:56:11 +08:00
|
|
|
|
2022-09-09 13:51:09 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
|
|
|
|
def test_ans_url(self):
|
|
|
|
|
model_id = 'damo/speech_frcrn_ans_cirm_16k'
|
|
|
|
|
ans = pipeline(Tasks.acoustic_noise_suppression, model=model_id)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
ans(NOISE_SPEECH_URL, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2022-08-01 20:56:32 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
2022-07-27 18:45:17 +08:00
|
|
|
def test_ans_bytes(self):
|
|
|
|
|
model_id = 'damo/speech_frcrn_ans_cirm_16k'
|
|
|
|
|
ans = pipeline(
|
2022-08-01 20:56:32 +08:00
|
|
|
Tasks.acoustic_noise_suppression,
|
2022-07-27 18:45:17 +08:00
|
|
|
model=model_id,
|
|
|
|
|
pipeline_name=Pipelines.speech_frcrn_ans_cirm_16k)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
2022-08-16 20:23:55 +08:00
|
|
|
with open(os.path.join(os.getcwd(), NOISE_SPEECH_FILE), 'rb') as f:
|
2022-07-27 18:45:17 +08:00
|
|
|
data = f.read()
|
|
|
|
|
ans(data, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2023-03-07 21:55:10 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
|
|
|
|
def test_dfsmn_ans(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_ans_psm_48k_causal'
|
|
|
|
|
ans = pipeline(Tasks.acoustic_noise_suppression, model=model_id)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
ans(os.path.join(os.getcwd(), NOISE_SPEECH_FILE_48K),
|
|
|
|
|
output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
|
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
|
|
|
|
def test_dfsmn_ans_bytes(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_ans_psm_48k_causal'
|
|
|
|
|
ans = pipeline(Tasks.acoustic_noise_suppression, model=model_id)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
with open(os.path.join(os.getcwd(), NOISE_SPEECH_FILE_48K), 'rb') as f:
|
|
|
|
|
data = f.read()
|
|
|
|
|
ans(data, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
|
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
|
|
|
|
def test_dfsmn_ans_stream(self):
|
|
|
|
|
model_id = 'damo/speech_dfsmn_ans_psm_48k_causal'
|
|
|
|
|
ans = pipeline(
|
|
|
|
|
Tasks.acoustic_noise_suppression, model=model_id, stream_mode=True)
|
|
|
|
|
with open(os.path.join(os.getcwd(), NOISE_SPEECH_FILE_48K_PCM),
|
|
|
|
|
'rb') as f:
|
|
|
|
|
block_size = 3840
|
|
|
|
|
audio = f.read(block_size)
|
|
|
|
|
with open('output.pcm', 'wb') as w:
|
|
|
|
|
while len(audio) >= block_size:
|
|
|
|
|
result = ans(audio)
|
|
|
|
|
pcm = result[OutputKeys.OUTPUT_PCM]
|
|
|
|
|
w.write(pcm)
|
|
|
|
|
audio = f.read(block_size)
|
|
|
|
|
|
2024-10-24 15:38:09 +08:00
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
|
|
|
|
def test_zipenhancer_ans(self):
|
|
|
|
|
model_id = 'damo/speech_zipenhancer_ans_multiloss_16k_base'
|
|
|
|
|
ans = pipeline(Tasks.acoustic_noise_suppression, model=model_id)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
ans(os.path.join(os.getcwd(), NOISE_SPEECH_FILE),
|
|
|
|
|
output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
|
|
|
|
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
|
|
|
|
def test_zipenhancer_ans_url(self):
|
|
|
|
|
model_id = 'damo/speech_zipenhancer_ans_multiloss_16k_base'
|
|
|
|
|
ans = pipeline(Tasks.acoustic_noise_suppression, model=model_id)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
ans(NOISE_SPEECH_URL, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
|
|
|
|
@unittest.skipUnless(test_level() >= 1, 'skip test in current test level')
|
|
|
|
|
def test_zipenhancer_ans_bytes(self):
|
|
|
|
|
model_id = 'damo/speech_zipenhancer_ans_multiloss_16k_base'
|
|
|
|
|
ans = pipeline(
|
|
|
|
|
Tasks.acoustic_noise_suppression,
|
|
|
|
|
model=model_id,
|
|
|
|
|
pipeline_name=Pipelines.speech_zipenhancer_ans_multiloss_16k_base)
|
|
|
|
|
output_path = os.path.abspath('output.wav')
|
|
|
|
|
with open(os.path.join(os.getcwd(), NOISE_SPEECH_FILE), 'rb') as f:
|
|
|
|
|
data = f.read()
|
|
|
|
|
ans(data, output_path=output_path)
|
|
|
|
|
print(f'Processed audio saved to {output_path}')
|
|
|
|
|
|
2022-06-17 19:56:11 +08:00
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
unittest.main()
|