精华内容
下载资源
问答
  • 包含文件 ToSpeech.cs Unity脚本文件 tts_offline_sample.c 讯飞发音打包 dll 修改 asr_record_sample.c 讯飞命令词识别 打包dll 修改 xunfei_speech 讯飞语音库模型等文件,测试时候放到C盘目录下 相关使用说明 ...
  • 今天小编就为大家分享一篇关于易语言发音比较命令使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • nest-cli常用命令

    千次阅读 2020-07-25 15:49:51
    nest g app appname 这个命令在很多的文档里面也没有介绍 说明:generate(g)命令可以根据原理图生成或修改文件 创建项目 nest new name 创建控制器 nest g co controllername 创建模块 nest g mo model...

    创建子应用

    nest g app appname 这个命令在很多的文档里面也没有介绍

    说明:generate(g)命令可以根据原理图生成或修改文件

    创建项目

    nest new name

    创建控制器

    nest g co controllername

    创建模块

    nest g mo modelname

    创建服务

    nest g s servicename

    创建新库

    nest g lib libraryname

    展开全文
  • 讯飞离线语音命令词+TTS离线发音,实现命令词交互(windows dll for unity插件) 步骤一 登录讯飞平台注册并创建自己的应用 https://www.xfyun.cn 步骤二 下载离线命令词识别SDK windows MSC ,注意下载...

    步骤一

    登录讯飞平台注册并创建自己的应用

    https://www.xfyun.cn 

     

    步骤二

    下载离线命令词识别SDK windows MSC ,注意下载的SDK会根据你的appid捆绑在代码段里,应该是讯飞的版权策略

    步骤三

    下载离线语音合成(普通版)SDK ,

     

    步骤四

    根据官方提示需要使用 vs2010 版本 不想折腾版本兼容问题,就乖乖安装。

    链接:网盘下载地址    提取码:9541 

    步骤五

    1.解压  离线命令词识别SDK压缩包 和 离线语音合成(普通版)压缩包。

    2.使用vs2010打开项目/解决方案  打开解压后samples文件夹里的工程文件。

    3.配置换开发环境 ,请参考  离线命令词识别 Windows SDK 文档 和 离线语音合成 Windows SDK 文档

    4.确定samples工程可以正常运行。

    步骤六 

    将离线语音合成打包成DLL库

    1.当前运行的工程为win32控制台模式,修改成dll ,右键项目解决方案 -> 属性 ->常规->配置类型修改成(动态库.dll)

    2.替换下面改造dll代码,tts_offline_sample.c,注意替换成自己的appid

    /*
    * 语音合成(Text To Speech,TTS)技术能够自动将任意文字实时转换为连续的
    * 自然语音,是一种能够在任何时间、任何地点,向任何人提供语音信息服务的
    * 高效便捷手段,非常符合信息时代海量数据、动态更新和个性化查询的需求。
    */
    
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <intrin.h>
    
    #include <string.h>
    #include <Windows.h>
    #include <locale.h>
    
    
    #include "qtts.h"
    #include "msp_cmn.h"
    #include "msp_errors.h"
    
    #ifdef _WIN64
    #pragma comment(lib,"../../libs/msc_x64.lib")//x64
    #else
    #pragma comment(lib,"../../libs/msc.lib")//x86
    #endif
    
    /* wav音频头部格式 */
    typedef struct _wave_pcm_hdr
    {
        char            riff[4];                // = "RIFF"
        int                size_8;                 // = FileSize - 8
        char            wave[4];                // = "WAVE"
        char            fmt[4];                 // = "fmt "
        int                fmt_size;                // = 下一个结构体的大小 : 16
    
        short int       format_tag;             // = PCM : 1
        short int       channels;               // = 通道数 : 1
        int                samples_per_sec;        // = 采样率 : 8000 | 6000 | 11025 | 16000
        int                avg_bytes_per_sec;      // = 每秒字节数 : samples_per_sec * bits_per_sample / 8
        short int       block_align;            // = 每采样点字节数 : wBitsPerSample / 8
        short int       bits_per_sample;        // = 量化比特数: 8 | 16
    
        char            data[4];                // = "data";
        int                data_size;              // = 纯数据长度 : FileSize - 44 
    } wave_pcm_hdr;
    
    /* 默认wav音频头部数据 */
    wave_pcm_hdr default_wav_hdr = 
    {
        { 'R', 'I', 'F', 'F' },
        0,
        {'W', 'A', 'V', 'E'},
        {'f', 'm', 't', ' '},
        16,
        1,
        1,
        16000,
        32000,
        2,
        16,
        {'d', 'a', 't', 'a'},
        0  
    };
    
    
    char *wchar_t_to_char(const wchar_t *str){
        char *result = NULL;
        int textlen = 0;
        textlen = WideCharToMultiByte(CP_ACP,0,str,-1,NULL,0,NULL,NULL);
        result = (char*)malloc((textlen+1)*sizeof(char));
        memset(result,0,sizeof(char)*(textlen+1));
        WideCharToMultiByte(CP_ACP,0,str,-1,result,textlen,NULL,NULL);
        return result;
    }
    
    /* 文本合成 */
    int text_to_speech(const char* src_text, const char* des_path, const char* params)
    {
        int          ret          = -1;
        FILE*        fp           = NULL;
        const char*  sessionID    = NULL;
        unsigned int audio_len    = 0;
        wave_pcm_hdr wav_hdr      = default_wav_hdr;
        int          synth_status = MSP_TTS_FLAG_STILL_HAVE_DATA;
    
        if (NULL == src_text || NULL == des_path)
        {
            printf("params is error!\n");
            return 0;
        }
        fp = fopen(des_path, "wb");
        if (NULL == fp)
        {
            printf("open %s error.\n", des_path);
            return 1;
        }
        /* 开始合成 */
        sessionID = QTTSSessionBegin(params, &ret);
        if (MSP_SUCCESS != ret)
        {
            printf("QTTSSessionBegin failed, error code: %d.\n", ret);
            fclose(fp);
            return 2;
        }
        ret = QTTSTextPut(sessionID, src_text, (unsigned int)strlen(src_text), NULL);
        if (MSP_SUCCESS != ret)
        {
            printf("QTTSTextPut failed, error code: %d.\n",ret);
            QTTSSessionEnd(sessionID, "TextPutError");
            fclose(fp);
            return 3;
        }
        printf("正在合成 ...\n");
        fwrite(&wav_hdr, sizeof(wav_hdr) ,1, fp); //添加wav音频头,使用采样率为16000
        while (1) 
        {
            /* 获取合成音频 */
            const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
            if (MSP_SUCCESS != ret)
                break;
            if (NULL != data)
            {
                fwrite(data, audio_len, 1, fp);
                wav_hdr.data_size += audio_len; //计算data_size大小
            }
            if (MSP_TTS_FLAG_DATA_END == synth_status)
                break;
        }
        printf("\n");
        if (MSP_SUCCESS != ret)
        {
            printf("QTTSAudioGet failed, error code: %d.\n",ret);
            QTTSSessionEnd(sessionID, "AudioGetError");
            fclose(fp);
            return 4;
        }
        /* 修正wav文件头数据的大小 */
        wav_hdr.size_8 += wav_hdr.data_size + (sizeof(wav_hdr) - 8);
    
        /* 将修正过的数据写回文件头部,音频文件为wav格式 */
        fseek(fp, 4, 0);
        fwrite(&wav_hdr.size_8,sizeof(wav_hdr.size_8), 1, fp); //写入size_8的值
        fseek(fp, 40, 0); //将文件指针偏移到存储data_size值的位置
        fwrite(&wav_hdr.data_size,sizeof(wav_hdr.data_size), 1, fp); //写入data_size的值
        fclose(fp);
        fp = NULL;
        /* 合成完毕 */
        ret = QTTSSessionEnd(sessionID, "Normal");
        if (MSP_SUCCESS != ret)
        {
            printf("QTTSSessionEnd failed, error code: %d.\n",ret);
        }
    
        return 5;
    }
    
    /* 用户登录 */
    __declspec(dllexport)  int loading_tts(){
        int         ret                  = MSP_SUCCESS;
        const char* login_params         = "appid = 替换自己的appid, work_dir = .";//登录参数,appid与msc库绑定,请勿随意改动
        ret = MSPLogin(NULL, NULL, login_params); //第一个参数是用户名,第二个参数是密码,第三个参数是登录参数,用户名和密码可在http://www.xfyun.cn注册获取
        if (MSP_SUCCESS != ret)
        {
            MSPLogout(); 
            return 0;
        }
        return 1;
    }
    
    /* 开始转换 */
    __declspec(dllexport)  int to_speech(wchar_t * wav_path, wchar_t * tts_text){
        int         ret                  = MSP_SUCCESS;
        const char* session_begin_params = "engine_type = local, voice_name = xiaoyan, text_encoding = GB2312, tts_res_path = fo|C:\\xunfei_speech\\xiaoyan.jet;fo|C:\\xunfei_speech\\common.jet, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";
        //const char* filename             = "C:\\xunfei_speech\\tts_sample.wav"; //合成的语音文件名称s
        //const char* text                 = "亲爱的用户,您好,这是一个语音合成示例,感谢您对小螺丝语音技术的支持!小螺丝是亚太地区最大的上市公司,股票代码:002233"; //合成文本
        const char* filename             =wchar_t_to_char(wav_path);
        const char* text                 =wchar_t_to_char(tts_text);
        ret = text_to_speech(text, filename, session_begin_params);
        return ret;
    }
    
    
    /* 释放 */
    __declspec(dllexport)  int free_tts(){
       MSPLogout(); 
       return 1;
    }

    3.重新生成DLL

     

    步骤七

    将离线语音命令词打包成DLL库

    1.当前运行的工程为win32控制台模式,修改成dll ,右键项目解决方案 -> 属性 ->常规->配置类型修改成(动态库.dll)

    2.替换下面改造dll代码,asr_record_sample.c,注意替换成自己的appid

    /*
    * 语音听写(iFly Auto Transform)技术能够实时地将语音转换成对应的文字。
    */
    
    #include <stdlib.h>
    #include <stdio.h>
    //#include <string.h>
    
    #include <windows.h>
    #include <conio.h>
    #include <errno.h>
    #include <process.h>
    
    
    #include "../../include/qisr.h"
    #include "../../include/msp_cmn.h"
    #include "../../include/msp_errors.h"
    #include "./include/speech_recognizer.h"
    
    #define FRAME_LEN	640 
    #define	BUFFER_SIZE	4096
    
    enum{
    	EVT_START = 0,
    	EVT_STOP,
    	EVT_QUIT,
    	EVT_TOTAL
    };
    static HANDLE events[EVT_TOTAL] = {NULL,NULL,NULL};
    
    static COORD begin_pos = {0, 0};
    static COORD last_pos = {0, 0};
    #define SAMPLE_RATE_16K     (16000)
    #define SAMPLE_RATE_8K      (8000)
    #define MAX_GRAMMARID_LEN   (32)
    #define MAX_PARAMS_LEN      (1024)
    
    const char * ASR_RES_PATH        = "fo|C:\\xunfei_speech\\command_speech\\common.jet";  //离线语法识别资源路径
    #ifdef _WIN64
    const char * GRM_BUILD_PATH      = "C:\\xunfei_speech\\command_speech\\GrmBuilld_x64";  //构建离线语法识别网络生成数据保存路径
    #else
    const char * GRM_BUILD_PATH      = "C:\\xunfei_speech\\command_speech\\GrmBuilld";  //构建离线语法识别网络生成数据保存路径
    #endif
    const char * GRM_FILE            = "C:\\xunfei_speech\\command_speech\\call.bnf"; //构建离线识别语法网络所用的语法文件
    const char * LEX_NAME            = "contact"; //更新离线识别语法的contact槽(语法文件为此示例中使用的call.bnf)
    typedef struct _UserData {
    	int     build_fini;  //标识语法构建是否完成
    	int     update_fini; //标识更新词典是否完成
    	int     errcode; //记录语法构建或更新词典回调错误码
    	char    grammar_id[MAX_GRAMMARID_LEN]; //保存语法构建返回的语法ID
    }UserData;
    
    const char *get_audio_file(void); //选择进行离线语法识别的语音文件
    int build_grammar(UserData *udata); //构建离线识别语法网络
    int update_lexicon(UserData *udata); //更新离线识别语法词典
    int run_asr(UserData *udata); //进行离线语法识别
    
    int build_grm_cb(int ecode, const char *info, void *udata)
    {
    	UserData *grm_data = (UserData *)udata;
    
    	if (NULL != grm_data) {
    		grm_data->build_fini = 1;
    		grm_data->errcode = ecode;
    	}
    
    	if (MSP_SUCCESS == ecode && NULL != info) {
    		printf("构建语法成功! 语法ID:%s\n", info);
    		if (NULL != grm_data)
    			_snprintf(grm_data->grammar_id, MAX_GRAMMARID_LEN - 1, info);
    	}
    	else
    		printf("构建语法失败!%d\n", ecode);
    
    	return 0;
    }
    
    int build_grammar(UserData *udata)
    {
    	FILE *grm_file                           = NULL;
    	char *grm_content                        = NULL;
    	unsigned int grm_cnt_len                 = 0;
    	char grm_build_params[MAX_PARAMS_LEN]    = {NULL};
    	int ret                                  = 0;
    
    	grm_file = fopen(GRM_FILE, "rb");	
    	if(NULL == grm_file) {
    		printf("打开\"%s\"文件失败![%s]\n", GRM_FILE, strerror(errno));
    		return -1; 
    	}
    
    	fseek(grm_file, 0, SEEK_END);
    	grm_cnt_len = ftell(grm_file);
    	fseek(grm_file, 0, SEEK_SET);
    
    	grm_content = (char *)malloc(grm_cnt_len + 1);
    	if (NULL == grm_content)
    	{
    		printf("内存分配失败!\n");
    		fclose(grm_file);
    		grm_file = NULL;
    		return -1;
    	}
    	fread((void*)grm_content, 1, grm_cnt_len, grm_file);
    	grm_content[grm_cnt_len] = '\0';
    	fclose(grm_file);
    	grm_file = NULL;
    
    	_snprintf(grm_build_params, MAX_PARAMS_LEN - 1, 
    		"engine_type = local, \
    		asr_res_path = %s, sample_rate = %d, \
    		grm_build_path = %s, ",
    		ASR_RES_PATH,
    		SAMPLE_RATE_16K,
    		GRM_BUILD_PATH
    		);
    	ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, build_grm_cb, udata);
    
    	free(grm_content);
    	grm_content = NULL;
    
    	return ret;
    }
    
    int update_lex_cb(int ecode, const char *info, void *udata)
    {
    	UserData *lex_data = (UserData *)udata;
    
    	if (NULL != lex_data) {
    		lex_data->update_fini = 1;
    		lex_data->errcode = ecode;
    	}
    
    	if (MSP_SUCCESS == ecode)
    		printf("更新词典成功!\n");
    	else
    		printf("更新词典失败!%d\n", ecode);
    
    	return 0;
    }
    
    int update_lexicon(UserData *udata)
    {
    	const char *lex_content                   = "丁伟\n黄辣椒";
    	unsigned int lex_cnt_len                  = strlen(lex_content);
    	char update_lex_params[MAX_PARAMS_LEN]    = {NULL}; 
    
    	_snprintf(update_lex_params, MAX_PARAMS_LEN - 1, 
    		"engine_type = local, text_encoding = GB2312, \
    		asr_res_path = %s, sample_rate = %d, \
    		grm_build_path = %s, grammar_list = %s, ",
    		ASR_RES_PATH,
    		SAMPLE_RATE_16K,
    		GRM_BUILD_PATH,
    		udata->grammar_id);
    	return QISRUpdateLexicon(LEX_NAME, lex_content, lex_cnt_len, update_lex_params, update_lex_cb, udata);
    }
    
    
    static void show_result(char *string, char is_over)
    {
    	COORD orig, current;
    	CONSOLE_SCREEN_BUFFER_INFO info;
    	HANDLE w = GetStdHandle(STD_OUTPUT_HANDLE);
    	GetConsoleScreenBufferInfo(w, &info);
    	current = info.dwCursorPosition;
    
    	if(current.X == last_pos.X && current.Y == last_pos.Y ) {
    		SetConsoleCursorPosition(w, begin_pos);
    	} else {
    		/* changed by other routines, use the new pos as start */
    		begin_pos = current;
    	}
    	if(is_over)
    		SetConsoleTextAttribute(w, FOREGROUND_GREEN);
    	printf("Result: [ %s ]\n", string);
    	if(is_over)
    		SetConsoleTextAttribute(w, info.wAttributes);
    
    	GetConsoleScreenBufferInfo(w, &info);
    	last_pos = info.dwCursorPosition;
    }
    
    static char *g_result = NULL;  //
    
    static char bk_result[1024]="0";
    
    
    static unsigned int g_buffersize = BUFFER_SIZE;
    static UserData g_asr_data; 
    struct speech_rec g_asr;
    
    void on_result(const char *result, char is_last)
    {
    	if (result) {
    		size_t left = g_buffersize - 1 - strlen(g_result);
    		size_t size = strlen(result);
    		if (left < size) {
    			g_result = (char*)realloc(g_result, g_buffersize + BUFFER_SIZE);
    			if (g_result)
    				g_buffersize += BUFFER_SIZE;
    			else {
    				printf("mem alloc failed\n");
    				return;
    			}
    		}
    
    		strncat(g_result, result, size);
            printf(g_result);
    		strcpy(bk_result,g_result);
    
    		//show_result(g_result, is_last);
    	}
    }
    void on_speech_begin()
    {
    	if (g_result)
    	{
    		free(g_result);
    	}
    
    
    	g_result = (char*)malloc(BUFFER_SIZE);
    	g_buffersize = BUFFER_SIZE;
    	memset(g_result, 0, g_buffersize);
    	printf("Start Listening...\n");
    
    
    }
    void on_speech_end(int reason)
    {
    	if (reason == END_REASON_VAD_DETECT){
    		printf("\nSpeaking done \n");
           // g_result = (char*)"Speaking done";
    		//strcpy(bk_result,"Speaking done");
    	}else{
    		printf("\nRecognizer error %d\n", reason);
    		//g_result = (char*)"Recognizer error";
    		//strcpy(bk_result,"Recognizer error");
    	}
    }
    
    /* demo recognize the audio from microphone */
    static void recognize_mic(const char* session_begin_params)
    {
    	int errcode;
    	int i = 0;
    	HANDLE helper_thread = NULL;
    
    	DWORD waitres;
    	char isquit = 0;
    
    	struct speech_rec_notifier recnotifier = {
    		on_result,
    		on_speech_begin,
    		on_speech_end
    	};
    
    	errcode = sr_init(&g_asr, session_begin_params, SR_MIC, DEFAULT_INPUT_DEVID, &recnotifier);
    	if (errcode) {
    		printf("speech recognizer init failed\n");
    		return;
    	}
    }
    
    
    int run_asr(UserData *udata)
    {
    	char asr_params[MAX_PARAMS_LEN]    = {NULL};
    	const char *rec_rslt               = NULL;
    	const char *session_id             = NULL;
    	const char *asr_audiof             = NULL;
    	FILE *f_pcm                        = NULL;
    	char *pcm_data                     = NULL;
    	long pcm_count                     = 0;
    	long pcm_size                      = 0;
    	int last_audio                     = 0;
    	int aud_stat                       = MSP_AUDIO_SAMPLE_CONTINUE;
    	int ep_status                      = MSP_EP_LOOKING_FOR_SPEECH;
    	int rec_status                     = MSP_REC_STATUS_INCOMPLETE;
    	int rss_status                     = MSP_REC_STATUS_INCOMPLETE;
    	int errcode                        = -1;
    	int aud_src                        = 1;
    
    	//离线语法识别参数设置
    	_snprintf(asr_params, MAX_PARAMS_LEN - 1, 
    		"engine_type = local, \
    		asr_res_path = %s, sample_rate = %d, \
    		grm_build_path = %s, local_grammar = %s, \
    		result_type = xml, result_encoding = GB2312, ",
    		ASR_RES_PATH,
    		SAMPLE_RATE_16K,
    		GRM_BUILD_PATH,
    		udata->grammar_id
    		);
    
    		recognize_mic(asr_params);
    
    	return 0;
    }
    
    
    int main(int argc, char* argv[]){
     	const char *login_config    = "appid = 5fa0d519"; //登录参数
    	int ret                    = 0 ;
    	ret = MSPLogin(NULL, NULL, login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数
    	if (MSP_SUCCESS != ret) {
    		printf("登录失败:%d\n", ret);
    		//goto exit;
    	}
    
    	memset(&g_asr_data, 0, sizeof(UserData));
    	printf("构建离线识别语法网络...\n");
    	ret = build_grammar(&g_asr_data);  //第一次使用某语法进行识别,需要先构建语法网络,获取语法ID,之后使用此语法进行识别,无需再次构建
    	if (MSP_SUCCESS != ret) {
    		printf("构建语法调用失败!\n");
    	}
    
    	while (1 != g_asr_data.build_fini)
    		_sleep(300);
    	if (MSP_SUCCESS != g_asr_data.errcode)
    	printf("离线识别语法网络构建完成,开始识别...\n");	
    
    	ret = run_asr(&g_asr_data);
    	if (MSP_SUCCESS != ret) {
    		printf("离线语法识别出错: %d \n", ret);
    	}
    	while(1){
    	sr_start_listening(&g_asr);
        _sleep(1000);
    	}
    	return 1;
    }
    
    //初始化登录
    __declspec(dllexport)  int loading_msp(){
    	const char *login_config    = "appid = 替换自己的appid"; //登录参数
    	int ret                    = 0 ;
    	ret = MSPLogin(NULL, NULL, login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数
    	if (MSP_SUCCESS != ret) {
    		MSPLogout();
    		return 0;
    	}
    	memset(&g_asr_data, 0, sizeof(UserData));
        return 1;
    }
    
    /* 构建命令词网络 */
    __declspec(dllexport)  int build_net_msp(){
    	int ret                    = 0 ;
    	printf("构建离线识别语法网络...\n");
    	ret = build_grammar(&g_asr_data);  //第一次使用某语法进行识别,需要先构建语法网络,获取语法ID,之后使用此语法进行识别,无需再次构建
    	if (MSP_SUCCESS != ret) {
    		printf("构建语法调用失败!\n");
    		return -1;
    	}
    	while (1 != g_asr_data.build_fini)
    		_sleep(300);
    	if (MSP_SUCCESS != g_asr_data.errcode)
    		return 0;
    	return 1;
    }
    
    /* 更新词典槽 */
    __declspec(dllexport)  int update_lexicon_msp(){
    	int ret                    = 0 ;
    	printf("更新离线语法词典...\n");
    	ret = update_lexicon(&g_asr_data);  //当语法词典槽中的词条需要更新时,调用QISRUpdateLexicon接口完成更新
    	if (MSP_SUCCESS != ret) {
    		printf("更新词典调用失败!\n");
    		return 0;
    	}
    	while (1 != g_asr_data.update_fini)
    		_sleep(300);
    	if (MSP_SUCCESS != g_asr_data.errcode)
    		return 0;
    	return 1;
    }
    
    /* 识别命令词 */
    __declspec(dllexport)  int init_run_msp(){
    	int ret                    = 0 ;
    	ret = run_asr(&g_asr_data);
    	if (MSP_SUCCESS != ret) {
    		printf("离线语法识别出错: %d \n", ret);
    		return 0;
    	}
    	return 1;
    }
    
    static wchar_t * char2wchar(char *str){ 
    	int length = strlen(str)+1;
    	wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
    	memset(t,0,length*sizeof(wchar_t));
    	MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
    	return t;
    }
    
    /* 识别命令词 */
    __declspec(dllexport) wchar_t* start_listening(){
        
        wchar_t* re;
    	if (sr_start_listening(&g_asr)!=NULL){
        // char * str1 = "小螺丝科技有限公司hahah1523";//g_result
    	}
    	re = char2wchar(bk_result);	
    	strcpy(bk_result,"0");
    	return re;
    }
    
    
    /* 释放 */
    __declspec(dllexport)  int free_msp(){
    	MSPLogout();
    	return 1;
    }
    

    3.编译,重新生成DLL

    4.提示 :打包dll后,确保在dll在unity里能够正常读取讯飞语音包引擎文件,这里添加了绝对路径 ,创建文件夹  c:\xunfei_speech 将SDK里的资源文件复制进去确保能够真确引用。

    步骤八  Unity 调用 dll 实现业务交互调用

    1.创建unity工程 speech_demo

    2.Unity项目目录 Assets/Scenes 目录下创建目录 全路径为 Assets/Scenes/Plugins/Windows/X86_64(64位平台) Assets/Scenes/Plugins/Windows/X86(32位平台)创建Unity可引用的dll目录,将 asr_record_sample.dll、tts_offline_sample.dll,msc_x64.dll(两个引擎可共用一个),x86平台为msc_x.dll,复制到目录下。

    3.创建脚本ToSpeech.cs,脚本代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    using System;
    using System.Text;
    using System.Linq;
    using System.IO;
    using System.Xml;
    
    using System.Runtime.InteropServices;
    
    
    
    public class ToSpeech : MonoBehaviour
    {
    
         //初始化TTS离线朗读语音引擎
        [DllImport("tts_offline_sample", EntryPoint = "loading_tts", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        extern static int loading_tts();
        //合成语音文件
        [DllImport("tts_offline_sample", EntryPoint = "to_speech", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        extern static int to_speech([MarshalAs(UnmanagedType.LPWStr)]string wav_path, [MarshalAs(UnmanagedType.LPWStr)]string tts_text);
        //释放TTS朗读语音引擎
        [DllImport("tts_offline_sample", EntryPoint = "free_tts", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        extern static int free_tts();
    
        //初始化命令词识别离线引擎
        [DllImport("asr_offline_record_sample", EntryPoint = "loading_msp", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern int loading_msp();
        //初始化预热识别
        [DllImport("asr_offline_record_sample", EntryPoint = "init_run_msp", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int init_run_msp();   
        //构建识别网络
        [DllImport("asr_offline_record_sample", EntryPoint = "build_net_msp", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int build_net_msp();
        //更新词典槽
        [DllImport("asr_offline_record_sample", EntryPoint = "update_lexicon_msp", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int update_lexicon_msp();
         //开启监听——micphone
        [DllImport("asr_offline_record_sample", EntryPoint = "start_listening", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern IntPtr start_listening();   
        //释放命令词识别离线引擎
        [DllImport("asr_offline_record_sample", EntryPoint = "free_msp", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int free_msp();
    
        //test
        //[DllImport("asr_offline_record_sample", EntryPoint = "test", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        //public static extern int test();
    
        public bool listening_off = false; //监听器循环开启关闭开关
        public int confidenct = 25; //置信度调节
        private int tts_off = 0;
        private float lastTime;
        private float curTime;
    
    
    
        void Start()
        {
           init_listing();
        }
    
        void Update()
        {
          update_listing();
        }
    
    
    
    //讲述人///
    
        public AudioSource aud;//需要节点关联
    
        IEnumerator LoadAudio(string recordPath)
        {
            WWW www = new WWW(recordPath);
            yield return www;
            var clipTemp = www.GetAudioClip();
            aud.clip = clipTemp;
            aud.Play();
        }
    
        private void speech_tts(string tts_text)
        {
    
            string wav_path = @"C:\\xunfei_speech\\" + tts_text + ".wav";
            if (File.Exists(wav_path))
            {
                StartCoroutine(LoadAudio(wav_path));
                return;
            }
            //如果文件已经生成就不用在合成了,直接读取播放
    
            tts_off = loading_tts();
            if (tts_off == 1)
            {
                print("初始化朗读成功:" + tts_off);
                int ret2 = to_speech(wav_path, tts_text);
                StartCoroutine(LoadAudio(wav_path));
            }
            else
            {
                print("初始化失败:" + tts_off);
            }
            free_tts();
        }
    
    
    /聆听人//
    
        //功能:初始化监听器
        void init_listing()
        {
            if (1 == loading_msp())
            {
                print("载入初始化成功");
                //实际应用中只执行一次///
                if (1 == build_net_msp())
                {
                    print("下载构建网络命令词成功");
                    if (1 == update_lexicon_msp())
                    {
                       print("更新词典槽成功");
                    }
                }
                
                if (1 == init_run_msp())
                {
                    print("预热命令词成功");
                    listening_off = true;
                }
            }
            lastTime = Time.time;
        }
    
        //功能:循环发送mic监听器开启,可以重复发送,sdk 做了同步处理
        //返回:xml格式数据
        string update_listing()
        {
            string restr = "0";
            curTime = Time.time;
            if (curTime - lastTime >= 1)
            {
                if (listening_off)
                {
                    IntPtr ip = start_listening();
                    restr = Marshal.PtrToStringUni(ip);
                    print("打开麦克风监听中..." + restr);
                    get_result_confidenct(restr);//解析xml
                }
               // print(curTime - lastTime);
                lastTime = curTime;
            }
            return restr;
        }
    
        //功能:释放监听器
        void OnDestroy(){
            free_msp();
            print("退出了");
        } 
    
        //功能:语音识别结果返回xml解析
        //传入:xml字符串;
        //返回:置信度结果,是一个0~1的浮点类型数字;
        double get_result_confidenct(string strxml)
        {
            // string strxml = @"<?xml version='1.0' encoding='gb2312' standalone='yes' ?><nlp>  <version>1.1</version>  <rawtext>您好</rawtext>  <confidence>27</confidence>  <engine>local</engine>  <result>    <focus>您好</focus>    <confidence>18</confidence>    <object>      <您好 id='65535'>您好</您好>    </object>  </result></nlp>";
            if (Equals(strxml,"0")) { return 0; }  //输入不是xml过滤掉 直接 返回结果;
         
            XmlDocument xml = new XmlDocument();
            XmlReaderSettings set = new XmlReaderSettings();
            set.IgnoreComments = true;
            xml.LoadXml(strxml);
    
            int s_confidenct = 0;
            string s_rawtext = "";
            int d_confidenct = 0;
            string d_focus = "";
            double res = 0;
    
            XmlNodeList sour_xmlNodeList = xml.SelectSingleNode("nlp").ChildNodes;
            foreach (XmlElement node in sour_xmlNodeList)
            {
                if (node.Name == "confidence")
                {
                    s_confidenct = int.Parse(node.InnerText.Trim());
                    print(node.Name + ":" + s_confidenct);
                }
                if (node.Name == "rawtext")
                {
                    s_rawtext = node.InnerText.Trim();
                    print(node.Name + ":" + s_rawtext);
                }
            }
    
            XmlNodeList back_dst_xmlNodeList = xml.SelectSingleNode("nlp").SelectSingleNode("result").ChildNodes;
            foreach (XmlElement node in back_dst_xmlNodeList)
            {
                if (node.Name == "confidence")
                {
                    d_confidenct = int.Parse(node.InnerText.Trim());
                    print(node.Name + ":" + d_confidenct);
                }
                if (node.Name == "focus")
                {
                    d_focus = node.InnerText.Trim();
                    print(node.Name + ":" + d_focus);
                }
            }
    
            if (s_confidenct > confidenct)//识别置信度调节
            {
             send_speech_result(d_focus, s_confidenct);
            }
    
            return res;  //返回匹配相似度;
        }
    
        //功能:向父脚本子脚本广播识别结果
        //传入:1.结果文本|2.置信度|3.计算的匹配率 0~1 之间的浮点数
        void send_speech_result(string focus, int percent)
        {
    
            listening_off = false;
            free_msp();//临时退出登录
            if (Equals(focus, "小微") || Equals(focus, "小微小微"))
            {
              speech_tts("在的");
              init_listing();
              return;
            }
            speech_tts(focus);
            init_listing();
     
            //以下是将语音识别结果广播给其他节点
            object[] message = new object[2];
            message[0] = focus;
            message[1] = percent;
            this.gameObject.SendMessage("speech_result", message, SendMessageOptions.DontRequireReceiver);
            this.gameObject.BroadcastMessage("speech_result", message, SendMessageOptions.DontRequireReceiver);
        }
    
    /
    
    
    }
    

    4.Unity创建 节点1 2D Sprinte 节点2 Audio Audio source  将节点2拖拽到节点1 Inspector面板 Aud节点实现引用关联。

    5.该应用使用命令词实现了类似本地唤醒功能,软件运行后一直update 麦克风,监听到命令响应在的 或做其他命令处理。

    6.语音合成WAV文件,做了本地保存,反复调用直接读取本地文件,不用反复使用TTS作文字到语音的转换,以节省资源。

    步骤九

    巴科斯范式.bnf文件可以关注这里巴科斯范式详解,这里简化了命令词定义用于测试。

    #BNF+IAT 1.0;
    !grammar call;
    
    !start <callstart>;
    <callstart>:syj|小微小微|小微|向前走|下一步|hello|你好|您
    好|小螺丝|星际迷航|大陆|今天太冷了;

    步骤九

    问题总结

    1,两个离线引擎不能同时运行,所以上面实现的是交替运行模式  就是识别模块运行,朗读模块初始化会失败,反之亦然,这样导致灵活性不强,不确定问题在哪里,也可能是引用了一个msc_x64.dll文件,这里不太确定,unity目录引用原因未能做测试,期待解决方案。

    2.离线命令词识别返回结果会有1-3秒的识别反应时间,才能返回结果 ,这个时间可以做一个语音回馈,但是没有返回结果就不能确定是否应该触发语音回馈,期待解决方案。

    3.语音合成朗读速度很快,可以放心使用。

    4.以上测试文件打包,有需要可以自行下载。

    https://download.csdn.net/download/lijiefu123456/13098984

     

     

     

     

     

     

     

    展开全文
  • windows-网络常用命令

    2021-02-16 10:57:04
    命令 常用举例 说明 ping ping 127.0.0.1 ping用于检测网络是否通畅,以及网络时延情况(工作在ICMP协议上)。 ifconfig ifconfig ipconfig实用程序可用于显示当前的TCP/IP配置的设置值。这些...
    命令常用举例说明
    pingping 127.0.0.1ping用于检测网络是否通畅,以及网络时延情况(工作在ICMP协议上)。
    ifconfigifconfigipconfig实用程序可用于显示当前的TCP/IP配置的设置值。这些信息一般用来检验人工配置的TCP/IP设置是否正确。而且,如果计算机和所在的局域网使用了动态主机配置协议DHCP,使用ipconfig命令可以了解到你的计算机是否成功地租用到了一个IP地址,如果已经租用到,则可以了解它目前得到的是什么地址,包括IP地址、子网掩码和缺省网关等网络配置信息。
    arparp -a ARP是TCP/IP协议族中的一个重要协议,用于确定对应IP地址的网卡物理地址。使用arp命令,能够查看本地计算机或另一台计算机的ARP高速缓存中的当前内容。此外,使用arp命令可以人工方式设置静态的网卡物理地址/IP地址对,使用这种方式可以为缺省网关和本地服务器等常用主机进行本地静态配置,这有助于减少网络上的信息量。
    tracert

    tracert 127.0.0.1

    tracert  www.baidu.com

    掌握使用traceroute命令测量路由情况的技能,即用来显示数据包到达目的主机所经过的路径。

    nbtstatnbtstat -s该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。
    routerout print

    大多数主机一般都是驻留在只连接一台路由器的网段上。由于只有一台路由器,因此不存在选择使用哪一台路由器将数据包发送到远程计算机上去的问题,该路由器的IP地址可作为该网段上所有计算机的缺省网关。

    但是,当网络上拥有两个或多个路由器时,用户就不一定想只依赖缺省网关了。实际上可能想让某些远程IP地址通过某个特定的路由器来传递,而其他的远程IP则通过另一个路由器来传递。在这种情况下,用户需要相应的路由信息,这些信息储存在路由表中,每个主机和每个路由器都配有自己独一无二的路由表。大多数路由器使用专门的路由协议来交换和动态更新路由器之间的路由表。但在有些情况下,必须人工将项目添加到路由器和主机上的路由表中。route命令就是用来显示、人工添加和修改路由表项目的。

    nslookup

    nslookup

    nslookup www.baidu.com

    命令nslookup的功能是查询任何一台机器的IP地址和其对应的域名。它通常需要一台域名服务器来提供域名。如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名。
    netstat

    netstat

    netstat -a      

    netstat -n     

    netstat -o      

    在Internet RFC标准中,Netstat的定义是: Netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

    Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

    net

    net view

    net time

    net localgroup

    这个命令是网络命令中最重要的一个,必须透彻掌握它的每一个子命令的用法,因为它的功能实在是太强大了,这简直就是微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令,键入net /?

    1、net view   

      使用此命令查看远程主机的所以共享资源。命令格式为net view /IP。  

    2、net use

    把远程主机的某个共享资源影射为本地盘符,图形界面方便使用。

    命令格式为net usex: /IP/sharename。

    3、net start

      使用它来启动远程主机上的服务。当你和远程主机建立连接后,如果发现它的什么服务没有启动,而你又想利用此服务怎么办?就使用这个命令来启动吧。用法:net start servername。   

    4、net stop

    关闭主机的某个服务

    5、net user

      查看和帐户有关的情况,包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的,最重要的,它为我们克隆帐户提供了前提。键入不带参数的net user,可以查看所有用户,包括已经禁用的。下面分别讲解。

      1,net user abcd 1234 /add,新建一个用户名为abcd,密码为1234的帐户,默认为user组成员。

      2,net user abcd /del,将用户名为abcd的用户删除。

      3,net user abcd /active:no,将用户名为abcd的用户禁用。

      4,net user abcd /active:yes,激活用户名为abcd的用户。

      5,net user abcd,查看用户名为abcd的用户的情况  

    6、net localgroup

      查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中,我们一般利用它来把某个帐户提升为administrator组帐户,这样我们利用这个帐户就可以控制整个远程主机了。用法:netlocalgroup roupname username /add。   

    7、net time

    这个命令可以查看远程主机当前的时间。

    mstscmstsc远程控制命令

     

    展开全文
  • 四、PowerShell运行命令

    千次阅读 2020-12-14 18:23:38
    文章目录四、PowerShell运行命令1、剖析一个命令2、Cmdlet命名惯例3、别名:命令的昵称4、使用快捷方式5、Show-Command6、对扩展命令的支持7、处理错误8、常见误区9、操作练习10、最后 本章只是运行命令和命令行工具...

    四、PowerShell运行命令



    本章只是运行命令和命令行工具,没有脚本、没有编程语言。

    PowerShell,如其名称所示,是一个Shell。它与UNIX的Shell也十分类似,比如说20世纪80年代后期的Bash,甚至是20世纪70年代面世的最原始的UNIX Bourne Shell。

    这些语言和大多数编程语言一样,你在文本编辑器(即使是Windows记事本)中键入大量关键字形成脚本。当脚本完成保存为文件后,可能还需要双击该文件进行测试。PowerShell能够以这种方式工作,但这并不是PowerShell的主要工作模式,尤其是当你开始学习PowerShell时。使用PowerShell,你输入一个命令,然后通过添加一些参数来定制化命令行为,单击返回,立刻就能看到结果。

    最终,你会厌倦一遍遍输入同样的命令(和参数),然后你会将其复制粘贴到一个文本文件中,并将文件的扩展名更名为.PS1,然后你瞬间就拥有了一个“PowerShell脚本”。现在,你不再需要一遍遍输入命令,而是直接执行该文件中的脚本。这也和你在Cmd.exe Shell中使用的批处理文件是同一种模式,但相较于脚本或编程而言却要简单许多。实际上,这与UNIX管理员使用多年的模式很类似。通用UNIX/Linux shell,比如Bash,也是类似的方式:运行命令,直到你获得正确的结果,然后将这些命令粘贴到一个文本文件中,并称之为脚本。

    1、剖析一个命令

    在这里插入图片描述

    为了确保你能够完全熟悉PowerShell的规则,下面更详细地阐述上图中的每一部分。

    • 名称为Get-EventLog的Cmdlet。PowerShell Cmdlet总是以这种动词-名词形式命名。
    • 第一个参数名称为-LogName,并赋值为Security。由于参数值中并不包含任何空格或标点符号,因此并不需要用引号括起来。
    • 第二个参数名称为-ComputerName,以逗号分隔列表的形式赋了两个值:Win8和Server1。由于这两个参数中都不包含空格或标点符号,因此这两个参数都不需要用引号括起来。
    • 最后一个参数是-Verbose,是一个开关参数。这意味着该参数无须赋值,仅仅指定参数即可。

    注意:

    • 在命令名称和第一个参数之间必须有空格。

    • 参数名称总是以英文短横线(-)开头。

    • 参数名称之间必须有空格,多个参数值之间也必须有空格。

    • 无论参数名称之前的破折号,还是参数值本身包含的破折号,都不需要加空格。

    • PowerShell不区分大小写。

    请逐渐习惯这些规则,并开始对这种精确、优雅的输入方式敏感。多注意空格、破折号和其他部分可以最大程度减少PowerShell报低级错误的机会。

    2、Cmdlet命名惯例

    Cmdlet是一个原生的PowerShell命令行工具。该术语仅仅存在于PowerShell和类似C#的.Net Framework语言中。Cmdlet仅仅出现在PowerShell中,所以当你在Google或Bing搜索该关键字时,返回结果主要是关于PowerShell的。该术语读音为“command-let”。

    函数和Cmdlet类似,但不是以.Net语言编写,而是以PowerShell自己的脚本语言编写。

    工作流是嵌入PowerShell的工作流执行系统的一类特殊函数。

    应用程序是任意类型的外部可执行程序,包括类似PING、Ipconfig等命令行工具。

    命令是一个通用的术语,用于代表任何或所有上面提到的术语。

    微软已经为Cmdlet建了一个命名惯例。因此同样的命名规则也应该被用于函数和工作流。虽然微软并没有强制要求,但开发人员应该遵循该惯例。

    规则应该以标准的动词开始,比如Get、Set、New或Pause。

    并不是所有所谓的动词都是动词。虽然微软官方使用术语“动词-名词命名规范”,你仍然能看到类似New、Where等“动词”,请逐渐习惯吧。

    3、别名:命令的昵称

    虽然PowerShell命令名称足够好,并具有良好的一致性,但仍然可能很长。类似Set-WinDefaultInputMethodOverride的命令名称,即使有Tab键补全,对于输入来说也是太长。虽然命令名称非常清晰——看到名称就能大概猜到其功能,但对于输入来说还是太长。
    这也是为什么需要PowerShell别名。别名仅仅是命令的昵称。

    无论是否使用别名,命令的工作方式不会变。参数还是原来的参数,其他部分也不会有任何改变——仅仅是命令名称变得更短。如果你习惯使用UNIX或Linux,就会知道别名也可以包含一些参数,只是记住PowerShell并不是以这种方式工作。

    如果你看到一个别名(网上的一些家伙倾向于使用别名,就好像我们都能够记住所有150个内置别名)而不知道其含义,请查阅帮助。

    你可以使用New-Alias创建自定义别名,使用Export-Alias导出别名列表。当创建一个别名时,其生命周期只能持续到当前的Shell会话结束。一旦关闭窗口,别名就会不复存在。这也是你需要导出别名的原因,以便后续重新导入。

    我们通常会避免创建和使用自定义别名,因为这些别名除我们之外的别人无法使用。如果某个用户无法查到xtd的含义,这会导致混淆。

    xtd仅仅是我们编造的一个假的别名,不会做任何工作。

    我们必须指出,由于现在PowerShell可以在非Windows系统中可用,因此别名的意义会根据环境的不同有所区别,比如说,Linux。在Linux中,别名可以作为一种运行一个包含一堆参数的命令的快捷方式。PowerShell却非如此。一个别名仅仅是命令名称的一个昵称,别名无法包含任何预定义的参数。

    4、使用快捷方式

    果你希望在网络上“偷取”(或者再利用)其他人的示例代码,那首先需要懂得如何看懂它。

    除了作为快捷方式的命令的别名之外,参数也同样可以使用别名。总共有三种方式可以实现这一点,每一种都可能造成混淆。

    • 简化参数名称

    PowerShell并不强制要求输入完整的参数名称。例如,你可以通过输入-comp代替-ComputerName,简化的规则是必须输入足够的字母让PowerShell可以识别不同参数。如果既存在-composite参数,也存在-computerName以及-common参数,你至少要输入-compu、-commo和-compo。这是由于上述值是唯一识别参数所需要输入的最少部分。

    • 参数名称别名

    尽管参数的别名不在帮助文件或任何方便查阅的地方而难以识别,但参数也拥有别名。比如说,Get-EventLog命令有-ComputerName参数。可以运行下述命令,查阅该参数别名。

    PS C:\> (get-command get-eventlog | select -ExpandProperty parameters)     . computername.aliases
    

    上述命令已经用粗体标出命令和参数名称。你可以用任意你希望了解的命令和参数名称进行替换。在本例中,数据结果展示了-Cn是-computerName的别名,所以你可以运行下述命令。

    PS C:\> Get-EventLog -LogName Security -Cn SERVER2 -Newest 10
    

    Tab键补全将会展示出-Cn这个别名。如果你输入Get-EventLog –C并开始按Tab键,该别名将会出现。但是命令的帮助并不会显示关于-Cn的任何信息,且Tab键补全并不会显示-Cn和-ComputerName实际上是同一个命令。

    • 位置参数

    当你在帮助文件中查看命令语法时,你可以很容易认出位置参数。

    5、Show-Command

    尽管我们拥有多年使用PowerShell的经验,但命令语法的复杂度有时依然会让我们抓狂。PowerShell v3(以及更新版本,虽然不包含非Windows操作系统)提供的一个非常棒的特性是Show-Command commlet。如果你在命令语法方面遇到困难,包括空格、破折号、逗号、引号或是其他方面,Show-Command将成为你的助手。该命令允许你指定你无法用对的命令名称,并以图形化的方式将命令的参数名称展示出来。

    注意该功能无法在没有安装GUI的服务器操作系统上生效。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oc23rim8-1607940625254)(F341217B64134495AB8D5F682A2FF24A)]

    按照提示输入一些参数,然后点击运行即可。

    以这种方式产生的命令,总会是命令的完整形式。完整的命令名称,完整的参数名称,所有的参数名称都显式输入(即不会出现位置参数)。因此,这种方式可以说是使用PowerShell最完美、被推荐并符合最佳实践的方式。

    不幸的是,Show-Command一次只能展示一个命令。因此,当希望了解多个命令时,只能逐个使用该命令。

    6、对扩展命令的支持

    目前为止,你所有在Shell中运行的命令(至少是我们建议你运行的命令)都是内置Cmdlet。大约400个Cmdlet被集成到Windows客户端操作系统中,上千个被集成到Windows服务器版本的操作系统中,并且你还能添加更多——类似Exchange Server、Sharepoint Server和SQL Server都包含数以百计的额外Cmdlet。
    但是你并不会被局限在仅仅使用随PowerShell一同发行的Cmdlet——你还可以使用一些或许你已经使用多年的外置命令行工具,包括Ping、Nslookup、Ipconfig、Net等。由于这些都不是原生PowerShell Cmdlet,因此你可以按照原来使用这些命令的方法继续使用这些命令。PowerShell将会在后台启动Cmd.exe。由于PowerShell知道如何运行扩展命令,因此返回的结果都会被显示在PowerShell窗口。请尝试运行一些你已经熟悉的CMD命令。我们经常会被问到如何使用PowerShell关联一个普通的网络驱动器——你可以在对象资源管理器中看到那个。我们经常使用的Net Use命令在PowerShell中也能正常工作。

    在非Windows操作系统中也是如此:你可以使用grep、bash、sed、awk、ping以及任何可用的命令行工具。这些命令可以正常执行,PowerShell能够以传统shell(例如Bash)同样的方式展示输出结果。

    综合上面,我们必须透漏出一个严酷的事实:并不是所有的外部命令都可以流畅地运行在PowerShell中,至少如果你不做一些调整是不行的。这是由于PowerShell解析  器——Shell的该部分读取你输入的内容并尝试解析出你希望Shell执行什么——并不是每次都能猜对。有时你输入一个外部命令,就会导致PowerShell产生混乱,输出错误信息,因此命令不会生效。

    7、处理错误

    在刚开始使用PowerShell时无可避免地会遇见丑陋的红色文本提示,在不同水平阶段依然可以遇到,甚至当你成为专家级的Shell用户时也避免不了。我们都能遇到,但不要让红字把你逼疯。

    先不管用于警告目的的红字,PowerShell的错误信息的目的是用于帮助。

    有时,错误信息并不一定很有帮助,就好像你和PowerShell说的不是同一种语言。当然,PowerShell不可能改变其语言,那么只能是你错了,所以你得去改变。通过咨询帮助并拼写出完整的命令和参数,通常都是解决问题的最快方式。还有不要忘了使用Show-Command找出正确语法。

    8、常见误区

    • 输入Cmdlet名称

    首先是输入Cmdlet名称。该名称永远是动词-名词形式,比如说Get-Content。下面是我看到的一些新手尝试输入的命令,但显然难以奏效。

    Get Content
    GetContent
    Get=Content
    Get_Content
    

    其中一些问题是由于输入错误(比如说“=”,而不是“-”),还有一些是省略破折号。我们都会将命令读成“Get Content”,省略了破折号。但输入时必须输入破折号。

    • 输入参数

    参数同样需要正确书写。参数可以不赋值,比如说-recurse,在参数名称之前加上破折号。但必须在Cmdlet名称和参数之间加空格,参数之间也需要空格。下述命令都正确。

    Dir –rec(可以使用参数名称的简写)

    New-PSDrive -name DEMO-psprovider FileSystem -root \Server\Share

    但下述写法不正确。

    Dir-rec(在名称和参数之间没有空格)

    New-PSDrive –nameDEMO(参数和值之间没有空格)

    New-PSDrive -name DEMO-psprovider FileSystem(在第一个参数值和第二个参数名之间没有空格)

    PowerShell并不会挑剔大小写问题,也就是说dir和DIR并无不同,RECURSE、-recurse和-Recurse也是如此。但PowerShell会挑剔空格和破折号的写法。

    9、操作练习

    • 1.显示正在运行的进程列表。

    搜索process相关内容:

    help Get-Process
    

    在这里插入图片描述
    然后更新:

    update-help
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lHo0Do8X-1607940625261)(F92272BDD18A4F19951D77993122D17B)]

    搜索并解决更新错误:

    Update-Help -ErrorAction SilentlyContinue
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogqldepx-1607940625266)(9BAFF819CA4C433CA1771E462F40ABC1)]

    重新查询:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5RoTQTi-1607940625267)(987FC2A445124788817367FFF2C51142)]

    在这里插入图片描述

    • 2.显示最新的100个应用程序日志(请不要使用Get-WinEvent,我们已经为你展示过完成该任务的另一个命令),任务仅限于Windows操作系统。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1GHFSAUk-1607940625268)(26E923CAF29C4B12BAFE09FE040FB56A)]

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Get-EventLog Application -newest 100
    
    • 3.显示所有类型为“Cmdlet”的命令(我们已经展示了Get-Command,你还需要阅读帮助文档,从而找出缩小该列表范围,正如本次动手实验所要求的)。

    在这里插入图片描述

    在这里插入图片描述

    Get-Command -CommandType Cmdlet
    

    在这里插入图片描述

    • 4.显示所有的别名。
    Get-Command -CommandType Alias
    

    在这里插入图片描述

    • 5.创建一个新的别名。使用该别名,你可以运行“np”从PowerShell提示符中启动一个记事本。该任务仅限于Windows操作系统,除非你在Linux系统上安装了wine。

    在这里插入图片描述

    Start-Process -FilePath "notepad++"
    Start-Process -FilePath "notepad"
    

    在这里插入图片描述

    Set-Alias -Name np -Value notepad
    

    在这里插入图片描述

    • 6.显示以字母M开头的服务名称。同样,你需要阅读帮助文档找出所需的命令。请不要忘了星号(*),这是PowerShell中通用的通配符。该任务仅限于Windows操作系统。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMsZMlJl-1607940625288)(92BAD6AF805F486083BAD06D4BFA574A)]
    在这里插入图片描述

    Get-Service -DisplayName M*
    

    在这里插入图片描述
    在这里插入图片描述

    • 7.显示所有的Windows防火墙规则,你需要使用Help或Get-Command找出所需的Cmdlet。该任务仅限于Windows操作系统。
      在这里插入图片描述
    Get-NetFirewallRule
    Show-NetFirewallRule
    

    在这里插入图片描述

    • 8.显示所有Windows防火墙的入站规则。可以使用和之前任务同样的Cmdlet,但你需要阅读帮助文档找出所需的参数以及可选值。该任务仅限于Windows操作系统。
    Get-NetFirewallRule | Where {$_.Enabled -eq 'True' -and $_.Direction -eq 'Inbound'}
    

    在这里插入图片描述

    10、最后

    看完每一章,然后试着去自己完成对应的练习,熟悉掌握help(get-command)以及通过examples去掌握一些常用的cmdlet和如何去查找需要的cmdlet是前面这些内容重点需要阐明的内容,不得不说作者虽然有点话痨,但是确实用心良苦,很细。

    展开全文
  • 窗口最大化: 命令行为 F11,普通情况为super + 上(下为最小化) 快速返回桌面: Ctrl + Super + D(Super换为Alt也可以),再按返回之前的状态 进入命令行: Ctrl + Alt + T 关于ubuntu开机后经常提示:检测到系统...
  • 发音为Todo_r用一个命令查找所有笔记! Todo_r是一个简单的rust命令行实用程序,可在代码中跟踪待办事项。 像做待办事项的人一样发音为“ todoer”。 只需一个命令即可找到所有待办事项! leasot进行了很多改编,但...
  • 前言:河北工业大学操作系统实验,实验一主要是熟悉Linux环境与命令,没有什么难度,而且老师也会略过这部分,不检查,包括实验二的验证进程状态,所以这里就不再重新排版了。 实验一 Linux命令接口 一、实验目的 ...
  • 家目录:在/home/用户名里面(root用户的家目录不在home里面,而在/root),在任意目录下通过cd ~ 命令可以直接进入家目录。 当前目录:. 代表当前的目录,也可以使用 ./ 来表示; 上层目录:.. 代表上一层目录,...
  • NMAP的常用命令

    2017-06-02 22:37:41
    nmap是Linux下最常使用的安全扫描工具,经典中的经典。基本上,各种Linux安全相关的书籍中都会提及nmap, 下面是常见的一些命令
  • /bin | BINaries | 二进制可执行命令 /dev | DEVices | 特殊设备文件 /etc | ETCetera | 系统管理和配置文件 /etc/fstab | FileSystem TABle | 文件/etc/fstab包含了静态文件系统信息,定义了存储设备和分区整合到...
  • Redis命令SETNX的使用(包含Java分布式锁实现) 可以参考Redis官网对SETNX命令的介绍: https://redis.io/commands/setnx SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key ...
  • 操作系统实验一:Linux命令接口

    千次阅读 多人点赞 2020-07-28 17:29:46
    通过本实验,要求学生熟练掌握Linux各种文件操作命令,包括:使用控制字符执行特殊功能;使用file和strings命令确定文件类型;使用cat利more命令显示文本文件的内容;使用head和tail命令显示文本文件的部分内容;...
  • shell命令

    2021-05-15 13:17:06
    而一些应用的指令如man ,chmod ,vi等命令(需要理解的是这些指令其实都是一些应用程序)都需要在shell平台界面内输入。shell也有shell程序的一般shell文件以.sh为后缀。一组shell程序用来操作应用.
  • /bin | BINaries | 二进制可执行命令 /dev | DEVices | 特殊设备文件 /etc | ETCetera | 系统管理和配置文件 /etc/fstab | FileSystem TABle | 文件/etc/fstab包含了静态文件系统信息,定义了存储设备和分区整合...
  • linux的发音是["li:nэks]。Linux操作系统bai,du是计算机操作系统。zhi的中文发音通常是"Linax”,但真正的道应该是"Linax”。Linux操作系统的内核名称也为"Linux”。Linux操作系统也是自由...
  • Windows下执行Linux命令

    千次阅读 2019-04-10 11:25:38
    我们可以指定配置文件存储的位置,也可以选定打开后默认使用的shell命令,此处默认使用了PowerShell 说到这里有些小伙伴可能要问了,有些时候要打开PowerShell、有些时候要打开Git bash、有些时候要打开CygWin ...
  • @echo off ::隐藏 ...::调用系统语音包朗读文字(WIN7内置中文语音包可以中文发音,XP只能英文发音) mshta vbscript:createobject("sapi.spvoice").speak("你好啊,大家好啊!")(window.close)
  • Linux常用命令

    2021-10-07 14:30:24
    Linux的一些shell命令和简单介绍,部分命令需要下载,比如tree,可自行上网查找下载命令或根据命令行提示进行下载 以下命令介绍不确保完全准确或完整,详细请参考Linux命令手册 1、pwd(present work directory)...
  • python读音-python中文读音

    千次阅读 2020-10-29 14:18:52
    本篇分享的是使用python3制作一个文本读音器,简单点就是把指定的文本文字转语音说出来; 做这么个小工具主要是为了方便自己在平时看一些文章眼累的时候,可通过语音来帮助自己,当然如果你是小说迷,可以扩展成一个...
  • 我觉得这种命名真的很牛,软件命名也是一个世纪难题,grep这个名字不但发音不错,而且很有含义,又避免了名字过长,方便记忆。 下面我们举两个例子看看 grep 的用法: find find 指令帮助我们在文件系统中查找文件。...
  • 希腊字母发音对照表及其latex命令

    万次阅读 多人点赞 2015-11-13 16:10:02
    发音即是它们各自的latex形式, 大写字母的是其小写latex首字母大写后的形式,如(Δ\Delta:\Delta) notation西方的数学家们在推导数学定理时,仍然沿用并不好写也不好记的希腊字母,可见文艺复兴,可见希腊数学对...
  • 它的发音为“ ees-que-el”或“ sequel”,是所有具有4GL(第四代语言)功能的RDBMS所采用的标准语言,可满足用户对数据库的大多数常用查询。 MySQL MySQL MySQL is an open-source and freely available Relational ...
  • Linux 终止进程的命令

    2012-07-03 11:10:37
    1、在执行find命令时,由于时间过长,决定终止该进程 首先使用ps命令来查看该进程对应的PID,键入ps,显示如下: PID TTY TIME CMD 18284 pts/5 00:00:00 bash 19080 pts/5 00:00:00 ps 345 pts/5 00:00:00 ...
  • linux常用命令

    2019-12-28 19:57:20
    Linux 读音(比较通用的读法) /li’n^ks/(“里那克斯”) /'li:nэks/(“里讷克斯”) /li’nju:ks/(“里纽克斯”) 01-操作系统 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrMncezz-...
  • 易语言所有命令

    万次阅读 2013-01-24 22:34:20
    易语言所有命令 环境操作命令示例 子程序:_按钮1_被单击  局部容器:文本数组 数据类型:文本型 数组:0  局部容器:数目 数据类型:整数型  局部容器:容器1 数据类型:整数型  局部容器:...
  • Tkinter是Python的默认GUI库,它基于Tk工具集,后者最初是为工具命令语言设计的。 5. For a Windows system, installing Python is as easy as downloading the installer and double-clicking on it. 在 Windows ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,773
精华内容 5,909
关键字:

命令的发音