-
问题:---------------------------------------------------------------------------在Hilens studio中测试pyttsx3文本转音频,出现错误注:已安装pyttsx包和espeak包源代码如下:-------------------------------------------------------------------------#! /usr/bin/python3.7import osimport cv2import hilensimport pyttsx3import espeakdef run(work_path): # 系统初始化,参数要与创建技能时填写的检验值保持一致 hilens.init("hello") engine = pyttsx3.init() engine.say('HERE PASS THE TEXT TO CONVERT INTO SPEECH') engine.runAndWait()if __name__ == "__main__": run(os.getcwd())错误提示:-------------------------------------------------------------------------[huser@studio-ide-679f67bb45-866xw Hello_haq]$ cd /home/huser/projects/Hello_haq[huser@studio-ide-679f67bb45-866xw Hello_haq]$ python3 /home/huser/projects/Hello_haq/start.pyTraceback (most recent call last): File "/home/huser/projects/Hello_haq/start.py", line 5, in <module> import main File "./src/main/python/main.py", line 7, in <module> import espeakModuleNotFoundError: No module named 'espeak'[huser@studio-ide-679f67bb45-866xw Hello_haq]$ pip3 install espeak --userWARNING: When the --extra-index-url option is used, the installation package is downloaded from an unverified URL. Exercise caution when using this option.Looking in indexes: http://mirrors.myhuaweicloud.com/pypi/web/simpleCollecting espeak Downloading http://mirrors.myhuaweicloud.com/pypi/web/packages/31/36/30bbc9d4d8a3d7e5edc046cfaf0410434f583a36461122849c1cdfd363eb/espeak-0.1.0.tar.gzRequirement already satisfied: requests in /usr/lib64/python3.7/site-packages (from espeak) (2.26.0)Requirement already satisfied: certifi>=2017.4.17 in /usr/lib64/python3.7/site-packages (from requests->espeak) (2021.10.8)Requirement already satisfied: charset-normalizer~=2.0.0; python_version >= "3" in /usr/lib64/python3.7/site-packages (from requests->espeak) (2.0.7)Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib64/python3.7/site-packages (from requests->espeak) (1.26.7)Requirement already satisfied: idna<4,>=2.5; python_version >= "3" in /usr/lib64/python3.7/site-packages (from requests->espeak) (3.3)Installing collected packages: espeak Running setup.py install for espeak ... doneSuccessfully installed espeak-0.1.0[huser@studio-ide-679f67bb45-866xw Hello_haq]$ cd /home/huser/projects/Hello_haq[huser@studio-ide-679f67bb45-866xw Hello_haq]$ python3 /home/huser/projects/Hello_haq/start.py[SFW]2022-06-18 09:00:14.889[INFO](14031-device_checker.cpp:71)----- start DetectDevice ------[DEVICE]2022-06-18 09:00:14.911[INFO](14031-acl_mediaplugin.cpp:19)-----------load acl_C75 Media---------[DEVICE]2022-06-18 09:00:15.163[INFO](14031-acl_inferplugin.cpp:26)-----------load acl_C75 Infer---------Traceback (most recent call last): File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/__init__.py", line 20, in init eng = _activeEngines[driverName] File "/usr/lib64/python3.7/weakref.py", line 137, in __getitem__ o = self.data[key]()KeyError: NoneDuring handling of the above exception, another exception occurred:Traceback (most recent call last): File "/home/huser/projects/Hello_haq/start.py", line 17, in <module> main.run(work_path) File "./src/main/python/main.py", line 13, in run engine = pyttsx3.init() File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/__init__.py", line 22, in init eng = Engine(driverName, debug) File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/engine.py", line 30, in __init__ self.proxy = driver.DriverProxy(weakref.proxy(self), driverName, debug) File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/driver.py", line 50, in __init__ self._module = importlib.import_module(name) File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/drivers/espeak.py", line 9, in <module> from . import _espeak, toUtf8, fromUtf8 File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/drivers/_espeak.py", line 18, in <module> dll = cdll.LoadLibrary('libespeak.so.1') File "/usr/lib64/python3.7/ctypes/__init__.py", line 437, in LoadLibrary return self._dlltype(name) File "/usr/lib64/python3.7/ctypes/__init__.py", line 359, in __init__ self._handle = _dlopen(self._name, mode)OSError: libespeak.so.1: cannot open shared object file: No such file or directory麻烦帮忙看下如何解决,谢谢!截图如下:-----------------------------------------------------------------------
-
-
-
我随手打了一个hello world,太神奇了
-
-
-
-
人工标注对于不同类型的数据,用户可以选择不同的标注类型。当前ModelArts支持如下类型的标注作业: 图片 图像分类:识别一张图片中是否包含某种物体。 物体检测:识别出图片中每个物体的位置及类别。 图像分割:根据图片中的物体划分出不同区域。 音频 声音分类:对声音进行分类。 语音内容:对语音内容进行标注。 语音分割:对语音进行分段标注。 文本 文本分类:对文本的内容按照标签进行分类处理。 命名实体:针对文本中的实体片段进行标注,如“时间”、“地点”等。 文本三元组:针对文本中的实体片段和实体之间的关系进行标注。 视频 视频标注:识别出视频中每个物体的位置及分类。目前仅支持mp4格式。智能标注除了人工标注外,ModelArts还提供了智能标注功能,快速完成数据标注,为您节省70%以上的标注时间。智能标注是指基于当前标注阶段的标签及图片学习训练,选中系统中已有的模型进行智能标注,快速完成剩余图片的标注操作。目前只有“图像分类”和“物体检测”类型的数据集支持智能标注功能。团队标注数据标注任务中,一般由一个人完成,但是针对数据集较大时,需要多人协助完成。ModelArts提供了团队标注功能,可以由多人组成一个标注团队,针对同一个数据集进行标注管理。团队标注功能当前仅支持“图像分类”、“物体检测”、“文本分类”、“命名实体”、“文本三元组”、“语音分割”类型的数据集。不同类型数据集支持的功能列表其中,不同类型的数据集,支持不同的功能数据集类型标注类型人工标注智能标注团队标注图片图像分类支持支持支持物体检测支持支持支持图像分割支持--音频声音分类支持--语音内容支持--语音分割支持-支持文本文本分类支持-支持命名实体支持-支持文本三元组支持-支持视频视频标注支持--自由格式----表格----
-
前言利用新型的人工智能(深度学习)算法,结合清华大学开源语音数据集THCHS30进行语音识别的实战演练,让使用者在了解语音识别基本的原理与实战的同时,更好的了解人工智能的相关内容与应用。通过这个实践可以了解如何使用Keras和Tensorflow构建DFCNN的语音识别神经网络,并且熟悉整个处理流程,包括数据预处理、模型训练、模型保存和模型预测等环节。实践流程基础环境准备OBS准备ModelArts应用开始语音识别操作开始语言模型操作1.基础环境准备在使用 ModelArts 进行 AI 开发前,需先完成以下基础操作哦(如有已完成部分,请忽略),主要分为4步(注册–>实名认证–>服务授权–>领代金券):使用手机号注册华为云账号:点击注册点此去完成实名认证,账号类型选"个人",个人认证类型推荐使用"扫码认证"。 点此进入 ModelArts 控制台数据管理页面,上方会提示访问授权,点击【服务授权】按钮,按下图顺序操作: 进入 ModelArts 控制台首页,如下图,点击页面上的"彩蛋",领取新手福利代金券!后续步骤可能会产生资源消耗费用,请务必领取。 以上操作,也提供了详细的视频教程,点此查看:ModelArts环境配置基于深度学习算法的语音识别具体步骤什么是OBS?对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。2.OBS准备1).将本地准备的data.zip和语音数据包data_thchs30.tar上传到OBS中,为后续步骤准备。创建OBS桶将光标移动至左边栏,弹出菜单中选择“服务列表”->“ 存储”->“对象存储服务 OBS”,如下图:进去对象存储服务 OBS后,点击创建桶,配置参数如下:区域:华北-北京四,数据冗余存储策略:多AZ存储,桶名称:自定义(请记录,后续使用),存储类别:标准存储,桶策略:私有,默认加密:关闭,归档数据直读:关闭,点击“立即创建”,完成创建后跳转到桶列表,如下图所示:2)创建AK/SK登录华为云,在页面右上方单击“控制台”,进入华为云管理控制台。图1 控制台入口在控制台右上角的帐户名下方,单击“我的凭证”,进入“我的凭证”页面。图2 我的凭证在“我的凭证”页面,选择“访问密钥>新增访问密钥”,如图3所示。图3 单击新增访问密钥填写该密钥的描述说明,单击“确定”。根据提示单击“立即下载”,下载密钥。图4 新增访问密钥密钥文件会直接保存到浏览器默认的下载文件夹中。打开名称为“credentials.csv”的文件,即可查看访问密钥(Access Key Id和Secret Access Key)。3).安装OBS客户端首先下载OBS工具到云服务器,在自己电脑打开命令行界面,执行如下命令:mkdir /home/user/Desktop/data; cd /home/user/Desktop/data; wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz输入解压缩指令,并查看当前目录列表:tar -zxf obsutil_linux_amd64.tar.gz; ls -l执行如下指令配置OBS工具,操作说明:自己获取的密钥的AK/SK填入-i -k参数后面执行如下查看对象列表指令,验证是否配置成功,指令如下:./obsutil ls配置成功结果如下图:4)上传语音资料执行如下指令下载实验相关资料:注:由于语音资料较大(7个多g),需要耐心等待cd ../; wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/speech-recognition/data.zip; wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/speech-recognition/data_thchs30.tar下载完毕,执行如下查看指令:ll输入以下指令,将刚刚下载好 的语音文件上传到创建的OBS桶nlpdemo中:./obsutil_linux_amd64_5.*/obsutil cp ./data.zip obs://nlpdemo; ./obsutil_linux_amd64_5.*/obsutil cp ./data_thchs30.tar obs://nlpdemo上传完毕后【大约60分钟,上传的速率较慢】建议华为云优化一下OBS的上传速度,在华为云控制台依次选择“控制台”->“服务列表”->“ 存储”->“对象存储服务OBS”,进入服务界面,点击创建的桶名称nlpdemo进入详情页,于页面左侧选择“对象”,点击后于页面右侧可查看到刚传入的资料,2.ModelArts应用什么是ModelArts?ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。1) 创建Notebook在服务列表中找到并进入人工智能服务 ModelArts,然后点击ModelArts 页面中左侧的【开发环境】选项一点击【notebook】 进入notebook 页面。点击【创建】按钮进入创建页面,并按以下参数进行配置:名称:自定义,自动停止:自定义 12小时(在选择非[限时免费]规格后显示),镜像:公共镜像:在第二页选择tensorflow1.13-cuda10.0-cudnn7-ubuntu18.0.4-GPU算法开发和训练基础镜像,预置AI引擎Tensorflow1.13.1,资源池:公共资源池,类型:CPU,规格:8核64GiB,存储配置:云硬盘(30GB)。点击“下一步”->“提交”->“返回Notebook列表”,Notebook列表如下图所示:注:大约3分钟后状态由“启动中”变为“运行中”,可点击列表右上角的“刷新”查看最新状态。3.开始语音识别操作采用CNN+CTC的方式进行语音识别。1)导入包创建成功,返回NoteBook列表,等待状态变为“运行中”【约等待3分钟】,点击“打开”,进入NoteBook详情页。在页面中选择“TensorFlow-1.13.1”,如下图所示:在新建的Python环境页面的输入框中,输入以下代码:import moxing as mox import numpy as np import scipy.io.wavfile as wav from scipy.fftpack import fft import matplotlib.pyplot as plt %matplotlib inline import keras from keras.layers import Input, Conv2D, BatchNormalization, MaxPooling2D from keras.layers import Reshape, Dense, Lambda from keras.optimizers import Adam from keras import backend as K from keras.models import Model from keras.utils import multi_gpu_model import os import pickle点击“代码旁边的小三角形”run,查看执行结果,如下图:2)数据准备继续在下方空白的输入框中输入以下代码,从上传到OBS的数据拷贝到当前目录:注:下方框选的部分是之前创建的OBS桶名点击“run”,查看执行结果,如下图:current_path = os.getcwd() mox.file.copy('s3://nlpdemo/data.zip', current_path+'/data.zip') mox.file.copy('s3://nlpdemo/data_thchs30.tar', current_path+'/data_thchs30.tar')继续在下方空白的输入框中输入以下代码,解压缩数据:!unzip data.zip !tar -xvf data_thchs30.tar点击“run”,查看执行结果,如下图:3)数据处理继续在下方空白的输入框中输入以下代码,生成音频文件和标签文件列表:注:考虑神经网络训练过程中接收的输入输出。首先需要batch_size内数据具有统一的shape。格式为:[batch_size, time_step, feature_dim],然而读取的每一个sample的时间轴长都不一样,所以需要对时间轴进行处理,选择batch内最长的那个时间为基准,进行padding。这样一个batch内的数据都相同,就可以进行并行训练了。source_file = 'data/thchs_train.txt' def source_get(source_file): train_file = source_file label_data = [] wav_lst = [] with open(train_file,"r",encoding="utf-8") as f: lines = f.readlines() for line in lines: datas = line.split("\t") wav_lst.append(datas[0]) label_data.append(datas[1]) return label_data, wav_lst label_data, wav_lst = source_get(source_file) print(label_data[:10]) print(wav_lst[:10])点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,进行label数据处理(为label建立拼音到id的映射,即词典):def mk_vocab(label_data): vocab = [] for line in label_data: line = line.split(' ') for pny in line: if pny not in vocab: vocab.append(pny) vocab.append('_') return vocab vocab = mk_vocab(label_data) def word2id(line, vocab): return [vocab.index(pny) for pny in line.split(' ')] label_id = word2id(label_data[0], vocab) print(label_data[0]) print(label_id)点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,进行音频数据处理:def compute_fbank(file): x=np.linspace(0, 400 - 1, 400, dtype = np.int64) w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) fs, wavsignal = wav.read(file) time_window = 25 window_length = fs / 1000 * time_window wav_arr = np.array(wavsignal) wav_length = len(wavsignal) range0_end = int(len(wavsignal)/fs*1000 - time_window) // 10 data_input = np.zeros((range0_end, 200), dtype = np.float) data_line = np.zeros((1, 400), dtype = np.float) for i in range(0, range0_end): p_start = i * 160 p_end = p_start + 400 data_line = wav_arr[p_start:p_end] data_line = data_line * w data_line = np.abs(fft(data_line)) data_input[i]=data_line[0:200] data_input = np.log(data_input + 1) #data_input = data_input[::] return data_input fbank = compute_fbank(wav_lst[0]) print(fbank.shape)点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,生成数据生成器:total_nums = 10000 batch_size = 4 batch_num = total_nums // batch_size from random import shuffle shuffle_list = list(range(10000)) shuffle(shuffle_list) def get_batch(batch_size, shuffle_list, wav_lst, label_data, vocab): for i in range(10000//batch_size): wav_data_lst = [] label_data_lst = [] begin = i * batch_size end = begin + batch_size sub_list = shuffle_list[begin:end] for index in sub_list: fbank = compute_fbank(wav_lst[index]) fbank = fbank[:fbank.shape[0] // 8 * 8, :] label = word2id(label_data[index], vocab) wav_data_lst.append(fbank) label_data_lst.append(label) yield wav_data_lst, label_data_lst batch = get_batch(4, shuffle_list, wav_lst, label_data, vocab) wav_data_lst, label_data_lst = next(batch) for wav_data in wav_data_lst: print(wav_data.shape) for label_data in label_data_lst: print(label_data) lens = [len(wav) for wav in wav_data_lst] print(max(lens)) print(lens) def wav_padding(wav_data_lst): wav_lens = [len(data) for data in wav_data_lst] wav_max_len = max(wav_lens) wav_lens = np.array([leng//8 for leng in wav_lens]) new_wav_data_lst = np.zeros((len(wav_data_lst), wav_max_len, 200, 1)) for i in range(len(wav_data_lst)): new_wav_data_lst[i, :wav_data_lst[i].shape[0], :, 0] = wav_data_lst[i] return new_wav_data_lst, wav_lens pad_wav_data_lst, wav_lens = wav_padding(wav_data_lst) print(pad_wav_data_lst.shape) print(wav_lens) def label_padding(label_data_lst): label_lens = np.array([len(label) for label in label_data_lst]) max_label_len = max(label_lens) new_label_data_lst = np.zeros((len(label_data_lst), max_label_len)) for i in range(len(label_data_lst)): new_label_data_lst[i][:len(label_data_lst[i])] = label_data_lst[i] return new_label_data_lst, label_lens pad_label_data_lst, label_lens = label_padding(label_data_lst) print(pad_label_data_lst.shape) print(label_lens)代码执行成功,如下图:执行结果输出如下图:继续在下方空白的输入框中输入以下代码,点击“run”运行,生成用于训练格式的数据生成器(此段代码无输出):4)模型搭建继续输入以下代码:说明:训练输入为时频图,标签为对应的拼音标签,搭建语音识别模型,采用了 CNN+CTC 的结构。def conv2d(size): return Conv2D(size, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal') def norm(x): return BatchNormalization(axis=-1)(x) def maxpool(x): return MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")(x) def dense(units, activation="relu"): return Dense(units, activation=activation, use_bias=True, kernel_initializer='he_normal') def cnn_cell(size, x, pool=True): x = norm(conv2d(size)(x)) x = norm(conv2d(size)(x)) if pool: x = maxpool(x) return x def ctc_lambda(args): labels, y_pred, input_length, label_length = args y_pred = y_pred[:, :, :] return K.ctc_batch_cost(labels, y_pred, input_length, label_length) class Amodel(): """docstring for Amodel.""" def __init__(self, vocab_size): super(Amodel, self).__init__() self.vocab_size = vocab_size self._model_init() self._ctc_init() self.opt_init() def _model_init(self): self.inputs = Input(name='the_inputs', shape=(None, 200, 1)) self.h1 = cnn_cell(32, self.inputs) self.h2 = cnn_cell(64, self.h1) self.h3 = cnn_cell(128, self.h2) self.h4 = cnn_cell(128, self.h3, pool=False) # 200 / 8 * 128 = 3200 self.h6 = Reshape((-1, 3200))(self.h4) self.h7 = dense(256)(self.h6) self.outputs = dense(self.vocab_size, activation='softmax')(self.h7) self.model = Model(inputs=self.inputs, outputs=self.outputs) def _ctc_init(self): self.labels = Input(name='the_labels', shape=[None], dtype='float32') self.input_length = Input(name='input_length', shape=[1], dtype='int64') self.label_length = Input(name='label_length', shape=[1], dtype='int64') self.loss_out = Lambda(ctc_lambda, output_shape=(1,), name='ctc')\ ([self.labels, self.outputs, self.input_length, self.label_length]) self.ctc_model = Model(inputs=[self.labels, self.inputs, self.input_length, self.label_length], outputs=self.loss_out) def opt_init(self): opt = Adam(lr = 0.0008, beta_1 = 0.9, beta_2 = 0.999, decay = 0.01, epsilon = 10e-8) #self.ctc_model=multi_gpu_model(self.ctc_model,gpus=2) self.ctc_model.compile(loss={'ctc': lambda y_true, output: output}, optimizer=opt) am = Amodel(len(vocab)) am.ctc_model.summary()点击“run”,执行结果如下图:5)训练模型 继续输入以下代码创建语音识别模型:total_nums = 100 batch_size = 20 batch_num = total_nums // batch_size epochs = 8 source_file = 'data/thchs_train.txt' label_data,wav_lst = source_get(source_file) vocab = mk_vocab(label_data) vocab_size = len(vocab) print(vocab_size) shuffle_list = list(range(100)) am = Amodel(vocab_size) for k in range(epochs): print('this is the', k+1, 'th epochs trainning !!!') #shuffle(shuffle_list) batch = data_generator(batch_size, shuffle_list, wav_lst, label_data, vocab) am.ctc_model.fit_generator(batch, steps_per_epoch=batch_num, epochs=1)执行结果如下图【大约需要11分钟,如果需要更好效果可以调整参数epochs为50次】:)6)保存模型将训练模型保存到OBS中。继续输入如下代码(此段代码无输出):操作说明:用创建的OBS桶名填写参数am.model.save("asr-model.h5") with open("vocab","wb") as fw: pickle.dump(vocab,fw) mox.file.copy("asr-model.h5", 's3://nlpdemo/asr-model.h5') mox.file.copy("vocab", 's3://nlpdemo/vocab')7)测试模型继续输入如下代码,点击“run”运行,用以导入包及加载模型和数据(此段代码无输出):#导入包 import pickle from keras.models import load_model import os import tensorflow as tf from keras import backend as K import numpy as np import scipy.io.wavfile as wav from scipy.fftpack import fft #加载模型和数据 bm = load_model("asr-model.h5") with open("vocab","rb") as fr: vocab_for_test = pickle.load(fr)继续输入如下代码,点击“run”运行,获取测试数据(此段代码无输出):def wav_padding(wav_data_lst): wav_lens = [len(data) for data in wav_data_lst] wav_max_len = max(wav_lens) wav_lens = np.array([leng//8 for leng in wav_lens]) new_wav_data_lst = np.zeros((len(wav_data_lst), wav_max_len, 200, 1)) for i in range(len(wav_data_lst)): new_wav_data_lst[i, :wav_data_lst[i].shape[0], :, 0] = wav_data_lst[i] return new_wav_data_lst, wav_lens #获取信号的时频图 def compute_fbank(file): x=np.linspace(0, 400 - 1, 400, dtype = np.int64) w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) # 汉明窗 fs, wavsignal = wav.read(file) # wav波形 加时间窗以及时移10ms time_window = 25 # 单位ms window_length = fs / 1000 * time_window # 计算窗长度的公式,目前全部为400固定值 wav_arr = np.array(wavsignal) wav_length = len(wavsignal) range0_end = int(len(wavsignal)/fs*1000 - time_window) // 10 # 计算循环终止的位置,也就是最终生成的窗数 data_input = np.zeros((range0_end, 200), dtype = np.float) # 用于存放最终的频率特征数据 data_line = np.zeros((1, 400), dtype = np.float) for i in range(0, range0_end): p_start = i * 160 p_end = p_start + 400 data_line = wav_arr[p_start:p_end] data_line = data_line * w # 加窗 data_line = np.abs(fft(data_line)) data_input[i]=data_line[0:200] # 设置为400除以2的值(即200)是取一半数据,因为是对称的 data_input = np.log(data_input + 1) #data_input = data_input[::] return data_input def test_data_generator(test_path): test_file_list = [] for root, dirs, files in os.walk(test_path): for file in files: if file.endswith(".wav"): test_file = os.sep.join([root, file]) test_file_list.append(test_file) print(len(test_file_list)) for file in test_file_list: fbank = compute_fbank(file) pad_fbank = np.zeros((fbank.shape[0]//8*8+8, fbank.shape[1])) pad_fbank[:fbank.shape[0], :] = fbank test_data_list = [] test_data_list.append(pad_fbank) pad_wav_data, input_length = wav_padding(test_data_list) yield pad_wav_data test_path ="data_thchs30/test" test_data = test_data_generator(test_path)继续输入以下代码进行测试:def decode_ctc(num_result, num2word): result = num_result[:, :, :] in_len = np.zeros((1), dtype = np.int32) in_len[0] = result.shape[1]; r = K.ctc_decode(result, in_len, greedy = True, beam_width=10, top_paths=1) r1 = K.get_value(r[0][0]) r1 = r1[0] text = [] for i in r1: text.append(num2word[i]) return r1, text for i in range(10): #获取测试数据 x = next(test_data) #载入训练好的模型,并进行识别语音 result = bm.predict(x, steps=1) #将数字结果转化为拼音结果 _, text = decode_ctc(result, vocab_for_test) print('文本结果:', text)点击“run”,执行成功如下图所示:.4.开始语言模型操作训练语言模型是采用捕捉特征能力更强的Transformer,创建基于自注意力机制的语言模型,在实验的过程中会跟大家介绍具体的实现步骤。1)导入包继续输入如下代码,点击“run”运行,导入相关包(此段代码无输出):from tqdm import tqdm import tensorflow as tf import moxing as mox import numpy as np2)数据处理继续输入如下代码,点击“run”运行:with open("data/zh.tsv", 'r', encoding='utf-8') as fout: data = fout.readlines()[:10000] inputs = [] labels = [] for i in tqdm(range(len(data))): key, pny, hanzi = data[i].split('\t') inputs.append(pny.split(' ')) labels.append(hanzi.strip('\n').split(' ')) print(inputs[:5]) print() print(labels[:5]) def get_vocab(data): vocab = ['<PAD>'] for line in tqdm(data): for char in line: if char not in vocab: vocab.append(char) return vocab pny2id = get_vocab(inputs) han2id = get_vocab(labels) print(pny2id[:10]) print(han2id[:10]) input_num = [[pny2id.index(pny) for pny in line] for line in tqdm(inputs)] label_num = [[han2id.index(han) for han in line] for line in tqdm(labels)] #获取batch数据 def get_batch(input_data, label_data, batch_size): batch_num = len(input_data) // batch_size for k in range(batch_num): begin = k * batch_size end = begin + batch_size input_batch = input_data[begin:end] label_batch = label_data[begin:end] max_len = max([len(line) for line in input_batch]) input_batch = np.array([line + [0] * (max_len - len(line)) for line in input_batch]) label_batch = np.array([line + [0] * (max_len - len(line)) for line in label_batch]) yield input_batch, label_batch batch = get_batch(input_num, label_num, 4) input_batch, label_batch = next(batch) print(input_batch) print(label_batch)执行成功结果如下图:3)模型搭建模型采用self-attention的左侧编码器,如下图:继续输入如下代码,点击“run”运行,用以实现图片结构中的layer norm层(代码无输出):#layer norm层 def normalize(inputs, epsilon = 1e-8, scope="ln", reuse=None): with tf.variable_scope(scope, reuse=reuse): inputs_shape = inputs.get_shape() params_shape = inputs_shape[-1:] mean, variance = tf.nn.moments(inputs, [-1], keep_dims=True) beta= tf.Variable(tf.zeros(params_shape)) gamma = tf.Variable(tf.ones(params_shape)) normalized = (inputs - mean) / ( (variance + epsilon) ** (.5) ) outputs = gamma * normalized + beta return outputs继续输入如下代码,点击“run”运行,以实现图片结构中的embedding层(代码无输出):def embedding(inputs, vocab_size, num_units, zero_pad=True, scale=True, scope="embedding", reuse=None): with tf.variable_scope(scope, reuse=reuse): lookup_table = tf.get_variable('lookup_table', dtype=tf.float32, shape=[vocab_size, num_units], initializer=tf.contrib.layers.xavier_initializer()) if zero_pad: lookup_table = tf.concat((tf.zeros(shape=[1, num_units]), lookup_table[1:, :]), 0) outputs = tf.nn.embedding_lookup(lookup_table, inputs) if scale: outputs = outputs * (num_units ** 0.5) return outputs继续输入如下代码,点击“run”运行,以实现multihead层(此段代码无输出):继续输入如下代码,点击“run”运行,以实现feedforward层(此段代码无输出):继续输入如下代码,点击“run”运行,以搭建模型(此段代码无输出):4) 训练模型继续输入如下代码,点击“run”运行,用于参数设定(此段代码无输出):继续输入以下代码,点击“run”运行,用于模型训练:import os epochs = 3 batch_size = 4 g = Graph(arg) saver =tf.train.Saver() with tf.Session() as sess: merged = tf.summary.merge_all() sess.run(tf.global_variables_initializer()) if os.path.exists('logs/model.meta'): saver.restore(sess, 'logs/model') writer = tf.summary.FileWriter('tensorboard/lm', tf.get_default_graph()) for k in range(epochs): total_loss = 0 batch_num = len(input_num) // batch_size batch = get_batch(input_num, label_num, batch_size) for i in range(batch_num): input_batch, label_batch = next(batch) feed = {g.x: input_batch, g.y: label_batch} cost,_ = sess.run([g.mean_loss,g.train_op], feed_dict=feed) total_loss += cost if (k * batch_num + i) % 10 == 0: rs=sess.run(merged, feed_dict=feed) writer.add_summary(rs, k * batch_num + i) print('epochs', k+1, ': average loss = ', total_loss/batch_num) saver.save(sess, 'logs/model') writer.close()执行成功输出内容如下图【大约10分钟执行完成,如果需要更好效果请将参数epochs调整为15】:5) 模型测试继续输入如下代码,进行拼音测试:arg.is_training = False g = Graph(arg) saver =tf.train.Saver() with tf.Session() as sess: saver.restore(sess, 'logs/model') while True: line = input('Input Test Content: ') if line == 'exit': break line = line.strip('\n').split(' ') x = np.array([pny2id.index(pny) for pny in line]) x = x.reshape(1, -1) preds = sess.run(g.preds, {g.x: x}) got = ''.join(han2id[idx] for idx in preds[0]) print(got)点击“run”运行后,出现输入框提示输入,如下图:我输入以下拼音nian2 de bu4 bu4 ge4 de shang4 shi2 qu1 pei4 wai4 gu4 de nian2 ming2 de zi4 ren2 na4 ren2 bu4 zuo4 de jia1 zhong4 shi2 wei4 yu4 you3 ta1 yang2 mu4 yu4 ci3单击键盘回车键后,模型返回中文内容,如下图:继续在输入框中输入“exit”,回车后出现提示停止运行,如下图:6) 保存模型继续输入如下代码,点击“run”运行后,保存模型到OBS桶中,方便其他notebook使用:操作说明:用自己创建的OBS桶名代替“OBS”字符,我的是nlpdemo!zip -r languageModel.zip logs #递归压缩模型所在文件夹 mox.file.copy("languageModel.zip", 's3://nlpdemo/languageModel.zip')至此基于深度学习算法的语音识别实践全部完成,整个流程下来体验还是很不错的!总结整个流程用到了很多的华为云服务,例如OBS和ModelArts的NoteBook,功能非常强大,体验感很好,对深度学习算法的语音识别有了一定的了解,也对整个实践的过程有了认识,欢迎大家一起在华为云社区交流学习。如有不当之处,欢迎指正!感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
-
实验准备:华为云账号(已实名认证),如没有账号信息,请先先注册华为云账号信息,参考实名认证介绍_帐号中心_用户指南_实名认证_华为云 (huaweicloud.com)电脑Chrome浏览器实验过程:点击API Explorer_开发者社区-华为云 (huaweicloud.com),进入API Explorer页面,选择【语音交互服务--语音合成接口--RunTts】在Body体的text输入想要转换的内容,再点击调试按钮。(注意红色*为必填项)调试成功后,会提示提示成功或者失败。失败的话,请仔细查看对应的错误码信息,按照下方链接,找到对应的解决方法错误码_语音交互服务 SIS_API参考_附录_华为云 (huaweicloud.com)在成功界面,复制响应体内容,再打开华为云内置的CloudIDE,体验项目。(若未开通CloudIDE,进入CloudIDE_集成开发环境_WebIDE_华为云 (huaweicloud.com)点击【立即体验】免费开通即可)双击json文件,将上一步复制的响应体内容粘贴进去点击运行温馨提示:刚才复制的响应体内容,建议先下载,在赋值。小编刚通过自带的复制按钮,复制的不全,导致JSON格式异常,运行报错。运行成功后,返回到Explorer下,选择mp3文件,右键,选择download。在电脑中找到刚下载的文件,打开,就能听到转换后的语音内容了。实验过程到此结束,赶快体验吧,5分钟真的可以实现文本到语音的转换,转换后还是个美女小姐姐的声音哦。
-
【问题来源】【必填】 【可选问题来源:某地12345新建AICC项目】【问题简要】:AICC系统怎么对接科大的智能助手【问题类别】 【可选问题分类:坐席智能助手】【AICC解决方案版本】【必填】 【AICC可选择版本:AICC 8.15.0】 【UAP可选择版本:UAP9600 V100R005C00SPC018】 【CTI可选择版本:ICD V300R008C23】【期望解决时间】越快越好【问题现象描述】【必填】 某地12345需要新建一套AICC系统,采用入驻式模式,第三方CRM集成坐席接续,智能化由科大提供。 我知道华为云租户是有坐席实时转写功能的,入驻式的有没有这个功能,装哪些组件能实现?具体的步骤配置有哪些?现在科大给了份智能助手的接口文档,需要我们AICC侧完成对接, 我们仅仅是用平台的自带功能就能实现,还是需要一定的开发才能完成?
-
端午至,粽子香佳节到,祈福愿送上一份有“声”的祝福 敢于开口,方能出“粽”文字转语音,MP3文件上传到回帖,再配上您的体验感受即可具体方法可查看体验API Explore,花样玩转AI语音合成接口期望看到大家精彩的评论:1、体验过程中有哪些优化建议2、还能在哪些场景中使用AI语音合成接口3、期待华为云开发其他哪些接口?【本期微话题】AI语音佳节祈福【活动时间】22年5月28日~22年6月10日【参与方式】1、直接回复本帖,就微话题题目进行回答讨论2、为你觉得优质回复的楼层点赞或发表评论【本期奖品】优质回复奖:奖品抽取数量有效回复楼层数需达到华为三脚架自拍杆无线Pro版(黑色)120华为智选欧普读写台灯 白色140幸运回复奖:奖品抽取数量有效回复楼层数需达到华为云定制雨伞220华为云定制笔记本套装340【活动规则】1、开发者用户回复的内容,必须与本期的微话题相关,回复其他内容均视为无效内容,否则取消该用户获奖资格2、开发者用户回复内容的字数需≥100字,禁止复制其他楼层内容或改编自其它楼层内容(包括本人发布在其他楼层的内容),如经发现,取消该用户获奖资格3、本次活动不限用户的总回复数及连续回复数,但需保证回复质量,如华为云社区小编认定参与用户有恶意刷楼嫌疑,则取消该用户获奖资格 【评奖方式】1、在本帖所有有效回复的用户中抽取若干名幸运开发者获得幸运回复奖,奖品及数量见上方示例。2、在所有参加回复的用户中,根据其回复质量及被回复的数量,综合评选优秀奖,奖品见上方示例。3、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况。4、每期活动预计于结束后三天内完成奖项公示,并于结束后15个工作日内完成邮寄。 【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
一个完整的语音处理系统,包括前端的信号处理、中间的语音语义识别和对话管理(更多涉及自然语言处理),以及后期的语音合成。总体来说,随着语音技术的快速发展,之前的限定条件正在不断减少:包括从小词汇量到大词汇量再到超大词汇量;从限定语境到弹性语境再到任意语境;从安静环境到近场环境再到远场嘈杂环境;从朗读环境到口语环境再到任意对话环境;从单语种到多语种再到多语种混杂,这给语音处理提出了更高的要求。 语音的前端处理涵盖几个模块。说话人声检测:有效地检测说话人声开始和结束时刻,区分说话人声与背景声;回声消除:当音箱在播放音乐时,为了不暂停音乐而进行有效的语音识别,需要消除来自扬声器的音乐干扰;唤醒词识别:人类与机器交流的触发方式,就像日常生活中需要与其他人说话时,你会先喊一下那个人的名字;麦克风阵列处理:对声源进行定位,增强说话人方向的信号、抑制其他方向的噪音信号;语音增强:对说话人语音区域进一步增强、环境噪声区域进一步抑制,有效降低远场语音的衰减。除了手持设备是近场交互外,其他许多场景(车载、智能家居等)都是远场环境。在远场环境下,声音传达到麦克风时会衰减得非常厉害,导致一些在近场环境下不值一提的问题被显著放大。这就需要前端处理技术能够克噪声、混响、回声等问题,较好地实现远场拾音。 语音识别的过程需要经历特征提取、模型自适应、声学模型、语言模型、动态解码等多个过程。除了前面提到的远场识别问题之外,还有许多前沿研究集中于解决“鸡尾酒会问题”。“鸡尾酒会问题”显示的是**人类的一种听觉能力,能在多人场景的语音/噪声混合中,追踪并识别至少一个声音,在嘈杂环境下也不会影响正常交流**。这种能力体现在两种场景下:一是人们将注意力集中在某个声音上时,比如在鸡尾酒会上与朋友交谈时,即使周围环境非常嘈杂、音量甚至超过了朋友的声音,我们也能清晰地听到朋友说的内容;二是人们的听觉器官突然受到某个刺激的时候,比如远处突然有人喊了自己的名字,或者在非母语环境下突然听到母语的时候,即使声音出现在远处、音量很小,我们的耳朵也能立刻捕捉到。而机器就缺乏这种能力,虽然当前的语音技术在识别一个人所讲的内容时能够体现出较高的精度,当说话人数为两人或两人以上时,识别精度就会大打折扣。 如果用技术的语言来描述,问题的本质其实是给定多人混合语音信号,一个简单的任务是如何从中分离出特定说话人的信号和其他噪音,而复杂的任务则是分离出同时说话的每个人的独立语音信号。在这些任务上,研究者已经提出了一些方案,但还需要更多训练数据的积累、训练过程的打磨,逐渐取得突破,最终解决“鸡尾酒会问题”。
-
问题来源】【必填】 贵州110【问题简要】【必填】 open eye之间通话,rtp语音流是直连还是通过msu中转,如果直连需要放开的udp端口范围是多少,如果是msu中转,与uap之间的udp端口范围是多少,还有能否控制话机语音通话是直连,还是通过msu中转【问题类别】【必填】 OPEN Eye UAP9600 【AICC解决方案版本】【必填】 UAP V100R005C00SPC018 【期望解决时间】【选填】 尽快解决【问题现象描述】【必填】open eye之间通话,rtp语音流是直连还是通过msu中转,如果直连需要放开的udp端口范围是多少,如果是msu中转,与uap之间的udp端口范围是多少,还有能否控制话机语音通话是直连,还是通过msu中转
-
5月23日消息,第七次全国人口普查数据显示,我国60岁及以上人口已达2.64亿人,人口老龄化程度进一步加深。全球人口老龄化是21世纪具有决定性意义的人口趋势,“十四五”期间,我国老年人口将突破3亿人,将从轻度老龄化迈入中度老龄化,养老问题日益严峻。当大多数人享受科技进步带来的便利时,部分老年人却因为不会上网、不会使用智能手机,而无法享受科技产品与服务带来的便利,生活上遇到阻碍和困扰。如何让老年人共享科技发展的红利,已成为当下社会治理的新课题,推动科技适老已势在必行。今年世界电信和信息社会日(5月17日)的主题为“面向老年人和实现健康老龄化的数字技术”,便与科技适老紧密相关。工业和信息化部党组成员、副部长张云明在2022年世界电信和信息社会日大会上表示,2022年我国民生服务更加用心用力,数字便民实现普惠共享。科技适老成效显著,10余项适老化标准规范相继出台,375家老年人常用的网站、APP均推出适老助老功能,基础电信企业“老年人一键呼入人工客服”服务超1亿人次,科技适老已成社会共识。主动肩负央企责任,运营商助力银发一族跨越“数字鸿沟”上述成果的取得离不开ICT产业链企业的努力。“老有所养”“老有所依”是每个人的美好愿景和实际需求,作为科技适老的主力军,三大运营商主动肩负央企责任,助力银发一族跨越“数字鸿沟”。为了推动信息技术与养老服务业的融合创新,中国移动践行央企责任与使命,积极应对人口老龄化,依托自身5G+AICDE能力优势,通过构建服务新模式、搭建智慧平台、打造先进应用等形式,全方位赋能医、康、养产业升级;将居家养老服务与社区、机构、互联网医院等服务资源对接,最大程度提升老年人生活质量,让老年人尽享数字红利,为老年人健康舒适、安全便利的生活保驾护航。中国联通已挂牌成立2100个智慧助老服务中心,组织2.9万场银龄公益讲堂,65岁以上客户拨打10010直达人工服务4371万次;助老产品惠及225万老年客户,并发布了新的“银龄专享”服务计划,通过便捷服务、温情陪伴、智趣生活三大主题的10项服务举措,为老人提供更多服务。中国电信积极帮助银发一族跨越“数字鸿沟”,集中力量为老年人提供更便捷、更贴心、更优质的专属服务,全面推进各类触点适老化和无障碍改造。通过人脸识别等技术,实现“一键呼入”的远程视频客服;率先打造“爱心翼站”智能普惠服务渠道;扩大和丰富适老化终端;依托物联网、视联网等能力,提供智慧养老;实现“动动嘴、少跑腿,动动手、一键通”,让老年人享受到数字生活的幸福感、安全感。打造适老化智能终端,打通最后“一公里”智能终端是老年人接触数字世界、享受数字生活最直接的媒介。在智能手机终端方面,工信部早在2021年6月就已经发布了《移动终端适老化技术要求》《移动终端适老化测试方法》《智能电视适老化设计技术要求》三项标准,从屏幕显示、音频控制、语音交互、远程辅助、应急应用等方面,详细规定了智能终端在适老化方面的技术要求。国内主流手机品牌的多款机型基本具备无障碍模式或长辈模式,包括语音读屏、大字体、大音量播放、远程协助、SOS呼叫、健康监测、语速减慢等功能,方便老年人看得见、听得清、用得了。其中vivo、小米、OPPO相关系列的手机终端通过了测试验证,获得国内首批“移动终端适老化认证证书”。例如,OPPO的手机、智能电视和智能手表中均加入了适老化相关功能。比如:简易模式、屏幕共享、智能语音小布助手等,以此降低老年人使用智能手机的学习门槛。OPPO ColorOS 12操作系统也已内置诸多适合老年人的无障碍功能。在服务层面,OPPO通过遍布全国的线下零售网点和客户服务体系,通过企业服务网络,向老年用户展示或讲解数字化/智能化服务。截至目前,OPPO在全国各地客服中心举办的“O学堂”手机讲座已超400场。而早在2019年,vivo就推出了适合老年群体阅读、理解的《智能手机使用速成宝典》,从多个方面进行手机使用步骤拆解。同时,vivo也推出了诸多适合老年人的功能。比如:vivo手机中的“简易桌面”应用、“共享相册”模块和“老照片修复”模块,可提升老人使用手机的便捷性;而Jovi语音助手可帮老人通过语音一键传达指令并完成操作;屏幕朗读功能可以解放老人的眼睛和双手;AI字幕功能可以为老人提供实时视频翻译;无障碍应用下载专区将经过无障碍与适老化改造的、已取得信息无障碍标识的APP统一纳入专区,方便老年人、残障人士等重点受益群体下载使用。同时,在全国800多个线下服务中心,vivo均安排了专业服务人员,为前来咨询的老人提供耐心指导。没有局限于对自有产品的优化,vivo还参与建设国家政务服务平台快应用,推出老年人办事服务区等功能,让银发群体的日常数字生活更便捷。为了解决好老年人运用智能设备遇到的困难,针对“老年人看电视”这一实际需求,科大讯飞一直携手国内运营商推动语音遥控器的普及与运用。综合考虑到老年群体特点,设计上精简按键的同时还新增智能语音控制功能,让老年人可以通过语音轻松地选择自己喜欢的节目。华为联合北京老年开放大学开发了“鹤颜学堂”,利用“线上+线下”的教学模式,给老年人讲解智能手机的基础功能和反诈等简洁实用的知识。魅族手机特殊的家庭守护功能,包含了防诈骗、查找家人、远程协助、防沉迷等多个小功能。多家厂商齐行动,打造适老化APP除了智能终端外,要想享受到数字服务,离不开各种实现适老化改造的APP。为消除老年人面临的“数字鸿沟”,工信部发布了《移动互联网应用适老化通用设计规范》和《互联网应用适老化评测体系》,并开展互联网应用适老化和无障碍专项行动。阿里巴巴一直关注老年人的数字生活体验。此前,阿里巴巴曾在国内率先推出关爱老年人专项公益行动——“小棉袄计划”,通过专属热线、视频课程、线下课堂、实体手册等线上线下相结合的形式,帮助老年人跨越“数字鸿沟”。此外,围绕老年群体高频使用的生活场景,阿里旗下各APP适老化改造逐步推进:淘宝、优酷、闲鱼、饿了么等阿里旗下“国民应用”APP陆续上线“长辈模式”;继多年前的亲情账号、亲情版本后,淘宝上线“拍药瓶买药“功能,结合银发族日常网络购药需求,有针对性地扫除障碍。腾讯公司积极响应号召,对微信、微信支付、QQ、腾讯新闻、全民K歌、QQ音乐、腾讯网等产品深入推进适老化和无障碍改造工作,上线适老模式及版本、适配无障碍功能,切实解决老年人、残疾人跨越“数字鸿沟”问题。同时,通过开办银龄学堂、上线银发青松助手小程序、开展志愿者线下帮扶活动等,让更多的老年人、残疾人学习使用智能技术。例如,微信在2021年9月正式推出“关怀模式”,模式下的文字更大更清晰,色彩更强更好认,按钮更大更易用,近期还增加了“听文字消息”的功能。而百度在2020年推出了“看听模式”,“一键开启信息流看听”的功能对视力不佳的老年人十分友好。百度还在智能屏产品上推出了“长辈模式”,通过简化界面、聚合特定内容、定制专属客服等功能,帮助老年人独立、便捷地获取互联网信息和服务。相信在ICT产业链企业的积极行动和共同努力下,将有越来越多的老年人可以享受到数字世界的美好,畅享信息技术带来的红利。
上滑加载中
推荐直播
-
OpenHarmony应用开发之网络数据请求与数据解析
2025/01/16 周四 19:00-20:30
华为开发者布道师、南京师范大学泰州学院副教授,硕士研究生导师,开放原子教育银牌认证讲师
科技浪潮中,鸿蒙生态强势崛起,OpenHarmony开启智能终端无限可能。当下,其原生应用开发适配潜力巨大,终端设备已广泛融入生活各场景,从家居到办公、穿戴至车载。 现在,机会敲门!我们的直播聚焦OpenHarmony关键的网络数据请求与解析,抛开晦涩理论,用真实案例带你掌握数据访问接口,轻松应对复杂网络请求、精准解析Json与Xml数据。参与直播,为开发鸿蒙App夯实基础,抢占科技新高地,别错过!
回顾中 -
Ascend C高层API设计原理与实现系列
2025/01/17 周五 15:30-17:00
Ascend C 技术专家
以LayerNorm算子开发为例,讲解开箱即用的Ascend C高层API
回顾中
热门标签