94 lines
3.6 KiB
Python
94 lines
3.6 KiB
Python
import time, threading, json
|
||
|
||
|
||
class AliyunASR():
|
||
|
||
def test_on_sentence_begin(self, message, *args):
|
||
# print("test_on_sentence_begin:{}".format(message))
|
||
pass
|
||
|
||
def test_on_sentence_end(self, message, *args):
|
||
# print("test_on_sentence_end:{}".format(message))
|
||
message = json.loads(message)
|
||
self.parsed_sentence = message['payload']['result']
|
||
self.event_on_entence_end.set()
|
||
print(self.parsed_sentence)
|
||
|
||
def test_on_start(self, message, *args):
|
||
# print("test_on_start:{}".format(message))
|
||
pass
|
||
|
||
def test_on_error(self, message, *args):
|
||
# print("on_error args=>{}".format(args))
|
||
pass
|
||
|
||
def test_on_close(self, *args):
|
||
self.aliyun_service_ok = False
|
||
pass
|
||
|
||
def test_on_result_chg(self, message, *args):
|
||
# print("test_on_chg:{}".format(message))
|
||
message = json.loads(message)
|
||
self.parsed_text = message['payload']['result']
|
||
self.event_on_result_chg.set()
|
||
|
||
def test_on_completed(self, message, *args):
|
||
# print("on_completed:args=>{} message=>{}".format(args, message))
|
||
pass
|
||
|
||
|
||
def audio_convertion_thread(self, uuid):
|
||
# 在一个异步线程中采集音频
|
||
import nls # pip install git+https://github.com/aliyun/alibabacloud-nls-python-sdk.git
|
||
import tempfile
|
||
from scipy import io
|
||
from toolbox import get_conf
|
||
from .audio_io import change_sample_rate
|
||
from .audio_io import RealtimeAudioDistribution
|
||
NEW_SAMPLERATE = 16000
|
||
rad = RealtimeAudioDistribution()
|
||
rad.clean_up()
|
||
temp_folder = tempfile.gettempdir()
|
||
TOKEN, APPKEY = get_conf('ALIYUN_TOKEN', 'ALIYUN_APPKEY')
|
||
self.aliyun_service_ok = True
|
||
URL="wss://nls-gateway.aliyuncs.com/ws/v1"
|
||
sr = nls.NlsSpeechTranscriber(
|
||
url=URL,
|
||
token=TOKEN,
|
||
appkey=APPKEY,
|
||
on_sentence_begin=self.test_on_sentence_begin,
|
||
on_sentence_end=self.test_on_sentence_end,
|
||
on_start=self.test_on_start,
|
||
on_result_changed=self.test_on_result_chg,
|
||
on_completed=self.test_on_completed,
|
||
on_error=self.test_on_error,
|
||
on_close=self.test_on_close,
|
||
callback_args=[uuid.hex]
|
||
)
|
||
|
||
r = sr.start(aformat="pcm",
|
||
enable_intermediate_result=True,
|
||
enable_punctuation_prediction=True,
|
||
enable_inverse_text_normalization=True)
|
||
|
||
while not self.stop:
|
||
# time.sleep(self.capture_interval)
|
||
audio = rad.read(uuid.hex)
|
||
if audio is not None:
|
||
# convert to pcm file
|
||
temp_file = f'{temp_folder}/{uuid.hex}.pcm' #
|
||
dsdata = change_sample_rate(audio, rad.rate, NEW_SAMPLERATE) # 48000 --> 16000
|
||
io.wavfile.write(temp_file, NEW_SAMPLERATE, dsdata)
|
||
# read pcm binary
|
||
with open(temp_file, "rb") as f: data = f.read()
|
||
# print('audio len:', len(audio), '\t ds len:', len(dsdata), '\t need n send:', len(data)//640)
|
||
slices = zip(*(iter(data),) * 640) # 640个字节为一组
|
||
for i in slices: sr.send_audio(bytes(i))
|
||
else:
|
||
time.sleep(0.1)
|
||
|
||
if not self.aliyun_service_ok:
|
||
self.stop = True
|
||
self.stop_msg = 'Aliyun音频服务异常,请检查ALIYUN_TOKEN和ALIYUN_APPKEY是否过期。'
|
||
r = sr.stop()
|