├── GetXiaoQuAddress.py ├── README.md ├── beta ├── 16k.wav ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-35.pyc │ ├── textToMp3.cpython-35.pyc │ └── wav2text.cpython-35.pyc ├── msapi.py ├── textToMp3.py └── wav2text.py ├── bot_api.py ├── expressiondict.pickle ├── findAddressName.py ├── findFirstName.py ├── findName.py ├── genderSvm.rds ├── homophone_corrector.py ├── namedict.pickle ├── rasa_sharp16.json ├── rasa_sharp9.json ├── rasa_utils.py ├── recognize_one_wav_svm.R ├── recognize_one_wav_svm_wrapper.py ├── stt.py ├── surname_corrector.py ├── tts.py ├── weather.pcm ├── wechat_bot.py ├── wechat_bot_1207.py ├── x64 └── libmsc.so └── x86 └── libmsc.so /GetXiaoQuAddress.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017-11-27 4 | 5 | @author: 刘帅 6 | ''' 7 | # #coding:utf-8 8 | 9 | import requests 10 | import json 11 | 12 | def GetAddress(keywords,city): 13 | #url = "http://restapi.amap.com/v3/place/text?key=f1296fe56c973f62be07915f935178b2&keywords=京东花园&types=小区&city=泰州&children=&offset=&page=&extensions=all" 14 | payload = {'keywords': keywords, 'key': 'f1296fe56c973f62be07915f935178b2','city':city,'types':'小区'} 15 | r = requests.get("http://restapi.amap.com/v3/place/text", params=payload) 16 | parsed_j = json.loads(r.text) 17 | if(len(parsed_j['pois']) > 0): 18 | print(parsed_j['pois'][0]['name']) #返回匹配最高的小区名字 19 | print(parsed_j['pois'][0]['address'])#返回具体地址 20 | print(parsed_j['pois'][0]['pname'])#返回省份 21 | print(parsed_j['pois'][0]['adname'])#返回区 22 | 23 | GetAddress("京东花园","泰州") 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WeChatBot 2 | 基于个人微信的自动回复机器人(支持语音输入与语音回复) 3 | 4 | 需下载ffmpeg.exe语音识别模块需用到 5 | python wechat_bot 直接启动 6 | 7 | 8 | 以下为进行声音性别识别,可以不用。 9 | R & rpy2相关 10 | 11 | R的下载地址:https://cran.r-project.org/bin/windows/base/ 12 | 13 | rpy2的下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 14 | 15 | 设定环境变量: 16 | 1. Path:加上 17 | xxx\R\R-x.x.x\bin\x64 18 | 2. R_HOME: 19 | xxx\R\R-3.3.3 20 | 3. R_LIBS_USER: 21 | xxx\R\library 22 | 4. R_USER: 23 | xxx\Lib\site-packages\rpy2 24 | -------------------------------------------------------------------------------- /beta/16k.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/beta/16k.wav -------------------------------------------------------------------------------- /beta/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/beta/__init__.py -------------------------------------------------------------------------------- /beta/__pycache__/__init__.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/beta/__pycache__/__init__.cpython-35.pyc -------------------------------------------------------------------------------- /beta/__pycache__/textToMp3.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/beta/__pycache__/textToMp3.cpython-35.pyc -------------------------------------------------------------------------------- /beta/__pycache__/wav2text.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/beta/__pycache__/wav2text.cpython-35.pyc -------------------------------------------------------------------------------- /beta/msapi.py: -------------------------------------------------------------------------------- 1 | # ! /usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | import requests 5 | 6 | def get_token(): 7 | URL = 'https://api.cognitive.microsoft.com/sts/v1.0/issueToken' 8 | _header = {'Ocp-Apim-Subscription-Key': 'ee4fc3261b7643dfaff8c04304d9399e'} 9 | _token = requests.post(url = URL, headers = _header) 10 | return _token.text 11 | 12 | def wav2text(): 13 | url = 'https://speech.platform.bing.com/recognize' 14 | params = {'Version': '3.0', 15 | 'requestid': 'b2c95ede-97eb-4c88-81e4-80f32d6aee54', 16 | 'appID': 'D4D52672-91D7-4C74-8AD8-42B1D98141A5', 17 | 'format': 'json', 18 | 'locale': 'zh-CN', 19 | 'device.os': 'Android', 20 | 'scenarios': 'ulm', 21 | 'instanceid':'b2c95ede-97eb-4c88-81e4-80f32d6aee54' } 22 | d 23 | recognize = -------------------------------------------------------------------------------- /beta/textToMp3.py: -------------------------------------------------------------------------------- 1 | # 2 | ''' 3 | Created on 2017-11-17 4 | 5 | @author: 刘帅 6 | ''' 7 | from aip import AipSpeech 8 | 9 | """ 你的 APPID AK SK """ 10 | APP_ID = 'test_python' 11 | API_KEY = '***********' 12 | SECRET_KEY = '**********' 13 | 14 | def textToMp3(text): 15 | aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY) 16 | # 读取文件 17 | result = aipSpeech.synthesis(text, 'zh', 1, { 18 | 'vol': 5, 19 | }) 20 | voice = 'auido.mp3' 21 | # 识别正确返回语音二进制 错误则返回dict 参照下面错误码 22 | if not isinstance(result, dict): 23 | with open(voice, 'wb') as f: 24 | f.write(result) 25 | return voice 26 | -------------------------------------------------------------------------------- /beta/wav2text.py: -------------------------------------------------------------------------------- 1 | # ! /usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | ''' 5 | This module will trans Wechat recording file to text via Baidu's API 6 | ''' 7 | 8 | import base64 9 | import json 10 | import wave 11 | import requests 12 | from pydub import AudioSegment 13 | import pydub 14 | 15 | 16 | def transcode(file): 17 | '''File transcode function''' 18 | rec = AudioSegment.from_mp3(file) 19 | rec_wav = rec.export(file.replace('mp3', 'wav'), format='wav') 20 | rec_wav.close() 21 | 22 | 23 | def get_token(): 24 | '''Get Baidu's api token''' 25 | _url = 'http://openapi.baidu.com/oauth/2.0/token' 26 | _params = {'grant_type': 'client_credentials', 27 | 'client_id': '*******', # 改成你自己的 28 | 'client_secret': '******9'} # 改成你自己的 29 | _res = requests.post(_url, _params) 30 | _data = json.loads(_res.text) 31 | return _data['access_token'] 32 | 33 | 34 | def wav_to_text(wav_file): 35 | '''Do recongnize''' 36 | try: 37 | wav_file = open(wav_file, 'rb') 38 | except IOError: 39 | print('文件错误啊,亲') 40 | return 41 | wav_file = wave.open(wav_file) 42 | n_frames = wav_file.getnframes() 43 | frame_rate = wav_file.getframerate() 44 | if n_frames == 1 or frame_rate not in (8000, 16000): 45 | print('不符合格式') 46 | return 47 | audio = wav_file.readframes(n_frames) 48 | base_data = base64.b64encode(audio).decode('utf-8') 49 | data = {"format": 'wav', 50 | "token": get_token(), 51 | "len": len(audio), 52 | "rate": frame_rate, 53 | "speech": base_data, 54 | "cuid": "B8-AC-6F-2D-7A-94", 55 | "channel": 1} 56 | data = json.dumps(data).encode('utf-8') 57 | res = requests.post('http://vop.baidu.com/server_api', 58 | data, 59 | {'content-type': 'application/json'}) 60 | res_data = json.loads(res.text) 61 | print(res_data['result'][0]) 62 | return res_data['result'][0] 63 | 64 | if __name__ == '__main__': 65 | wav_to_text('16k.wav') 66 | -------------------------------------------------------------------------------- /bot_api.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | from chatterbot import ChatBot 4 | from chatterbot.trainers import ChatterBotCorpusTrainer 5 | import hug 6 | 7 | 8 | deepThought = ChatBot("deepThought") 9 | deepThought.set_trainer(ChatterBotCorpusTrainer) 10 | # 使用中文语料库训练它 11 | # 只需要训练一次,不需要每次启动进程都训练,训练结果默认存到本地`./database.db`,之后启动进程会使用这个数据库 12 | #deepThought.train("chatterbot.corpus.chinese") # 语料库 13 | 14 | # todo 用一个小巧的 flask 15 | @hug.default_output_format() 16 | def my_output_formatter(data): 17 | return str(data).encode('utf-8') 18 | 19 | @hug.get('/get_response') 20 | def get_response(user_input): 21 | response = deepThought.get_response(user_input).text 22 | print(response) 23 | return {"response":my_output_formatter(response)} 24 | 25 | -------------------------------------------------------------------------------- /expressiondict.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/expressiondict.pickle -------------------------------------------------------------------------------- /findAddressName.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017-11-21 4 | 5 | @author: 刘帅 6 | ''' 7 | from jpype import * 8 | import re 9 | startJVM(getDefaultJVMPath(), "-Djava.class.path=D:\hanlp\hanlp-1.3.4.jar;D:\hanlp", "-Xms1g", "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号: 10 | def findAddress(string): 11 | ad = '' 12 | ad2 = '' 13 | ad3 = '' 14 | HanLP = JClass('com.hankcs.hanlp.HanLP') 15 | #sentence = "江苏省泰州市海淀区,然后是新泰路街道,然后是锦东花苑7小区然后8栋401你好" 16 | list = HanLP.newSegment().enablePlaceRecognize(True).seg(string); 17 | pattern = re.compile(r'[0-9_-_零_一_二_三_四_五_六_七_八_九_十]*小区') 18 | pattern2 = re.compile(r'[0-9_-_零_一_二_三_四_五_六_七_八_九_十]*(栋|单元|号楼|号铺|座|室|号|楼|#|门面|店面)') 19 | #pattern3 = re.compile(r'[0-9_-_零_一_二_三_四_五_六_七_八_九_十]{2,4}') 20 | p = re.compile(r'[0-9_-_零_一_二_三_四_五_六_七_八_九_十]{2,4}') 21 | #print p.findall('one1two2three3four4') 22 | match = pattern.search(string) 23 | if match: 24 | ad = match.group() 25 | match2 = pattern2.search(string) 26 | if match2: 27 | ad2 = match2.group() 28 | match3 = p.findall(string) 29 | #print(match3) 30 | if match3: 31 | ad3 = match3[-1] 32 | add = [] 33 | for name in list: 34 | #print(str(name.nature)) 35 | if str(name.nature) == 'ns' or name.word == '市' or name.word == '区': 36 | #print(name.word) 37 | add.append(str(name.word).replace("\ns","")) 38 | print("".join(add) + ad + ad2 + ad3) 39 | address = "".join(add) + ad + ad2 + ad3 40 | return address 41 | #findAddress("江苏省泰州市海淀区,然后是新泰路街道,然后是锦东花苑7小区然后儿二单元401-3333你好") 42 | -------------------------------------------------------------------------------- /findFirstName.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017-11-23 4 | 5 | @author: 刘帅 6 | ''' 7 | import re 8 | def extract_firstName(string): 9 | pattern = re.compile(r'[(姓)(叫我)(叫)(称呼我)(称呼)].{2}') 10 | match = pattern.search(string) 11 | if match: 12 | #print(match.group()[1:]) 13 | return(match.group()[2:]) 14 | return None -------------------------------------------------------------------------------- /findName.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017-11-22 4 | 5 | @author: 刘帅 6 | ''' 7 | 8 | from jpype import * 9 | startJVM(getDefaultJVMPath(), "-Djava.class.path=D:\hanlp\hanlp-1.3.4.jar;D:\hanlp", "-Xms1g", "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号: 10 | def extract_name(string): 11 | 12 | name = "" 13 | 14 | HanLP = JClass('com.hankcs.hanlp.HanLP') 15 | 16 | list = HanLP.newSegment().enablePlaceRecognize(True).seg(string); 17 | print(list) 18 | for name in list: 19 | #print(str(name.nature)) 20 | if str(name.nature) == 'nr' or str(name.nature) == 'nx': 21 | #print(name.word) 22 | name = str(name.word).replace("\ns","") 23 | 24 | return name 25 | 26 | extract_name("我姓林") 27 | 28 | -------------------------------------------------------------------------------- /genderSvm.rds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/genderSvm.rds -------------------------------------------------------------------------------- /homophone_corrector.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Fri Nov 24 13:45:45 2017 4 | 5 | @author: user 6 | """ 7 | 8 | from pypinyin import pinyin, lazy_pinyin, Style 9 | import re 10 | import itertools 11 | import pickle 12 | 13 | def extend_one_sound(sound): 14 | extended_sound = [sound] 15 | 16 | #extend consonants 17 | # for example, see 'z', 'zh' as the same sound 18 | consonants = ['ㄓ', 'ㄔ', 'ㄕ', 'ㄗ', 'ㄘ', 'ㄙ'] 19 | if sound[0] in consonants: 20 | new_consonant = consonants[(consonants.index(sound[0])+3)%len(consonants)] 21 | extended_sound.append(sound.replace(sound[0], new_consonant)) 22 | 23 | #extend vowels 24 | tones = "ˊˇˋ˙" 25 | sound_no_tone = sound.strip(tones) 26 | vowels = ['ㄛ','ㄜ','ㄝ','ㄢ','ㄣ','ㄡ','ㄦ','ㄟ','ㄤ','ㄥ'] 27 | if sound_no_tone[-1] in vowels: 28 | new_vowel = vowels[(vowels.index(sound_no_tone[-1])+5)%len(vowels)] 29 | vowel_place = sound.index(sound_no_tone[-1]) 30 | extended_sound.append(sound.replace(sound[vowel_place], new_vowel)) 31 | 32 | return extended_sound 33 | 34 | def extend_word_sound(sounds): 35 | extended_word_sound = [] 36 | for sound in sounds: 37 | extended_word_sound += extend_one_sound(sound) 38 | return extended_word_sound 39 | 40 | def search_sound(sentence, letter): 41 | #the Homonym of letter will latter be replaced with letter in sentence 42 | result = [] 43 | letter_py = pinyin(letter, style=Style.BOPOMOFO, heteronym=True) 44 | # print(letter_py) 45 | sentence_py = pinyin(sentence, style=Style.BOPOMOFO, heteronym=True) 46 | # print(sentence_py) 47 | 48 | #iterate through diff sound of one word 49 | #letter_py[0]: letter_py is the pinyin of one letter, so only get 1st letter 50 | for sound in letter_py[0]: 51 | #iterate through diff word in sentence 52 | for word_ix, word_py in enumerate(sentence_py): 53 | #word_py is the pinyin list of one word in sentence 54 | # print(sound) 55 | # print(word_py) 56 | 57 | extended_sound = extend_one_sound(sound) 58 | 59 | #sound's relatives in word_py 60 | relative_sound = set(extended_sound).intersection(set(word_py)) 61 | if relative_sound!=set(): 62 | #word_ix : the index of word in sentence 63 | #sound_ix : the index of sound in a word 64 | relative_sound = list(relative_sound)[0] 65 | sound_ix = word_py.index(relative_sound) 66 | #meaning: letter's pinyin is same as the sound_ix of the word, 67 | # which is the word_ix th word in sentence 68 | result.append((word_ix, sound_ix)) 69 | # print(result) 70 | return result 71 | 72 | def expressiondict_builder(expressions): 73 | expressiondict = {} 74 | 75 | for expression in expressions: 76 | multiple_sounds = pinyin(expression, style=Style.BOPOMOFO, heteronym=True) 77 | multiple_sounds = [extend_word_sound(sounds) for sounds in multiple_sounds] 78 | multiple_sounds = itertools.product(multiple_sounds[0], multiple_sounds[1], multiple_sounds[2]) 79 | for ms in multiple_sounds: 80 | expressiondict[ms] = expression[2] 81 | 82 | return expressiondict 83 | 84 | def surname_corrector(sentence): 85 | with open('expressiondict.pickle', 'rb') as handle: 86 | expressiondict = pickle.load(handle) 87 | main_clause, sub_clauses = re.split('\W+', sentence, maxsplit=1) 88 | final_main_clause = main_clause 89 | pysc = pinyin(sub_clauses, style=Style.BOPOMOFO, heteronym=True) 90 | pysc = (pysc[0][0], pysc[1][0], pysc[2][0]) 91 | 92 | final_main_clause = final_main_clause.split('姓')[0] + '姓' + expressiondict[pysc] 93 | return final_main_clause 94 | 95 | def sentence_corrector(sentence): 96 | main_clause, sub_clauses = re.split('\W+', sentence, maxsplit=1) 97 | final_main_clause = main_clause 98 | 99 | for sub_clause in re.split('\W+', sub_clauses): 100 | # print(sub_clause) 101 | if '是' in sub_clause: 102 | # delete 冬是 from 冬是东南西北的东 103 | sub_clause = sub_clause.split('是', maxsplit=1)[1] 104 | # example: 东南西北, keyword: 东 105 | example, keyword = sub_clause.split('的', maxsplit=1) 106 | word_ix, sound_ix = search_sound(example, keyword)[0] 107 | 108 | #example[word_ix] is the correct word 109 | correct_word = example[word_ix] 110 | 111 | #now find Homonym of the correct word in main_clause 112 | # print(main_clause, correct_word) 113 | word_ix, sound_ix = search_sound(main_clause, correct_word)[0] 114 | wrong_word = main_clause[word_ix] 115 | # print('{} will be replace to {}'.format(wrong_word, correct_word)) 116 | final_main_clause = final_main_clause.replace(wrong_word, correct_word) 117 | 118 | return final_main_clause 119 | 120 | sentences = [ 121 | "冬地天蓝小区,冬是东南西北的东,地是天地的地,蓝是波澜不惊的澜", 122 | "心安镇,新旧的新,安全的安", 123 | "金泰路街道,北京的京,泰州的泰", #'金':jin1, '京':jing1 124 | "槿东花苑,锦绣前程的锦,东南西北的东", 125 | "一枚路,利益的益,梅花的梅", 126 | "政党,增加的增", #政:zheng, 增:zeng 127 | "测温,撤退的撤", #测:ce, 撤:che 128 | "数量,速度的速", #数:shu, 速:su 129 | ] 130 | 131 | surname_sentences = [ 132 | "我姓吴,口天吴", 133 | "我姓刘,文刀刘", 134 | "我姓张,弓长张", 135 | "我姓林,双木林", 136 | "我姓陈,耳东陈", 137 | "我姓李,木子李", 138 | "我姓章,立早章", 139 | "我姓吕,双口吕", 140 | "我姓王,三横王", 141 | "我姓胡,古月胡", 142 | "我姓杨,木易杨", 143 | "我姓许,言午许", 144 | "我姓姜,美女姜", 145 | "我姓嵩,山高嵩", 146 | "我姓松,木公松", 147 | "我姓江,水工江", 148 | "我姓姜,羊女姜", 149 | "我姓黄,草头黄", 150 | "我姓徐,双人徐", 151 | "我姓杜,木土杜", 152 | "我姓于,干钩于", 153 | "我姓孙,子小孙", 154 | ] 155 | 156 | surname_expressions = [ 157 | "口天吴", 158 | "文刀刘", 159 | "弓长张", 160 | "双木林", 161 | "耳东陈", 162 | "木子李", 163 | "立早章", 164 | "双口吕", 165 | "三横王", 166 | "古月胡", 167 | "木易杨", 168 | "言午许", 169 | "美女姜", 170 | "山高嵩", 171 | "木公松", 172 | "水工江", 173 | "羊女姜", 174 | "草头黄", 175 | "双人徐", 176 | "木土杜", 177 | "干钩于", 178 | "子小孙", 179 | ] 180 | 181 | #expressiondict = expressiondict_builder(surname_expressions) 182 | #with open('expressiondict.pickle', 'wb') as handle: 183 | # pickle.dump(expressiondict, handle, protocol=pickle.HIGHEST_PROTOCOL) 184 | # 185 | #with open('expressiondict.pickle', 'rb') as handle: 186 | # expressiondict = pickle.load(handle) 187 | 188 | #print(pinyin(sentence, style=Style.TONE3, heteronym=True)) 189 | #[['zhong1', 'zhong4'], ['xin1']] 190 | 191 | for sentence in sentences: 192 | corrected_sentence = sentence_corrector(sentence) 193 | print('{} is now become {}'.format(sentence, corrected_sentence)) 194 | 195 | error_surname_examples = [ 196 | "我姓许,双人徐", 197 | "我姓章,弓长张" 198 | ] 199 | 200 | for sentence in error_surname_examples: 201 | corrected_sentence = surname_corrector(sentence) 202 | print('{} now becomes {}'.format(sentence, corrected_sentence)) 203 | -------------------------------------------------------------------------------- /namedict.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/namedict.pickle -------------------------------------------------------------------------------- /rasa_sharp16.json: -------------------------------------------------------------------------------- 1 | {"rasa_nlu_data": {"regex_features": [{"name": "province_entity", "pattern": ".+\u7701"}, {"name": "autonomous_prefecture_entity", "pattern": ".+\u81ea\u6cbb\u5dde"}, {"name": "city_entity", "pattern": ".+\u5e02"}, {"name": "district_entity", "pattern": ".+\u533a"}, {"name": "building_entity", "pattern": ".+\u53f7\u697c|.+\u680b"}, {"name": "unit_entity", "pattern": ".+\u5355\u5143"}, {"name": "floor_entity", "pattern": "(?!.+\u53f7\u697c).+\u697c"}, {"name": "side_entity", "pattern": ".+\u4fa7"}, {"name": "road_entity", "pattern": ".+\u8857|.+\u8def"}, {"name": "road_number_entity", "pattern": ".+\u53f7"}, {"name": "name_entity", "pattern": "\u674e|\u738b|\u5f20|\u5218|\u9648|\u6768|\u8d75|\u9ec4|\u5468|\u5434|\u5f90|\u5b59|\u80e1|\u6731|\u9ad8|\u6797|\u4f55|\u90ed|\u9a6c|\u7f57|\u6881|\u5b8b|\u90d1|\u8c22|\u97e9|\u5510|\u51af|\u4e8e|\u8463|\u8427|\u7a0b|\u66f9|\u8881|\u9093|\u8bb8|\u5085|\u6c88|\u66fe|\u5f6d|\u5415|\u82cf|\u5362|\u848b|\u8521|\u8d3e|\u4e01|\u9b4f|\u859b|\u53f6|\u960e|\u4f59|\u6f58|\u675c|\u6234|\u590f|\u949f|\u6c6a|\u7530|\u4efb|\u59dc|\u8303|\u65b9|\u77f3|\u59da|\u8c2d|\u5ed6|\u90b9|\u718a|\u91d1|\u9646|\u90dd|\u5b54|\u767d|\u5d14|\u5eb7|\u6bdb|\u90b1|\u79e6|\u6c5f|\u53f2|\u987e|\u4faf|\u90b5|\u5b5f|\u9f99|\u4e07|\u6bb5|\u6f15|\u94b1|\u6c64|\u5c39|\u9ece|\u6613|\u5e38|\u6b66|\u4e54|\u8d3a|\u8d56|\u9f9a|\u6587|\u5e9e|\u6a0a|\u5170|\u6bb7|\u65bd|\u9676|\u6d2a|\u7fdf|\u5b89|\u989c|\u502a|\u4e25|\u725b|\u6e29|\u82a6|\u5b63|\u4fde|\u7ae0|\u9c81|\u845b|\u4f0d|\u97e6|\u7533|\u5c24|\u6bd5|\u8042|\u4e1b|\u7126|\u5411|\u67f3|\u90a2|\u8def|\u5cb3|\u9f50|\u6cbf|\u6885|\u83ab|\u5e84|\u8f9b|\u7ba1|\u795d|\u5de6|\u6d82|\u8c37|\u7941|\u65f6|\u8212|\u803f|\u725f|\u535c|\u8def|\u8a79|\u5173|\u82d7|\u51cc|\u8d39|\u7eaa|\u9773|\u76db|\u7ae5|\u6b27|\u7504|\u9879|\u66f2|\u6210|\u6e38|\u9633|\u88f4|\u5e2d|\u536b|\u67e5|\u5c48|\u9c8d|\u4f4d|\u8983|\u970d|\u7fc1|\u968b|\u690d|\u7518|\u666f|\u8584|\u5355|\u5305|\u53f8|\u67cf|\u5b81|\u67ef|\u962e|\u6842|\u95f5|\u6b27\u9633|\u89e3|\u5f3a|\u67f4|\u534e|\u8f66|\u5189|\u623f|\u8fb9|\u8f9c|\u5409|\u9976|\u5201|\u77bf|\u621a|\u4e18|\u53e4|\u7c73|\u6c60|\u6ed5|\u664b|\u82d1|\u90ac|\u81e7|\u7545|\u5bab|\u6765|\u5d7a|\u82df|\u5168|\u891a|\u5ec9|\u7b80|\u5a04|\u76d6|\u7b26|\u595a|\u6728|\u7a46|\u515a|\u71d5|\u90ce|\u90b8|\u5180|\u8c08|\u59ec|\u5c60|\u8fde|\u90dc|\u664f|\u683e|\u90c1|\u5546|\u8499|\u8ba1|\u55bb|\u63ed|\u7aa6|\u8fdf|\u5b87|\u6556|\u7cdc|\u9122|\u51b7|\u5353|\u82b1|\u4ec7|\u827e|\u84dd|\u90fd|\u5de9|\u7a3d|\u4e95|\u7ec3|\u4ef2|\u4e50|\u865e|\u535e|\u5c01|\u7afa|\u51bc|\u539f|\u5b98|\u8863|\u695a|\u4f5f|\u6817|\u5321|\u5b97|\u5e94|\u53f0|\u5deb|\u97a0|\u50e7|\u6851|\u8346|\u8c0c|\u94f6|\u626c|\u660e|\u6c99|\u8584|\u4f0f|\u5c91|\u4e60|\u80e5|\u4fdd|\u548c|\u853a"}], "common_examples": [{"intent": "greet", "text": "\u4f60\u597d", "entities": []}, {"intent": "greet", "text": "\u4f60\u597d\u554a", "entities": []}, {"intent": "greet", "text": "\u4f60\u597d\u5417", "entities": []}, {"intent": "greet", "text": "hello", "entities": []}, {"intent": "greet", "text": "hi", "entities": []}, {"intent": "greet", "text": "\u65e9\u4e0a\u597d", "entities": []}, {"intent": "greet", "text": "\u665a\u4e0a\u597d", "entities": []}, {"intent": "greet", "text": "\u55e8", "entities": []}, {"intent": "goodbye", "text": "bye", "entities": []}, {"intent": "goodbye", "text": "\u518d\u89c1", "entities": []}, {"intent": "goodbye", "text": "\u62dc\u62dc", "entities": []}, {"intent": "goodbye", "text": "\u4e0b\u6b21\u89c1", "entities": []}, {"text": "\u6ca1\u6709\u5916\u5728\u97f3\u54cd", "intent": "no_speaker", "entities": []}, {"text": "\u8d2d\u4e70\u7684\u65e5\u671f\u5e94\u8be5\u662f\u5468\u4e8c\uff0c\u90a3\u5929\u5468\u4e8c\u5341\u51e0\u4e2a\u661f\u671f\u4e00\u53f7\u4e00\u53f7", "intent": "date", "entities": [{"value": "\u5468\u4e8c", "start": 8, "end": 10, "entity": "date_entity"}, {"value": "\u5468\u4e8c", "start": 13, "end": 15, "entity": "date_entity"}, {"value": "\u661f\u671f\u4e00", "start": 18, "end": 21, "entity": "date_entity"}]}, {"text": "210\u7684", "intent": "install_type", "entities": [{"value": "210", "start": 0, "end": 3, "entity": "fix_type_entity"}]}, {"text": "\u6c5f\u897f\u7701\u4e5d\u6c5f\u5e02\u5e90\u5c71\u533a,\u7136\u540e\u7435\u7436\u576a,\u7136\u540e2\u680b3\u5355\u51431301", "intent": "address", "entities": [{"value": "\u6c5f\u897f\u7701", "start": 0, "end": 3, "entity": "province_entity"}, {"value": "\u4e5d\u6c5f\u5e02", "start": 3, "end": 6, "entity": "city_entity"}, {"value": "\u5e90\u5c71\u533a", "start": 6, "end": 9, "entity": "district_entity"}, {"value": "\u7435\u7436\u576a", "start": 12, "end": 15, "entity": "community_entity"}, {"value": "2\u680b", "start": 18, "end": 20, "entity": "building_entity"}, {"value": "3\u5355\u5143", "start": 20, "end": 23, "entity": "unit_entity"}, {"value": "13", "start": 23, "end": 25, "entity": "floor_entity"}, {"value": "1", "start": 26, "end": 27, "entity": "room_entity"}]}, {"text": "\u516b\u67086\u53f7", "intent": "date", "entities": [{"value": "\u516b\u67086\u53f7", "start": 0, "end": 4, "entity": "date_entity"}]}, {"text": "\u554a\u5662\u88c5\u7740\u5462.", "intent": "signal", "entities": []}, {"text": "\u5509\u5440,\u6211\u8bf4\u4e0d\u597d\uff0c\u55ef\u5e94\u8be5\u662f50\u540b\uff0c\u6211\u8bf4\u4e0d\u597d", "intent": "size", "entities": [{"value": "50", "start": 12, "end": 14, "entity": "size_entity"}]}, {"text": "\u7b80\u6613\u56fa\u5b9a\u6027\u7684", "intent": "install_type", "entities": [{"value": "\u56fa\u5b9a", "start": 2, "end": 4, "entity": "fix_type_entity"}]}, {"text": "\u4f38\u7f29\u8c03\u8282\u7684", "intent": "install_type", "entities": [{"value": "\u8c03\u8282", "start": 2, "end": 4, "entity": "flexible_type_entity"}]}, {"text": "\u55ef\u6cb3\u5317\u7701\u5510\u5c71\u5e02\u4e30\u6da6\u533a,\u554a\u55ef\u4e03\u5c0f\u533a52\u53f7\u697c2\u5355\u5143401", "intent": "address", "entities": [{"value": "\u6cb3\u5317\u7701", "start": 1, "end": 4, "entity": "province_entity"}, {"value": "\u5510\u5c71\u5e02", "start": 4, "end": 7, "entity": "city_entity"}, {"value": "\u4e30\u6da6\u533a", "start": 7, "end": 10, "entity": "district_entity"}, {"value": "\u4e03\u5c0f\u533a", "start": 13, "end": 16, "entity": "community_entity"}, {"value": "52\u53f7\u697c", "start": 16, "end": 20, "entity": "building_entity"}, {"value": "2\u5355\u5143", "start": 20, "end": 23, "entity": "unit_entity"}, {"value": "4", "start": 23, "end": 24, "entity": "floor_entity"}, {"value": "1", "start": 25, "end": 26, "entity": "room_entity"}]}, {"text": "\u6302\u67b6,\u6211\u4eec\u6709\u7684", "intent": "hanger", "entities": []}, {"text": "\u6211\u4eec\u5df2\u7ecf\u6709\u6302\u67b6\u4e86", "intent": "hanger", "entities": []}, {"text": "\u4e0a\u6d77\u5e02\u95f5\u884c\u533a\uff0c\u5c31\u662f\u76ca\u6885\u8def,\u662f\u8def\u53e3\u7684\uff0c\u5509\u76ca\u6885\u8def\u8bc1\u897f\u8def\u53e3,\u7d2b\u6ed5\u4e00\u67514\u53f7402", "intent": "address", "entities": [{"value": "\u4e0a\u6d77\u5e02", "start": 0, "end": 3, "entity": "city_entity"}, {"value": "\u95f5\u884c\u533a", "start": 3, "end": 6, "entity": "district_entity"}, {"value": "\u76ca\u6885\u8def", "start": 9, "end": 12, "entity": "road_entity"}, {"value": "\u76ca\u6885\u8def", "start": 19, "end": 22, "entity": "road_entity"}, {"value": "\u8bc1\u897f\u8def", "start": 22, "end": 25, "entity": "road_entity"}, {"value": "\u7d2b\u6ed5\u4e00\u6751", "start": 27, "end": 31, "entity": "village_entity"}, {"value": "4\u53f7", "start": 31, "end": 33, "entity": "road_number_entity"}, {"value": "4", "start": 33, "end": 34, "entity": "floor_entity"}, {"value": "2", "start": 35, "end": 36, "entity": "room_entity"}]}, {"text": "\u5662\u5728\u4eac\u4e1c\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u4eac\u4e1c", "start": 2, "end": 4, "entity": "shop_entity"}]}, {"text": "\u6211\u6709\u67b6\u5b50", "intent": "hanger", "entities": []}, {"text": "\u6211\u6709\u540e\u9762\u7684\u67b6\u5b50\u7684", "intent": "hanger", "entities": []}, {"text": "\u6c5f\u82cf\u7701\u6cf0\u5dde\u5e02\u6d77\u9675\u533a\uff0c\u7136\u540e\u662f\u65b0\u6cf0\u8def\u8857\u9053\uff0c\u7136\u540e\u662f\u9526\u4e1c\u82b1\u82d134-4", "intent": "address", "entities": [{"value": "\u6c5f\u82cf\u7701", "start": 0, "end": 3, "entity": "province_entity"}, {"value": "\u6cf0\u5dde\u5e02", "start": 3, "end": 6, "entity": "city_entity"}, {"value": "\u6d77\u9675\u533a", "start": 6, "end": 9, "entity": "district_entity"}, {"value": "\u65b0\u6cf0\u8def\u8857\u9053", "start": 13, "end": 18, "entity": "road_entity"}, {"value": "\u9526\u4e1c\u82b1\u82d1", "start": 22, "end": 26, "entity": "community_entity"}, {"value": "34", "start": 26, "end": 28, "entity": "floor_entity"}, {"value": "4", "start": 29, "end": 30, "entity": "room_entity"}]}, {"text": "\u6211\u59d3\u5434\uff0c\u53e3\u5929\u5434", "intent": "name", "entities": [{"value": "\u5434", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u53e3\u5929\u5434", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u5218\uff0c\u6587\u5200\u5218", "intent": "name", "entities": [{"value": "\u5218", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u6587\u5200\u5218", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u5f20\uff0c\u5f13\u957f\u5f20", "intent": "name", "entities": [{"value": "\u5f20", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u5f13\u957f\u5f20", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u6797\uff0c\u53cc\u6728\u6797", "intent": "name", "entities": [{"value": "\u6797", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u53cc\u6728\u6797", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u9648\uff0c\u8033\u4e1c\u9648", "intent": "name", "entities": [{"value": "\u9648", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u8033\u4e1c\u9648", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u674e\uff0c\u6728\u5b50\u674e", "intent": "name", "entities": [{"value": "\u674e", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u6728\u5b50\u674e", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u7ae0\uff0c\u7acb\u65e9\u7ae0", "intent": "name", "entities": [{"value": "\u7ae0", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u7acb\u65e9\u7ae0", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u5415\uff0c\u53cc\u53e3\u5415", "intent": "name", "entities": [{"value": "\u5415", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u53cc\u53e3\u5415", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u738b\uff0c\u4e09\u6a2a\u738b", "intent": "name", "entities": [{"value": "\u738b", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u4e09\u6a2a\u738b", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u80e1\uff0c\u53e4\u6708\u80e1", "intent": "name", "entities": [{"value": "\u80e1", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u53e4\u6708\u80e1", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u6768\uff0c\u6728\u6613\u6768", "intent": "name", "entities": [{"value": "\u6768", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u6728\u6613\u6768", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u8bb8\uff0c\u8a00\u5348\u8bb8", "intent": "name", "entities": [{"value": "\u8bb8", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u8a00\u5348\u8bb8", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u59dc\uff0c\u7f8e\u5973\u59dc", "intent": "name", "entities": [{"value": "\u59dc", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u7f8e\u5973\u59dc", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u5d69\uff0c\u5c71\u9ad8\u5d69", "intent": "name", "entities": [{"value": "\u5d69", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u5c71\u9ad8\u5d69", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u677e\uff0c\u6728\u516c\u677e", "intent": "name", "entities": [{"value": "\u677e", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u6728\u516c\u677e", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u6c5f\uff0c\u6c34\u5de5\u6c5f", "intent": "name", "entities": [{"value": "\u6c5f", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u6c34\u5de5\u6c5f", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u59dc\uff0c\u7f8a\u5973\u59dc", "intent": "name", "entities": [{"value": "\u59dc", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u7f8a\u5973\u59dc", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u9ec4\uff0c\u8349\u5934\u9ec4", "intent": "name", "entities": [{"value": "\u9ec4", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u8349\u5934\u9ec4", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u5f90\uff0c\u53cc\u4eba\u5f90", "intent": "name", "entities": [{"value": "\u5f90", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u53cc\u4eba\u5f90", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u675c\uff0c\u6728\u571f\u675c", "intent": "name", "entities": [{"value": "\u675c", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u6728\u571f\u675c", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u4e8e\uff0c\u5e72\u94a9\u4e8e", "intent": "name", "entities": [{"value": "\u4e8e", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u5e72\u94a9\u4e8e", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u6211\u59d3\u5b59\uff0c\u5b50\u5c0f\u5b59", "intent": "name", "entities": [{"value": "\u5b59", "start": 2, "end": 3, "entity": "name_entity"}, {"value": "\u5b50\u5c0f\u5b59", "start": 4, "end": 7, "entity": "name_entity"}]}, {"text": "\u554a\u4e24\u767e\u4e00\u7684\u90a3\u79cd", "intent": "install_type", "entities": [{"value": "\u4e24\u767e\u4e00", "start": 1, "end": 4, "entity": "fix_type_entity"}]}, {"text": "\u4e94\u767e\u4e94\u7684", "intent": "install_type", "entities": [{"value": "\u4e94\u767e\u4e94", "start": 0, "end": 3, "entity": "flexible_type_entity"}]}, {"text": "\u6c5f\u82cf\u7701\u542f\u4e1c\u5e02,\u55ef\u65b0\u5b89\u9547,\u5bf9,\u65b0\u65e7\u7684\u65b0,\u5b89\u5168\u7684\u5b89, \u65b0\u5b89\u9547,\u55ef\u56db\u5927\u961f,\u7136\u540e\u662f10\u5c0f\u961f", "intent": "address", "entities": [{"value": "\u6c5f\u82cf\u7701", "start": 0, "end": 3, "entity": "province_entity"}, {"value": "\u542f\u4e1c\u5e02", "start": 3, "end": 6, "entity": "city_entity"}, {"value": "\u65b0\u5b89\u9547", "start": 8, "end": 11, "entity": "town_entity"}, {"value": "\u65b0\u5b89\u9547", "start": 25, "end": 28, "entity": "town_entity"}, {"value": "\u56db\u5927\u961f", "start": 30, "end": 33, "entity": "dadui_entity"}, {"value": "10\u5c0f\u961f", "start": 37, "end": 41, "entity": "xiaodui_entity"}]}, {"text": "\u55ef\u524d\u51e0\u5929\u5728\u542f\u4e1c\u6587\u5cf0\u5927\u4e16\u754c\u8d2d\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u542f\u4e1c\u6587\u5cf0\u5927\u4e16\u754c", "start": 5, "end": 12, "entity": "shop_entity"}]}, {"text": "\u6211\u59d3\u6234,\u6234\u5e3d\u5b50\u7684\u6234", "intent": "name", "entities": [{"value": "\u6234", "start": 2, "end": 3, "entity": "name_entity"}]}, {"text": "\u4e0a\u6d77\u7684,\u9ec4\u57d4\u5340\u897f\u85cf\u5357\u8def1200\u5f043\u53f7", "intent": "address", "entities": [{"value": "\u4e0a\u6d77", "start": 0, "end": 2, "entity": "city_entity"}, {"value": "\u9ec4\u57d4\u5340", "start": 4, "end": 7, "entity": "district_entity"}, {"value": "\u897f\u85cf\u5357\u8def", "start": 7, "end": 11, "entity": "road_entity"}, {"value": "1200\u5f04", "start": 11, "end": 16, "entity": "lane_entity"}, {"value": "3\u53f7", "start": 16, "end": 18, "entity": "road_number_entity"}]}, {"text": "\u8d35\u59d3\u6768", "intent": "name", "entities": [{"value": "\u6768", "start": 2, "end": 3, "entity": "name_entity"}]}, {"text": "\u6211\u514d\u8d35\u59d3\u8463", "intent": "name", "entities": [{"value": "\u8463", "start": 4, "end": 5, "entity": "name_entity"}]}, {"text": "\u5662\u5728\u7f51\u4e0a\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u7f51\u4e0a", "start": 2, "end": 4, "entity": "shop_entity"}]}, {"text": "\u5409\u6797\u7701\u957f\u6625\u5e02,\u9ad8\u65b0\u6280\u672f\u5f00\u53d1\u533a,\u6771\u5730\u5929\u703e\u5c0f\u533a,\u5bf9\u5927\u5730\u7684\u5730,\u5bf9\u5bf9\u5bf9,\u703e\u662f\u4e09\u70b9\u6c34\u52a0\u4e2a\u95e8\u90a3\u4e2a\u90a3\u4e2a,\u5443\u4e5d\u4e5d\u680b,\u5662\u4e00\u5355\u5143,1102", "intent": "address", "entities": [{"value": "\u5409\u6797\u7701", "start": 0, "end": 3, "entity": "province_entity"}, {"value": "\u957f\u6625\u5e02", "start": 3, "end": 6, "entity": "city_entity"}, {"value": "\u9ad8\u65b0\u6280\u672f\u5f00\u53d1\u533a", "start": 7, "end": 14, "entity": "district_entity"}, {"value": "\u6771\u5730\u5929\u703e\u5c0f\u533a", "start": 15, "end": 21, "entity": "community_entity"}, {"value": "\u4e5d\u680b", "start": 47, "end": 49, "entity": "building_entity"}, {"value": "\u4e00\u5355\u5143", "start": 51, "end": 54, "entity": "unit_entity"}, {"value": "11", "start": 55, "end": 57, "entity": "floor_entity"}, {"value": "2", "start": 58, "end": 59, "entity": "room_entity"}]}, {"text": "\u88c5\u7535\u89c6", "intent": "install", "entities": []}, {"text": "\u5b89\u88c5\u7535\u89c6", "intent": "install", "entities": []}, {"text": "\u6211\u8981\u88c5\u7535\u89c6", "intent": "install", "entities": []}, {"text": "\u6211\u8981\u5b89\u88c5\u7535\u89c6", "intent": "install", "entities": []}, {"text": "\u88c5\u7535\u89c6\u3002", "intent": "install", "entities": []}, {"text": "\u5b89\u88c5\u7535\u89c6\u3002", "intent": "install", "entities": []}, {"text": "\u6211\u8981\u88c5\u7535\u89c6\u3002", "intent": "install", "entities": []}, {"text": "\u6211\u8981\u5b89\u88c5\u7535\u89c6\u3002", "intent": "install", "entities": []}, {"text": "\u6211\u59d3\u9ec4", "intent": "name", "entities": [{"value": "\u9ec4", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u9648", "intent": "name", "entities": [{"value": "\u9648", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u6768", "intent": "name", "entities": [{"value": "\u6768", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u674e", "intent": "name", "entities": [{"value": "\u674e", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u6797", "intent": "name", "entities": [{"value": "\u6797", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u5f20", "intent": "name", "entities": [{"value": "\u5f20", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u9ec4\u3002", "intent": "name", "entities": [{"value": "\u9ec4", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u9648\u3002", "intent": "name", "entities": [{"value": "\u9648", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u6768\u3002", "intent": "name", "entities": [{"value": "\u6768", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u674e\u3002", "intent": "name", "entities": [{"value": "\u674e", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u6797\u3002", "intent": "name", "entities": [{"value": "\u6797", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6211\u59d3\u5f20\u3002", "intent": "name", "entities": [{"value": "\u5f20", "start": 2, "entity": "name_entity", "end": 3}]}, {"text": "\u6709\u7535\u89c6\u4fe1\u53f7", "intent": "signal", "entities": []}, {"text": "\u5f00\u901a\u4e86", "intent": "signal", "entities": []}, {"text": "\u6709\u7535\u89c6\u4fe1\u53f7\u3002", "intent": "signal", "entities": []}, {"text": "\u5f00\u901a\u4e86\u3002", "intent": "signal", "entities": []}, {"text": "\u7535\u89c6\u4fe1\u53f7\u5f00\u901a\u4e86", "intent": "signal", "entities": []}, {"text": "\u7535\u89c6\u4fe1\u53f7\u5f00\u901a\u4e86\u3002", "intent": "signal", "entities": []}, {"text": "LCD-45SF460A\u5bf9\u5427\uff1f", "intent": "model", "entities": [{"value": "LCD-45SF460A", "start": 0, "entity": "model_entity", "end": 12}]}, {"text": "LCD-58mY8008A", "intent": "model", "entities": [{"value": "LCD-58mY8008A", "start": 0, "entity": "model_entity", "end": 13}]}, {"text": "\u662fLCD-45SF460A\u5bf9\u5427\uff1f", "intent": "model", "entities": [{"value": "LCD-45SF460A", "start": 1, "entity": "model_entity", "end": 13}]}, {"text": "LCD-58mY8008A\u3002", "intent": "model", "entities": [{"value": "LCD-58mY8008A", "start": 0, "entity": "model_entity", "end": 13}]}, {"text": "\u662fLCD-45SF460A\u6ca1\u9519\u5427\uff1f", "intent": "model", "entities": [{"value": "LCD-45SF460A", "start": 1, "entity": "model_entity", "end": 13}]}, {"text": "45\u5bf8", "intent": "size", "entities": [{"value": "45", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "50\u5bf8", "intent": "size", "entities": [{"value": "50", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "65\u5bf8", "intent": "size", "entities": [{"value": "65", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "70\u5bf8", "intent": "size", "entities": [{"value": "70", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "80\u5bf8", "intent": "size", "entities": [{"value": "80", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "45\u5bf8\u3002", "intent": "size", "entities": [{"value": "45", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "50\u5bf8\u3002", "intent": "size", "entities": [{"value": "50", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "65\u5bf8\u3002", "intent": "size", "entities": [{"value": "65", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "70\u5bf8\u3002", "intent": "size", "entities": [{"value": "70", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "80\u5bf8\u3002", "intent": "size", "entities": [{"value": "80", "start": 0, "entity": "size_entity", "end": 2}]}, {"text": "\u662f80\u5bf8\u7684\u3002", "intent": "size", "entities": [{"value": "80", "start": 1, "entity": "size_entity", "end": 3}]}, {"text": "\u662f45\u5bf8\u7684\u7535\u89c6\u3002", "intent": "size", "entities": [{"value": "45", "start": 1, "entity": "size_entity", "end": 3}]}, {"text": "\u6211\u7684\u7535\u89c6\u662f50\u5bf8\u7684\u3002", "intent": "size", "entities": [{"value": "50", "start": 5, "entity": "size_entity", "end": 7}]}, {"text": "\u6302\u5899\u4e0a", "intent": "install_place", "entities": [{"value": "\u5899\u4e0a", "start": 1, "entity": "install_place_entity", "end": 3}]}, {"text": "\u653e\u684c\u4e0a", "intent": "install_place", "entities": [{"value": "\u684c\u4e0a", "start": 1, "entity": "install_place_entity", "end": 3}]}, {"text": "\u6302\u5899\u4e0a\u3002", "intent": "install_place", "entities": [{"value": "\u5899\u4e0a", "start": 1, "entity": "install_place_entity", "end": 3}]}, {"text": "\u653e\u684c\u4e0a\u3002", "intent": "install_place", "entities": [{"value": "\u684c\u4e0a", "start": 1, "entity": "install_place_entity", "end": 3}]}, {"text": "\u660e\u5929", "intent": "date", "entities": [{"value": "\u660e\u5929", "start": 0, "entity": "date_entity", "end": 2}]}, {"text": "\u540e\u5929", "intent": "date", "entities": [{"value": "\u540e\u5929", "start": 0, "entity": "date_entity", "end": 2}]}, {"text": "\u660e\u5929\u3002", "intent": "date", "entities": [{"value": "\u660e\u5929", "start": 0, "entity": "date_entity", "end": 2}]}, {"text": "\u540e\u5929\u3002", "intent": "date", "entities": [{"value": "\u540e\u5929", "start": 0, "entity": "date_entity", "end": 2}]}, {"text": "\u6211\u7684\u53f7\u7801\u662f15834787951\u3002", "intent": "phone_number", "entities": [{"value": "15834787951", "start": 5, "entity": "phone_number_entity", "end": 16}]}, {"text": "\u6211\u7684\u7535\u8bdd\u662f13943887731\u3002", "intent": "phone_number", "entities": [{"value": "13943887731", "start": 5, "entity": "phone_number_entity", "end": 16}]}, {"text": "\u6211\u7684\u7535\u8bdd\u53f7\u7801\u662f13943887731\u3002", "intent": "phone_number", "entities": [{"value": "13943887731", "start": 7, "entity": "phone_number_entity", "end": 18}]}, {"text": "\u6211\u4f4f\u5728\u5409\u6797\u7701\u5ef6\u8fb9\u671d\u9c9c\u65cf\u81ea\u6cbb\u5dde\u6566\u5316\u5e02\u5317\u82d1\u793e\u533a6\u53f7\u697c\u56db\u5355\u5143\u56db\u697c\u897f\u4fa7\u3002", "intent": "address", "entities": [{"value": "\u5409\u6797\u7701", "start": 3, "entity": "province_entity", "end": 6}, {"value": "\u5ef6\u8fb9\u671d\u9c9c\u65cf\u81ea\u6cbb\u5dde", "start": 6, "entity": "autonomous_prefecture_entity", "end": 14}, {"value": "\u6566\u5316\u5e02", "start": 14, "entity": "city_entity", "end": 17}, {"value": "\u5317\u82d1\u793e\u533a", "start": 17, "entity": "community_entity", "end": 21}, {"value": "6\u53f7\u697c", "start": 21, "entity": "building_entity", "end": 24}, {"value": "\u56db\u5355\u5143", "start": 24, "entity": "unit_entity", "end": 27}, {"value": "\u56db\u697c", "start": 27, "entity": "floor_entity", "end": 29}, {"value": "\u897f\u4fa7", "start": 29, "entity": "side_entity", "end": 31}]}, {"text": "\u5e7f\u4e1c\u7701\u6df1\u5733\u5e02\u9f99\u5c97\u533a\u4e1c\u73af\u4e8c\u8def7\u53f73\u697c", "intent": "address", "entities": [{"value": "\u5e7f\u4e1c\u7701", "start": 0, "entity": "province_entity", "end": 3}, {"value": "\u6df1\u5733\u5e02", "start": 3, "entity": "city_entity", "end": 6}, {"value": "\u9f99\u5c97\u533a", "start": 6, "entity": "district_entity", "end": 9}, {"value": "\u4e1c\u73af\u4e8c\u8def", "start": 9, "entity": "road_entity", "end": 13}, {"value": "7\u53f7", "start": 13, "entity": "road_number_entity", "end": 15}, {"value": "3\u697c", "start": 15, "entity": "floor_entity", "end": 17}]}, {"text": "\u5409\u6797\u7701\u677e\u539f\u5e02\u5b81\u6c5f\u533a\u9759\u6e56\u5c0f\u533a30\u680b3\u5355\u5143302", "intent": "address", "entities": [{"value": "\u5409\u6797\u7701", "start": 0, "entity": "province_entity", "end": 3}, {"value": "\u677e\u539f\u5e02", "start": 3, "entity": "city_entity", "end": 6}, {"value": "\u5b81\u6c5f\u533a", "start": 6, "entity": "district_entity", "end": 9}, {"value": "\u9759\u6e56\u5c0f\u533a", "start": 9, "entity": "community_entity", "end": 13}, {"value": "30\u680b", "start": 13, "entity": "building_entity", "end": 16}, {"value": "3\u5355\u5143", "start": 16, "entity": "unit_entity", "end": 19}, {"value": "3", "start": 19, "entity": "floor_entity", "end": 20}, {"value": "2", "start": 21, "entity": "room_entity", "end": 22}]}, {"text": "\u6211\u4f4f\u6cb3\u5357\u7701\u5b89\u9633\u5e02\u6587\u5cf0\u533a\u534e\u5f3a\u57ce\u3002", "intent": "address", "entities": [{"value": "\u6cb3\u5357\u7701", "start": 2, "entity": "province_entity", "end": 5}, {"value": "\u5b89\u9633\u5e02", "start": 5, "entity": "city_entity", "end": 8}, {"value": "\u6587\u5cf0\u533a", "start": 8, "entity": "district_entity", "end": 11}, {"value": "\u534e\u5f3a\u57ce", "start": 11, "entity": "community_entity", "end": 14}]}, {"text": "\u6211\u5bb6\u4f4f\u5728\u4e0a\u6d77\u5e02\u5b9d\u5c71\u533a\u5929\u99a8\u82b1\u56ed\u3002", "intent": "address", "entities": [{"value": "\u4e0a\u6d77\u5e02", "start": 4, "entity": "city_entity", "end": 7}, {"value": "\u5b9d\u5c71\u533a", "start": 7, "entity": "district_entity", "end": 10}, {"value": "\u5929\u99a8\u82b1\u56ed", "start": 10, "entity": "community_entity", "end": 14}]}, {"text": "\u6211\u4f4f\u6606\u660e\u5e02\u76d8\u9f99\u533a\u5317\u8fb0\u8d22\u5bcc\u4e2d\u5fc3\u3002", "intent": "address", "entities": [{"value": "\u6606\u660e\u5e02", "start": 2, "entity": "city_entity", "end": 5}, {"value": "\u76d8\u9f99\u533a", "start": 5, "entity": "district_entity", "end": 8}, {"value": "\u5317\u8fb0\u8d22\u5bcc\u4e2d\u5fc3", "start": 8, "entity": "community_entity", "end": 14}]}, {"text": "\u5730\u5740\u662f\u5e7f\u4e1c\u7701\u73e0\u6d77\u5e02\u9999\u6d32\u533a\u77f3\u82b1\u4e1c\u8def123\u53f7\u6d77\u6e7e\u82b1\u56ed\u3002", "intent": "address", "entities": [{"value": "\u5e7f\u4e1c\u7701", "start": 3, "entity": "province_entity", "end": 6}, {"value": "\u73e0\u6d77\u5e02", "start": 6, "entity": "city_entity", "end": 9}, {"value": "\u9999\u6d32\u533a", "start": 9, "entity": "district_entity", "end": 12}, {"value": "\u77f3\u82b1\u4e1c\u8def", "start": 12, "entity": "road_entity", "end": 16}, {"value": "123\u53f7", "start": 16, "entity": "road_number_entity", "end": 20}, {"value": "\u6d77\u6e7e\u82b1\u56ed", "start": 20, "entity": "community_entity", "end": 24}]}, {"text": "\u6dd8\u5b9d", "intent": "shop", "entities": [{"value": "\u6dd8\u5b9d", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u4eac\u4e1c", "intent": "shop", "entities": [{"value": "\u4eac\u4e1c", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u82cf\u5b81", "intent": "shop", "entities": [{"value": "\u82cf\u5b81", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u56fd\u7f8e", "intent": "shop", "entities": [{"value": "\u56fd\u7f8e", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u6dd8\u5b9d\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u6dd8\u5b9d", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u4eac\u4e1c\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u4eac\u4e1c", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u82cf\u5b81\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u82cf\u5b81", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u56fd\u7f8e\u4e70\u7684", "intent": "shop", "entities": [{"value": "\u56fd\u7f8e", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u6dd8\u5b9d\u3002", "intent": "shop", "entities": [{"value": "\u6dd8\u5b9d", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u4eac\u4e1c\u3002", "intent": "shop", "entities": [{"value": "\u4eac\u4e1c", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u82cf\u5b81\u3002", "intent": "shop", "entities": [{"value": "\u82cf\u5b81", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u56fd\u7f8e\u3002", "intent": "shop", "entities": [{"value": "\u56fd\u7f8e", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u6dd8\u5b9d\u4e70\u7684\u3002", "intent": "shop", "entities": [{"value": "\u6dd8\u5b9d", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u4eac\u4e1c\u4e70\u7684\u3002", "intent": "shop", "entities": [{"value": "\u4eac\u4e1c", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u82cf\u5b81\u4e70\u7684\u3002", "intent": "shop", "entities": [{"value": "\u82cf\u5b81", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u56fd\u7f8e\u4e70\u7684\u3002", "intent": "shop", "entities": [{"value": "\u56fd\u7f8e", "start": 0, "entity": "shop_entity", "end": 2}]}, {"text": "\u8001\u623f\u5b50", "intent": "house_age", "entities": [{"value": "\u8001\u623f\u5b50", "start": 0, "entity": "house_age_entity", "end": 3}]}, {"text": "\u65e7\u623f\u5b50", "intent": "house_age", "entities": [{"value": "\u65e7\u623f\u5b50", "start": 0, "entity": "house_age_entity", "end": 3}]}, {"text": "\u65b0\u623f\u5b50", "intent": "house_age", "entities": [{"value": "\u65b0\u623f\u5b50", "start": 0, "entity": "house_age_entity", "end": 3}]}, {"text": "\u8001\u623f\u5b50\u3002", "intent": "house_age", "entities": [{"value": "\u8001\u623f\u5b50", "start": 0, "entity": "house_age_entity", "end": 3}]}, {"text": "\u65e7\u623f\u5b50\u3002", "intent": "house_age", "entities": [{"value": "\u65e7\u623f\u5b50", "start": 0, "entity": "house_age_entity", "end": 3}]}, {"text": "\u65b0\u623f\u5b50\u3002", "intent": "house_age", "entities": [{"value": "\u65b0\u623f\u5b50", "start": 0, "entity": "house_age_entity", "end": 3}]}]}} -------------------------------------------------------------------------------- /rasa_sharp9.json: -------------------------------------------------------------------------------- 1 | {"rasa_nlu_data": {"common_examples": [{"intent": "greet", "text": "\u4f60\u597d", "entities": []}, {"intent": "greet", "text": "\u4f60\u597d\u554a", "entities": []}, {"intent": "greet", "text": "\u4f60\u597d\u5417", "entities": []}, {"intent": "greet", "text": "hello", "entities": []}, {"intent": "greet", "text": "hi", "entities": []}, {"intent": "greet", "text": "\u65e9\u4e0a\u597d", "entities": []}, {"intent": "greet", "text": "\u665a\u4e0a\u597d", "entities": []}, {"intent": "greet", "text": "\u55e8", "entities": []}, {"intent": "affirm", "text": "\u662f\u7684", "entities": []}, {"intent": "affirm", "text": "\u662f", "entities": []}, {"intent": "affirm", "text": "\u5bf9\u7684", "entities": []}, {"intent": "affirm", "text": "\u786e\u5b9e", "entities": []}, {"intent": "affirm", "text": "\u597d", "entities": []}, {"intent": "affirm", "text": "ok", "entities": []}, {"intent": "affirm", "text": "\u597d\u7684", "entities": []}, {"intent": "affirm", "text": "\u597d\u7684\uff0c\u8c22\u8c22\u4f60", "entities": []}, {"intent": "affirm", "text": "\u5bf9\u7684", "entities": []}, {"intent": "affirm", "text": "\u597d\u6ef4", "entities": []}, {"intent": "affirm", "text": "\u597d\u554a", "entities": []}, {"intent": "goodbye", "text": "bye", "entities": []}, {"intent": "goodbye", "text": "\u518d\u89c1", "entities": []}, {"intent": "goodbye", "text": "886", "entities": []}, {"intent": "goodbye", "text": "\u62dc\u62dc", "entities": []}, {"intent": "goodbye", "text": "\u4e0b\u6b21\u89c1", "entities": []}, {"intent": "install", "text": "\u88c5\u7535\u89c6", "entities": []}, {"intent": "install", "text": "\u5b89\u88c5\u7535\u89c6", "entities": []}, {"intent": "install", "text": "\u6211\u8981\u88c5\u7535\u89c6", "entities": []}, {"intent": "install", "text": "\u6211\u8981\u5b89\u88c5\u7535\u89c6", "entities": []}, {"intent": "install", "text": "\u88c5\u7535\u89c6\u3002", "entities": []}, {"intent": "install", "text": "\u5b89\u88c5\u7535\u89c6\u3002", "entities": []}, {"intent": "install", "text": "\u6211\u8981\u88c5\u7535\u89c6\u3002", "entities": []}, {"intent": "install", "text": "\u6211\u8981\u5b89\u88c5\u7535\u89c6\u3002", "entities": []}, {"intent": "name", "text": "\u6211\u59d3\u9ec4", "entities": [{"value": "\u9ec4", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u9648", "entities": [{"value": "\u9648", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u6768", "entities": [{"value": "\u6768", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u674e", "entities": [{"value": "\u674e", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u6797", "entities": [{"value": "\u6797", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u5f20", "entities": [{"value": "\u5f20", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u9ec4\u3002", "entities": [{"value": "\u9ec4", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u9648\u3002", "entities": [{"value": "\u9648", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u6768\u3002", "entities": [{"value": "\u6768", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u674e\u3002", "entities": [{"value": "\u674e", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u6797\u3002", "entities": [{"value": "\u6797", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "name", "text": "\u6211\u59d3\u5f20\u3002", "entities": [{"value": "\u5f20", "entity": "name_entity", "end": 3, "start": 2}]}, {"intent": "signal", "text": "\u6709\u7535\u89c6\u4fe1\u53f7", "entities": []}, {"intent": "signal", "text": "\u5f00\u901a\u4e86", "entities": []}, {"intent": "signal", "text": "\u6709\u7535\u89c6\u4fe1\u53f7\u3002", "entities": []}, {"intent": "signal", "text": "\u5f00\u901a\u4e86\u3002", "entities": []}, {"intent": "model", "text": "LCD-45SF460A\u5bf9\u5427\uff1f", "entities": [{"value": "LCD-45SF460A", "entity": "model_entity", "end": 12, "start": 0}]}, {"intent": "model", "text": "LCD-58mY8008A", "entities": [{"value": "LCD-58mY8008A", "entity": "model_entity", "end": 13, "start": 0}]}, {"intent": "model", "text": "\u662fLCD-45SF460A\u5bf9\u5427\uff1f", "entities": [{"value": "LCD-45SF460A", "entity": "model_entity", "end": 13, "start": 1}]}, {"intent": "model", "text": "LCD-58mY8008A\u3002", "entities": [{"value": "LCD-58mY8008A", "entity": "model_entity", "end": 13, "start": 0}]}, {"intent": "model", "text": "\u662fLCD-45SF460A\u6ca1\u9519\u5427\uff1f", "entities": [{"value": "LCD-45SF460A", "entity": "model_entity", "end": 13, "start": 1}]}, {"intent": "size", "text": "45\u5bf8", "entities": [{"value": "45", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "50\u5bf8", "entities": [{"value": "50", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "65\u5bf8", "entities": [{"value": "65", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "70\u5bf8", "entities": [{"value": "70", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "80\u5bf8", "entities": [{"value": "80", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "45\u5bf8\u3002", "entities": [{"value": "45", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "50\u5bf8\u3002", "entities": [{"value": "50", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "65\u5bf8\u3002", "entities": [{"value": "65", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "70\u5bf8\u3002", "entities": [{"value": "70", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "80\u5bf8\u3002", "entities": [{"value": "80", "entity": "size_entity", "end": 2, "start": 0}]}, {"intent": "size", "text": "\u662f80\u5bf8\u7684\u3002", "entities": [{"value": "80", "entity": "size_entity", "end": 3, "start": 1}]}, {"intent": "size", "text": "\u662f45\u5bf8\u7684\u7535\u89c6\u3002", "entities": [{"value": "45", "entity": "size_entity", "end": 3, "start": 1}]}, {"intent": "size", "text": "\u6211\u7684\u7535\u89c6\u662f50\u5bf8\u7684\u3002", "entities": [{"value": "50", "entity": "size_entity", "end": 7, "start": 5}]}, {"intent": "install_place", "text": "\u6302\u5899\u4e0a", "entities": [{"value": "\u5899\u4e0a", "entity": "install_place_entity", "end": 3, "start": 1}]}, {"intent": "install_place", "text": "\u653e\u684c\u4e0a", "entities": [{"value": "\u684c\u4e0a", "entity": "install_place_entity", "end": 3, "start": 1}]}, {"intent": "install_place", "text": "\u6302\u5899\u4e0a\u3002", "entities": [{"value": "\u5899\u4e0a", "entity": "install_place_entity", "end": 3, "start": 1}]}, {"intent": "install_place", "text": "\u653e\u684c\u4e0a\u3002", "entities": [{"value": "\u684c\u4e0a", "entity": "install_place_entity", "end": 3, "start": 1}]}, {"intent": "date", "text": "\u660e\u5929", "entities": [{"value": "\u660e\u5929", "entity": "date_entity", "end": 2, "start": 0}]}, {"intent": "date", "text": "\u540e\u5929", "entities": [{"value": "\u540e\u5929", "entity": "date_entity", "end": 2, "start": 0}]}, {"intent": "date", "text": "\u660e\u5929\u3002", "entities": [{"value": "\u660e\u5929", "entity": "date_entity", "end": 2, "start": 0}]}, {"intent": "date", "text": "\u540e\u5929\u3002", "entities": [{"value": "\u540e\u5929", "entity": "date_entity", "end": 2, "start": 0}]}, {"intent": "phone_number", "text": "\u6211\u7684\u53f7\u7801\u662f15834787951\u3002", "entities": [{"value": "15834787951", "entity": "phone_number_entity", "end": 16, "start": 5}]}, {"intent": "phone_number", "text": "\u6211\u7684\u7535\u8bdd\u662f13943887731\u3002", "entities": [{"value": "13943887731", "entity": "phone_number_entity", "end": 16, "start": 5}]}, {"intent": "phone_number", "text": "\u6211\u7684\u7535\u8bdd\u53f7\u7801\u662f13943887731\u3002", "entities": [{"value": "13943887731", "entity": "phone_number_entity", "end": 18, "start": 7}]}, {"intent": "address", "text": "\u6211\u4f4f\u5728\u5409\u6797\u7701\u5ef6\u8fb9\u671d\u9c9c\u65cf\u81ea\u6cbb\u5dde\u6566\u5316\u5e02\u5317\u82d1\u793e\u533a6\u53f7\u697c\u56db\u5355\u5143\u56db\u697c\u897f\u4fa7\u3002", "entities": [{"value": "\u5409\u6797\u7701", "entity": "province_entity", "end": 6, "start": 3}, {"value": "\u5ef6\u8fb9\u671d\u9c9c\u65cf\u81ea\u6cbb\u5dde", "entity": "autonomous_prefecture_entity", "end": 14, "start": 6}, {"value": "\u6566\u5316\u5e02", "entity": "city_entity", "end": 17, "start": 14}, {"value": "\u5317\u82d1\u793e\u533a", "entity": "community_entity", "end": 21, "start": 17}, {"value": "6\u53f7\u697c", "entity": "building_entity", "end": 24, "start": 21}, {"value": "\u56db\u5355\u5143", "entity": "unit_entity", "end": 27, "start": 24}, {"value": "\u56db\u697c", "entity": "floor_entity", "end": 29, "start": 27}, {"value": "\u897f\u4fa7", "entity": "side_entity", "end": 31, "start": 29}]}, {"intent": "address", "text": "\u5e7f\u4e1c\u7701\u6df1\u5733\u5e02\u9f99\u5c97\u533a\u4e1c\u73af\u4e8c\u8def7\u53f73\u697c", "entities": [{"value": "\u5e7f\u4e1c\u7701", "entity": "province_entity", "end": 3, "start": 0}, {"value": "\u6df1\u5733\u5e02", "entity": "city_entity", "end": 6, "start": 3}, {"value": "\u9f99\u5c97\u533a", "entity": "district_entity", "end": 9, "start": 6}, {"value": "\u4e1c\u73af\u4e8c\u8def", "entity": "road_entity", "end": 13, "start": 9}, {"value": "7\u53f7", "entity": "road_number_entity", "end": 15, "start": 13}, {"value": "3\u697c", "entity": "floor_entity", "end": 17, "start": 15}]}, {"intent": "address", "text": "\u5409\u6797\u7701\u677e\u539f\u5e02\u5b81\u6c5f\u533a\u9759\u6e56\u5c0f\u533a30\u680b3\u5355\u5143302", "entities": [{"value": "\u5409\u6797\u7701", "entity": "province_entity", "end": 3, "start": 0}, {"value": "\u677e\u539f\u5e02", "entity": "city_entity", "end": 6, "start": 3}, {"value": "\u5b81\u6c5f\u533a", "entity": "district_entity", "end": 9, "start": 6}, {"value": "\u9759\u6e56\u5c0f\u533a", "entity": "community_entity", "end": 13, "start": 9}, {"value": "30\u680b", "entity": "building_entity", "end": 16, "start": 13}, {"value": "3\u5355\u5143", "entity": "unit_entity", "end": 19, "start": 16}, {"value": "3", "entity": "floor_entity", "end": 20, "start": 19}, {"value": "2", "entity": "room_entity", "end": 22, "start": 21}]}, {"intent": "address", "text": "\u6211\u4f4f\u6cb3\u5357\u7701\u5b89\u9633\u5e02\u6587\u5cf0\u533a\u534e\u5f3a\u57ce\u3002", "entities": [{"value": "\u6cb3\u5357\u7701", "entity": "province_entity", "end": 5, "start": 2}, {"value": "\u5b89\u9633\u5e02", "entity": "city_entity", "end": 8, "start": 5}, {"value": "\u6587\u5cf0\u533a", "entity": "district_entity", "end": 11, "start": 8}, {"value": "\u534e\u5f3a\u57ce", "entity": "community_entity", "end": 14, "start": 11}]}, {"intent": "address", "text": "\u6211\u5bb6\u4f4f\u5728\u4e0a\u6d77\u5e02\u5b9d\u5c71\u533a\u5929\u99a8\u82b1\u56ed\u3002", "entities": [{"value": "\u4e0a\u6d77\u5e02", "entity": "city_entity", "end": 7, "start": 4}, {"value": "\u5b9d\u5c71\u533a", "entity": "district_entity", "end": 10, "start": 7}, {"value": "\u5929\u99a8\u82b1\u56ed", "entity": "community_entity", "end": 14, "start": 10}]}, {"intent": "address", "text": "\u6211\u4f4f\u6606\u660e\u5e02\u76d8\u9f99\u533a\u5317\u8fb0\u8d22\u5bcc\u4e2d\u5fc3\u3002", "entities": [{"value": "\u6606\u660e\u5e02", "entity": "city_entity", "end": 5, "start": 2}, {"value": "\u76d8\u9f99\u533a", "entity": "district_entity", "end": 8, "start": 5}, {"value": "\u5317\u8fb0\u8d22\u5bcc\u4e2d\u5fc3", "entity": "community_entity", "end": 14, "start": 8}]}, {"intent": "address", "text": "\u5730\u5740\u662f\u5e7f\u4e1c\u7701\u73e0\u6d77\u5e02\u9999\u6d32\u533a\u77f3\u82b1\u4e1c\u8def123\u53f7\u6d77\u6e7e\u82b1\u56ed\u3002", "entities": [{"value": "\u5e7f\u4e1c\u7701", "entity": "province_entity", "end": 6, "start": 3}, {"value": "\u73e0\u6d77\u5e02", "entity": "city_entity", "end": 9, "start": 6}, {"value": "\u9999\u6d32\u533a", "entity": "district_entity", "end": 12, "start": 9}, {"value": "\u77f3\u82b1\u4e1c\u8def", "entity": "road_entity", "end": 16, "start": 12}, {"value": "123\u53f7", "entity": "road_number_entity", "end": 20, "start": 16}, {"value": "\u6d77\u6e7e\u82b1\u56ed", "entity": "community_entity", "end": 24, "start": 20}]}, {"intent": "shop", "text": "\u6dd8\u5b9d", "entities": [{"value": "\u6dd8\u5b9d", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u4eac\u4e1c", "entities": [{"value": "\u4eac\u4e1c", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u82cf\u5b81", "entities": [{"value": "\u82cf\u5b81", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u56fd\u7f8e", "entities": [{"value": "\u56fd\u7f8e", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u6dd8\u5b9d\u4e70\u7684", "entities": [{"value": "\u6dd8\u5b9d", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u4eac\u4e1c\u4e70\u7684", "entities": [{"value": "\u4eac\u4e1c", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u82cf\u5b81\u4e70\u7684", "entities": [{"value": "\u82cf\u5b81", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u56fd\u7f8e\u4e70\u7684", "entities": [{"value": "\u56fd\u7f8e", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u6dd8\u5b9d\u3002", "entities": [{"value": "\u6dd8\u5b9d", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u4eac\u4e1c\u3002", "entities": [{"value": "\u4eac\u4e1c", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u82cf\u5b81\u3002", "entities": [{"value": "\u82cf\u5b81", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u56fd\u7f8e\u3002", "entities": [{"value": "\u56fd\u7f8e", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u6dd8\u5b9d\u4e70\u7684\u3002", "entities": [{"value": "\u6dd8\u5b9d", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u4eac\u4e1c\u4e70\u7684\u3002", "entities": [{"value": "\u4eac\u4e1c", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u82cf\u5b81\u4e70\u7684\u3002", "entities": [{"value": "\u82cf\u5b81", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "shop", "text": "\u56fd\u7f8e\u4e70\u7684\u3002", "entities": [{"value": "\u56fd\u7f8e", "entity": "shop_entity", "end": 2, "start": 0}]}, {"intent": "house_age", "text": "\u8001\u623f\u5b50", "entities": [{"value": "\u8001", "entity": "house_age_entity", "end": 1, "start": 0}]}, {"intent": "house_age", "text": "\u65e7\u623f\u5b50", "entities": [{"value": "\u65e7", "entity": "house_age_entity", "end": 1, "start": 0}]}, {"intent": "house_age", "text": "\u65b0\u623f\u5b50", "entities": [{"value": "\u65b0", "entity": "house_age_entity", "end": 1, "start": 0}]}, {"intent": "house_age", "text": "\u8001\u623f\u5b50\u3002", "entities": [{"value": "\u8001", "entity": "house_age_entity", "end": 1, "start": 0}]}, {"intent": "house_age", "text": "\u65e7\u623f\u5b50\u3002", "entities": [{"value": "\u65e7", "entity": "house_age_entity", "end": 1, "start": 0}]}, {"intent": "house_age", "text": "\u65b0\u623f\u5b50\u3002", "entities": [{"value": "\u65b0", "entity": "house_age_entity", "end": 1, "start": 0}]}]}} -------------------------------------------------------------------------------- /rasa_utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import requests 4 | import json 5 | 6 | def extract_entities(query_str): 7 | # sample input: "天津市和平区西康路37号赛顿中心。" 8 | # its output: ['天津市', '和平区', '西康路', '37号', '赛顿中心'] 9 | response = requests.post("http://192.168.2.171:5002/parse", '{{"q":"{0}", "project": "default", "model": "model_20171126-064026"}}'.format(query_str).encode('utf-8')) 10 | parsed_j = json.loads(response.text) 11 | values = [e["value"] for e in parsed_j["entities"]] 12 | return values 13 | -------------------------------------------------------------------------------- /recognize_one_wav_svm.R: -------------------------------------------------------------------------------- 1 | library(e1071) 2 | 3 | specan3 <- function(X, bp = c(0,22), wl = 2048, threshold = 5, parallel = 1){ 4 | # To use parallel processing: library(devtools), install_github('nathanvan/parallelsugar') 5 | if(class(X) == "data.frame") {if(all(c("sound.files", "selec", 6 | "start", "end") %in% colnames(X))) 7 | { 8 | start <- as.numeric(unlist(X$start)) 9 | end <- as.numeric(unlist(X$end)) 10 | sound.files <- as.character(unlist(X$sound.files)) 11 | selec <- as.character(unlist(X$selec)) 12 | } else stop(paste(paste(c("sound.files", "selec", "start", "end")[!(c("sound.files", "selec", 13 | "start", "end") %in% colnames(X))], collapse=", "), "column(s) not found in data frame")) 14 | } else stop("X is not a data frame") 15 | 16 | #if there are NAs in start or end stop 17 | if(any(is.na(c(end, start)))) stop("NAs found in start and/or end") 18 | 19 | #if end or start are not numeric stop 20 | if(all(class(end) != "numeric" & class(start) != "numeric")) stop("'end' and 'selec' must be numeric") 21 | 22 | #if any start higher than end stop 23 | if(any(end - start<0)) stop(paste("The start is higher than the end in", length(which(end - start<0)), "case(s)")) 24 | 25 | #if any selections longer than 20 secs stop 26 | if(any(end - start>20)) stop(paste(length(which(end - start>20)), "selection(s) longer than 20 sec")) 27 | options( show.error.messages = TRUE) 28 | 29 | #if bp is not vector or length!=2 stop 30 | if(!is.vector(bp)) stop("'bp' must be a numeric vector of length 2") else{ 31 | if(!length(bp) == 2) stop("'bp' must be a numeric vector of length 2")} 32 | 33 | #return warning if not all sound files were found 34 | fs <- list.files(path = getwd(), pattern = ".wav$", ignore.case = TRUE) 35 | if(length(unique(sound.files[(sound.files %in% fs)])) != length(unique(sound.files))) 36 | cat(paste(length(unique(sound.files))-length(unique(sound.files[(sound.files %in% fs)])), 37 | ".wav file(s) not found")) 38 | 39 | # If parallel is not numeric 40 | if(!is.numeric(parallel)) stop("'parallel' must be a numeric vector of length 1") 41 | if(any(!(parallel %% 1 == 0),parallel < 1)) stop("'parallel' should be a positive integer") 42 | 43 | # If parallel was called 44 | if(parallel > 1) 45 | { options(warn = -1) 46 | if(all(Sys.info()[1] == "Windows",requireNamespace("parallelsugar", quietly = TRUE) == TRUE)) 47 | lapp <- function(X, FUN) parallelsugar::mclapply(X, FUN, mc.cores = parallel) else 48 | if(Sys.info()[1] == "Windows"){ 49 | cat("Windows users need to install the 'parallelsugar' package for parallel computing (you are not doing it now!)") 50 | lapp <- pbapply::pblapply} else lapp <- function(X, FUN) parallel::mclapply(X, FUN, mc.cores = parallel)} else lapp <- pbapply::pblapply 51 | 52 | options(warn = 0) 53 | 54 | if(parallel == 1) cat("Measuring acoustic parameters:") 55 | x <- as.data.frame(lapp(1:length(start), function(i) { 56 | r <- tuneR::readWave(file.path(sound.files[i]), from = start[i], to = end[i], units = "seconds") 57 | 58 | b<- bp #in case bp its higher than can be due to sampling rate 59 | if(b[2] > ceiling(r@samp.rate/2000) - 1) b[2] <- ceiling(r@samp.rate/2000) - 1 60 | 61 | 62 | #frequency spectrum analysis 63 | songspec <- seewave::spec(r, f = r@samp.rate, plot = FALSE) 64 | analysis <- seewave::specprop(songspec, f = r@samp.rate, flim = c(0, 280/1000), plot = FALSE) 65 | 66 | #save parameters 67 | meanfreq <- analysis$mean/1000 68 | sd <- analysis$sd/1000 69 | median <- analysis$median/1000 70 | Q25 <- analysis$Q25/1000 71 | Q75 <- analysis$Q75/1000 72 | IQR <- analysis$IQR/1000 73 | skew <- analysis$skewness 74 | kurt <- analysis$kurtosis 75 | sp.ent <- analysis$sh 76 | sfm <- analysis$sfm 77 | mode <- analysis$mode/1000 78 | centroid <- analysis$cent/1000 79 | 80 | #Frequency with amplitude peaks 81 | peakf <- 0#seewave::fpeaks(songspec, f = r@samp.rate, wl = wl, nmax = 3, plot = FALSE)[1, 1] 82 | 83 | #Fundamental frequency parameters 84 | ff <- seewave::fund(r, f = r@samp.rate, ovlp = 50, threshold = threshold, 85 | fmax = 280, ylim=c(0, 280/1000), plot = FALSE, wl = wl)[, 2] 86 | meanfun<-mean(ff, na.rm = T) 87 | minfun<-min(ff, na.rm = T) 88 | maxfun<-max(ff, na.rm = T) 89 | 90 | #Dominant frecuency parameters 91 | y <- seewave::dfreq(r, f = r@samp.rate, wl = wl, ylim=c(0, 280/1000), ovlp = 0, plot = F, threshold = threshold, bandpass = b * 1000, fftw = TRUE)[, 2] 92 | meandom <- mean(y, na.rm = TRUE) 93 | mindom <- min(y, na.rm = TRUE) 94 | maxdom <- max(y, na.rm = TRUE) 95 | dfrange <- (maxdom - mindom) 96 | duration <- (end[i] - start[i]) 97 | 98 | #modulation index calculation 99 | changes <- vector() 100 | for(j in which(!is.na(y))){ 101 | change <- abs(y[j] - y[j + 1]) 102 | changes <- append(changes, change) 103 | } 104 | if(mindom==maxdom) modindx<-0 else modindx <- mean(changes, na.rm = T)/dfrange 105 | 106 | #save results 107 | return(c(duration, meanfreq, sd, median, Q25, Q75, IQR, skew, kurt, sp.ent, sfm, mode, 108 | centroid, peakf, meanfun, minfun, maxfun, meandom, mindom, maxdom, dfrange, modindx)) 109 | })) 110 | 111 | #change result names 112 | 113 | rownames(x) <- c("duration", "meanfreq", "sd", "median", "Q25", "Q75", "IQR", "skew", "kurt", "sp.ent", 114 | "sfm","mode", "centroid", "peakf", "meanfun", "minfun", "maxfun", "meandom", "mindom", "maxdom", "dfrange", "modindx") 115 | x <- data.frame(sound.files, selec, as.data.frame(t(x))) 116 | colnames(x)[1:2] <- c("sound.files", "selec") 117 | rownames(x) <- c(1:nrow(x)) 118 | 119 | return(x) 120 | } 121 | 122 | readWavFile <- function(fileName) { 123 | # Start with empty data.frame. 124 | data <- data.frame() 125 | 126 | row <- data.frame(fileName, 0, 0, 20) 127 | data <- rbind(data, row) 128 | 129 | # Set column names. 130 | names(data) <- c('sound.files', 'selec', 'start', 'end') 131 | 132 | tokens <- unlist(strsplit(fileName, "/")) 133 | folderName <- paste(tokens[-length(tokens)], collapse="/") 134 | 135 | # Process files. 136 | acoustics <- specan3(data, parallel=1) 137 | 138 | acoustics 139 | } 140 | 141 | get_gender <- function(fileName){ 142 | data <- readWavFile(fileName) 143 | 144 | # Remove unused columns. 145 | data$duration <- NULL 146 | data$sound.files <- NULL 147 | data$selec <- NULL 148 | data$peakf <- NULL 149 | 150 | #load model 151 | if (!exists('genderSvm')) { 152 | # saveRDS(genderSvm, "genderSvm.rds") 153 | genderSvm <- readRDS( "genderSvm.rds") 154 | } 155 | 156 | #genderSvm 157 | predictSvm <- predict(genderSvm, data) 158 | return(as.character(predictSvm)) 159 | } 160 | 161 | # wavFile = "xxx.wav" 162 | # print(get_gender(wavFile)) 163 | -------------------------------------------------------------------------------- /recognize_one_wav_svm_wrapper.py: -------------------------------------------------------------------------------- 1 | import rpy2.robjects as robjects 2 | 3 | # sample usage 4 | #from recognize_one_wav_svm_wrapper import recognize_one_wav_svm 5 | #wavFile = "xxx.wav" 6 | #print(recognize_one_wav_svm(wavFile)) 7 | 8 | # Use the script above to get the gender of voice of the wav file 9 | # Note that this shouold be in the same folder as recognize_one_wav_svm.R and genderSvm.rds 10 | def recognize_one_wav_svm(wavFile): 11 | r = robjects.r 12 | r.source("recognize_one_wav_svm.R") 13 | return r['get_gender'](wavFile) 14 | -------------------------------------------------------------------------------- /stt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import time 3 | from ctypes import * 4 | from io import BytesIO 5 | import platform 6 | import logging 7 | import os 8 | 9 | logging.basicConfig(level=logging.DEBUG) 10 | 11 | BASEPATH=os.path.split(os.path.realpath(__file__))[0] 12 | 13 | def play(filename): 14 | import pygame 15 | pygame.mixer.init(frequency=16000) 16 | pygame.mixer.music.load(filename) 17 | pygame.mixer.music.play() 18 | while pygame.mixer.music.get_busy() == True: 19 | continue 20 | 21 | 22 | 23 | def getWaveData(_tmpFile = 'weather.pcm'): 24 | with open(_tmpFile,'rb') as f: 25 | return f.read() 26 | 27 | 28 | def convDataToPointer(wav_data): 29 | tmpBytes = BytesIO() 30 | f_size = tmpBytes.write(wav_data) 31 | array = ( c_byte * f_size)() 32 | tmpBytes.seek(0,0) 33 | tmpBytes.readinto(array) 34 | return array 35 | 36 | 37 | def speech_to_text(waveData): 38 | 39 | 40 | plat = platform.architecture() 41 | if plat[0] == '32bit': 42 | cur = cdll.LoadLibrary(BASEPATH + '/x86/msc_x64.lib') 43 | else: 44 | cur = cdll.LoadLibrary(BASEPATH + '/x64/msc_x64.dll') 45 | 46 | 47 | MSPLogin = cur.MSPLogin 48 | QISRSessionBegin = cur.QISRSessionBegin 49 | QISRAudioWrite = cur.QISRAudioWrite 50 | QISRGetResult = cur.QISRGetResult 51 | QISRGetResult.restype = c_void_p 52 | QISRSessionEnd = cur.QISRSessionEnd 53 | 54 | p_pcm = convDataToPointer(waveData) 55 | pcm_size = sizeof(p_pcm) 56 | 57 | ret_c = c_int(0) 58 | ret = 0 59 | 60 | ep_stat = c_int(0) 61 | rec_stat = c_int(0) 62 | 63 | ret = MSPLogin(None,None,'appid = 539feff8, work_dir = .') 64 | if ret != 0: 65 | logging.error("MSPLogin failed, error code: " + ret); 66 | return 67 | 68 | 69 | logging.info("开始语音听写 ...") 70 | session_begin_params = "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding = utf8"; 71 | sessionID = QISRSessionBegin(None,session_begin_params, byref(ret_c)); 72 | if ret_c.value != 0 : 73 | logging.error("QISRSessionBegin failed, error code: " + ret_c.value); 74 | return 75 | 76 | pcm_count = 0 77 | len = 10 * 640; #每次写入200ms音频(16k,16bit):1帧音频20ms,10帧=200ms。16k采样率的16位音频,一帧的大小为640Byte 78 | while True: 79 | if pcm_size < 2 * len: 80 | len = pcm_size 81 | if len <= 0 : 82 | break 83 | 84 | aud_stat = 2 85 | if 0 == pcm_count: 86 | aud_stat = 1 87 | 88 | ret = QISRAudioWrite(sessionID, byref(p_pcm,pcm_count),len, aud_stat, byref(ep_stat), byref(rec_stat)); 89 | if ret != 0: 90 | logging.error("QISRAudioWrite failed, error code: " + ret); 91 | break 92 | 93 | pcm_count += len 94 | pcm_size -= len 95 | 96 | if ep_stat.value == 3: 97 | break 98 | time.sleep(.1) 99 | 100 | 101 | ret = QISRAudioWrite(sessionID, None,0, 4, byref(ep_stat), byref(rec_stat)); 102 | if ret != 0: 103 | logging.error("QISRAudioWrite failed, error code: " + ret); 104 | 105 | error_c = c_int(0) 106 | text_finish = "" 107 | while rec_stat.value != 5: 108 | x = QISRGetResult(sessionID, byref(rec_stat), 0, error_c); 109 | if x!=None: 110 | num = 0 111 | while True: 112 | if (c_char).from_address(x+num).value != c_char('\x00').value: 113 | num += 1 114 | else: 115 | break 116 | text = (c_char * num).from_address(x) 117 | text_finish += text.value 118 | 119 | time.sleep(.1) 120 | logging.debug(text_finish) 121 | logging.info('合成完成!') 122 | ret = QISRSessionEnd(sessionID, "Normal"); 123 | if ret != 0: 124 | logging.error("QTTSTextPut failed, error code: " + ret); 125 | 126 | return text_finish 127 | 128 | 129 | if __name__ == '__main__': 130 | speech_to_text(getWaveData('weather.pcm')) 131 | -------------------------------------------------------------------------------- /surname_corrector.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | ''' 3 | Created on 2017-11-21 4 | 5 | @author: 刘帅 6 | ''' 7 | from pypinyin import pinyin, lazy_pinyin, Style 8 | import re 9 | import itertools 10 | import pickle 11 | import numpy as np 12 | import array 13 | 14 | 15 | surname_expressions = [ 16 | "口天吴", 17 | "文刀刘", 18 | "弓长张", 19 | "双木林", 20 | "耳东陈", 21 | "木子李", 22 | "立早章", 23 | "双口吕", 24 | "三横王", 25 | "古月胡", 26 | "木易杨", 27 | "言午许", 28 | "美女姜", 29 | "山高嵩", 30 | "木公松", 31 | "水工江", 32 | "羊女姜", 33 | "草头黄", 34 | "双人徐", 35 | "木土杜", 36 | "干钩于", 37 | "子小孙", 38 | ] 39 | 40 | def dict_builder(expressions): 41 | expressiondict = {} 42 | 43 | for expression in expressions: 44 | multiple_sounds = pinyin(expression, style=Style.FIRST_LETTER, heteronym=False) 45 | multiple_sounds = list(itertools.chain.from_iterable(multiple_sounds)) 46 | multiple_sounds = "".join(multiple_sounds) 47 | #print(multiple_sounds) 48 | #multiple_sounds = itertools.product(multiple_sounds[0], multiple_sounds[1], multiple_sounds[2]) 49 | 50 | expressiondict[multiple_sounds] = expression[2] 51 | 52 | return expressiondict 53 | 54 | #namedict = dict_builder(surname_expressions) 55 | #with open('namedict.pickle', 'wb') as handle: 56 | #pickle.dump(namedict, handle, protocol=pickle.HIGHEST_PROTOCOL) 57 | # 58 | #with open('expressiondict.pickle', 'rb') as handle: 59 | # expressiondict = pickle.load(handle) 60 | def surname_correct(sentence): 61 | with open('namedict.pickle', 'rb') as handle: 62 | expressiondict = pickle.load(handle) 63 | pysc = sentence[-3:] 64 | pysc = pinyin(pysc, style=Style.FIRST_LETTER, heteronym=False) 65 | pysc = list(itertools.chain.from_iterable(pysc)) 66 | pysc = "".join(pysc) 67 | #print(pysc) 68 | 69 | 70 | final_main_clause = '姓' + expressiondict[pysc] 71 | return final_main_clause 72 | 73 | #expressiondict = dict_builder(surname_expressions) 74 | error_surname_examples = [ 75 | "我姓许,双人需", 76 | "我姓章,弓长帐" 77 | ] 78 | 79 | for sentence in error_surname_examples: 80 | corrected_sentence = surname_correct(sentence) 81 | print('{} now becomes {}'.format(sentence, corrected_sentence)) -------------------------------------------------------------------------------- /tts.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import time 3 | from ctypes import * 4 | from io import BytesIO 5 | import wave 6 | import platform 7 | import logging 8 | import os 9 | 10 | logging.basicConfig(level=logging.DEBUG) 11 | 12 | BASEPATH=os.path.split(os.path.realpath(__file__))[0] 13 | print(BASEPATH) 14 | def play(filename): 15 | import pygame 16 | pygame.mixer.init(frequency=16000) 17 | pygame.mixer.music.load(filename) 18 | pygame.mixer.music.play() 19 | while pygame.mixer.music.get_busy() == True: 20 | continue 21 | 22 | def saveWave(raw_data,_tmpFile = 'test.wav'): 23 | f = wave.open(_tmpFile,'w') 24 | f.setparams((1, 2, 16000, 262720, 'NONE', 'not compressed')) 25 | f.writeframesraw(raw_data) 26 | f.close() 27 | return _tmpFile 28 | 29 | def text_to_speech(src_text="这不仅仅是一个测试",file_name = None): 30 | 31 | plat = platform.architecture() 32 | print(plat[0]) 33 | 34 | 35 | MSPLogin = cur.MSPLogin 36 | QTTSSessionBegin = cur.QTTSSessionBegin 37 | QTTSTextPut = cur.QTTSTextPut 38 | 39 | QTTSAudioGet = cur.QTTSAudioGet 40 | QTTSAudioGet.restype = c_void_p 41 | 42 | QTTSSessionEnd = cur.QTTSSessionEnd 43 | 44 | ret_c = c_int(0) 45 | ret = 0 46 | 47 | ret = MSPLogin(None,None,'appid = 539feff8, work_dir = .') 48 | if ret != 0: 49 | logging.error("MSPLogin failed, error code: " + ret); 50 | return 51 | 52 | session_begin_params="voice_name = xiaoyan, text_encoding = utf8, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2" 53 | sessionID = QTTSSessionBegin(session_begin_params, byref(ret_c)); 54 | if ret_c.value != 0 : 55 | logging.error("QTTSSessionBegin failed, error code: " + ret_c.value); 56 | return 57 | 58 | ret = QTTSTextPut(sessionID, src_text, len(src_text),None) 59 | if ret != 0: 60 | logging.error("QTTSTextPut failed, error code: " + ret); 61 | QTTSSessionEnd(sessionID, "TextPutError"); 62 | 63 | return 64 | logging.info("正在合成 [%s]..." %(src_text)) 65 | 66 | audio_len = c_uint(0) 67 | synth_status = c_int(0) 68 | 69 | f = BytesIO() 70 | while True: 71 | p = QTTSAudioGet(sessionID, byref(audio_len), byref(synth_status), byref(ret_c)); 72 | if ret_c.value != 0: 73 | logging.error("QTTSAudioGet failed, error code: " + ret_c); 74 | QTTSSessionEnd(sessionID, "AudioGetError"); 75 | break 76 | 77 | if p != None: 78 | buf = (c_char * audio_len.value).from_address(p) 79 | f.write(buf) 80 | 81 | if synth_status.value == 2 : 82 | saveWave(f.getvalue(),file_name) 83 | break 84 | 85 | logging.debug(".") 86 | time.sleep(1) 87 | 88 | logging.info('合成完成!') 89 | ret = QTTSSessionEnd(sessionID, "Normal"); 90 | if ret != 0: 91 | logging.error("QTTSTextPut failed, error code: " + ret); 92 | 93 | 94 | if __name__ == '__main__': 95 | text_to_speech('科大讯飞还是不错的','xx.wav') 96 | 97 | -------------------------------------------------------------------------------- /weather.pcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/weather.pcm -------------------------------------------------------------------------------- /wechat_bot.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | #from wxbot import WXBot 4 | import itchat 5 | from itchat.content import TEXT 6 | from itchat.content import RECORDING 7 | import requests 8 | import threading 9 | from findAddressName import findAddress 10 | from findFirstName import extract_firstName 11 | import requests 12 | import json 13 | import findFirstName 14 | import re 15 | from GetXiaoQuAddress import GetAddress 16 | from surname_corrector import surname_correct 17 | name = '' 18 | phone_number = '' 19 | address='' 20 | address_detail = '' 21 | type = '' 22 | install_place = '' 23 | date = '' 24 | xiaoqu = '' 25 | province = '' 26 | dis_qu = '' 27 | confidence = 0 28 | price = 0 29 | 30 | tmp = '' 31 | import re 32 | def getAllNumber(query_str): 33 | return "".join(re.findall(r"\d+\.?\d*",query_str)) 34 | 35 | def extract_entities(query_str): 36 | # sample input: "天津市和平区西康路37号赛顿中心。" 37 | # its output: ['天津市', '和平区', '西康路', '37号', '赛顿中心'] 38 | response = requests.post("http://192.168.2.171:5002/parse", '{{"q":"{0}", "project": "default", "model": "model_20171126-064026"}}'.format(query_str).encode('utf-8')) 39 | parsed_j = json.loads(response.text) 40 | print(parsed_j) 41 | intent = parsed_j["intent"]['name'] 42 | global confidence#全局变量 43 | 44 | confidence = parsed_j["intent"]['confidence'] 45 | print(intent) 46 | print(confidence) 47 | if '装' in query_str and '电视' in query_str: 48 | return "install","install" 49 | if intent == "install_place" and confidence > 0.2: 50 | values = [e["value"] for e in parsed_j["entities"]] 51 | return intent,values[0] 52 | if intent == "signal" and confidence > 0.31: 53 | return intent,intent 54 | if intent == "date": 55 | values = [e["value"] for e in parsed_j["entities"]] 56 | return intent,values[0] 57 | if 'LCD' in tmp and '看看' not in query_str : 58 | if len(getAllNumber(query_str)) == 0: 59 | return "getsize","getsize" 60 | if intent == "install" and confidence > 0.2: 61 | return intent,intent 62 | if '到家了吗' in tmp: 63 | if '没' in query_str or '快' in query_str: 64 | return "notArrive","notArrive" 65 | if '电视信号' in tmp: 66 | if '没' in query_str: 67 | return "notSignal","notSignal" 68 | if intent == "phone_number" or intent == "install_type": 69 | number = getAllNumber(query_str) 70 | if len(number) >= 10: 71 | intent = "phone_number" 72 | return intent,number 73 | else: 74 | print(tmp + "666") 75 | if('两种收费' in tmp): 76 | intent = "price" 77 | return intent,number 78 | elif(len(number) == 3):#直接就说数字的,无法理解是哪个意思 79 | intent = "unknown" 80 | return intent,intent 81 | elif(len(number) == 2): 82 | intent = "size" 83 | return intent,number 84 | elif(len(number) > 0): 85 | intent = "install_type" 86 | return intent,query_str 87 | #print(intent) 88 | if intent == "name" and confidence > 0.2: 89 | return intent,intent 90 | if(intent == "greet"): 91 | 92 | #values = [e["value"] for e in parsed_j["entities"]] 93 | return intent,intent 94 | if(parsed_j['intent']['name']=="address"): 95 | values = [e["value"] for e in parsed_j["entities"]] 96 | #print("".join(values)) 97 | return parsed_j['intent']['name'],"".join(values) 98 | return "null","null" 99 | # todo 用另一个进程把服务起来 100 | bot_api="http://127.0.0.1:8000/get_response" 101 | 102 | # 带对象参数注册,对应消息对象将调用该方法 103 | @itchat.msg_register(TEXT, isFriendChat=True ) 104 | def text_reply(msg): 105 | global tmp 106 | user_input = msg['Text'] 107 | #print(user_input) 108 | user_input = user_input.replace(",","") 109 | print(user_input) 110 | payload={"user_input":user_input} 111 | intent,entity= extract_entities(user_input) 112 | if(intent == "phone_number"): 113 | phone_number = entity 114 | #print(phone_number) 115 | itchat.send("好的,您的电话是" + str(phone_number)+"," +"那您的安装地址哪里呢?", msg['FromUserName']) 116 | elif(intent == "greet"): 117 | itchat.send("您好,感谢您访问夏普公司,很高兴为您服务。", msg['FromUserName']) 118 | elif(intent == "address"): 119 | address,xiaoqu,city,dis_qu2,dong = findAddress(user_input) 120 | address = entity 121 | xiaoqu,address_detail,province,dis_qu= GetAddress(xiaoqu,city) 122 | if(len(dis_qu) > 0): 123 | address = province + city + dis_qu2 + xiaoqu + address_detail + dong 124 | itchat.send("您的地址是" + str(address), msg['FromUserName']) 125 | else: 126 | itchat.send("您的地址是" + str(address), msg['FromUserName']) 127 | elif(intent == "name"): 128 | name = surname_correct(user_input) 129 | if name == "": 130 | name = extract_firstName(user_input) 131 | tmp = "请问您的电视机到家了吗?" 132 | itchat.send("好的," + str(name) + "先生,请问您的电视机到家了吗?", msg['FromUserName']) 133 | elif(intent == "install_type"): 134 | type = entity 135 | tmp = "好的,您的电视型号是" + str(type) + "那请问您的电视是要放在柜子上还是挂在墙上呢?" 136 | itchat.send(tmp, msg['FromUserName']) 137 | elif(intent == "install_place"): 138 | install_place = entity 139 | tmp = "挂在墙上是有两种收费的,一种是简单固定型的是210元,另外一种是裝壁伸缩型可以微调的是550元,那您要选择哪一种呢" 140 | print(tmp) 141 | itchat.send(tmp, msg['FromUserName']) 142 | elif(intent == "signal"): 143 | print(confidence) 144 | tmp = "好的,您的信号已经开通了,请问您的电视机型号可以提供一下吗?是以LCD-开头的" 145 | itchat.send(tmp, msg['FromUserName']) 146 | elif(intent == "date"): 147 | date = entity 148 | itchat.send("好的,那到时候师傅上门是联系您本人吗?", msg['FromUserName']) 149 | elif(intent == "install"): 150 | itchat.send("好的,请问您贵姓呢怎么称呼您呢", msg['FromUserName']) 151 | elif(intent == "hanger"): 152 | tmp = "好的,您的信号已经开通了,请问您的电视机型号可以提供一下吗?是以LCD-开头的" 153 | itchat.send(tmp, msg['FromUserName']) 154 | elif(intent == "price"): 155 | price = entity 156 | itchat.send("好的,您选取的安装方式费用为" + str(price) + "那现在为您预约,从明天开始,哪天方便哪" , msg['FromUserName']) 157 | elif(intent == "getsize"): 158 | tmp = "请问您的电视机尺寸是多少呢?" 159 | itchat.send(tmp,msg['FromUserName']) 160 | elif(intent == "size"): 161 | size = entity 162 | itchat.send("您的电视机尺寸是" + str(size) + "请问您的电视是要放在柜子上还是挂在墙上呢?" , msg['FromUserName']) 163 | elif(intent == "notArrive"): 164 | tmp = "" 165 | itchat.send("为了避免师傅上门时电视还没有送到家无法安装,建议您等电视送到家后再来电报装。" , msg['FromUserName']) 166 | elif(intent == "notSignal"): 167 | tmp = "" 168 | itchat.send("师傅上门安装后还会为您调试,如果信号没有开通就无法进行调试,后续调试的话可能会产生费用,所以建议您等信号开通后再来电报装。" , msg['FromUserName']) 169 | elif(confidence < 0.31): 170 | response = requests.get(bot_api,params=payload).json()["response"] 171 | tmp = response 172 | itchat.send(response, msg['FromUserName']) 173 | 174 | @itchat.msg_register(RECORDING) 175 | def rec_reply(msg): 176 | # 是否开启语音识别,需要安装ffmpeg和pydub 177 | msg['Text']('./records/' + msg['FileName']) 178 | 179 | from beta import wav2text,textToMp3 180 | wav2text.transcode('./records/' + msg['FileName']) 181 | filename = msg['FileName'].replace('mp3','wav') 182 | text = wav2text.wav_to_text('./records/' + filename) 183 | text = text.replace(",","") 184 | print(text) 185 | payload={"user_input":text} 186 | intent,entity= extract_entities(text) 187 | if(intent == "phone_number"): 188 | phone_number = entity 189 | response = "好的,您的电话是" + str(phone_number) + "," +"那您的安装地址哪里呢?" 190 | filename2 = textToMp3.textToMp3(response) 191 | 192 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 193 | #print(phone_number) 194 | #itchat.send("好的,您的电话是" + str(phone_number), msg['FromUserName']) 195 | if(intent == "greet"): 196 | response = "您好,感谢您访问夏普公司,很高兴为您服务。" 197 | filename2 = textToMp3.textToMp3(response) 198 | 199 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 200 | print(reply['BaseResponse']['ErrMsg']) 201 | #itchat.send("您好,感谢您访问夏普公司,很高兴为您服务。", msg['FromUserName']) 202 | if(intent == "address"): 203 | address = findAddress(text) 204 | response = "您的地址是" + str(address) 205 | filename2 = textToMp3.textToMp3(response) 206 | print(reply['BaseResponse']['ErrMsg']) 207 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 208 | if(intent == "null"):#处理地址intent识别错误就用hanlp 209 | #address = findAddress(text) 210 | #response = "您的地址是" + str(address) 211 | #filename2 = textToMp3.textToMp3(response) 212 | 213 | #reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 214 | #print(reply['BaseResponse']['ErrMsg']) 215 | response = requests.get(bot_api,params=payload).json()["response"] 216 | filename2 = textToMp3.textToMp3(response) 217 | print(response) 218 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 219 | print(reply['BaseResponse']['ErrMsg']) 220 | 221 | # 把服务跑起来 bottlell 222 | def bot_server(): 223 | from bottle import Bottle,run 224 | from bottle import response,request 225 | from chatterbot import ChatBot 226 | from chatterbot.trainers import ChatterBotCorpusTrainer 227 | from json import dumps 228 | 229 | deepThought = ChatBot("deepThought",read_only=True) 230 | deepThought.set_trainer(ChatterBotCorpusTrainer) 231 | # 使用中文语料库训练它 232 | # 只需要训练一次,不需要每次启动进程都训练,训练结果默认存到本地`./database.db`,之后启动进程会使用这个数据库 233 | #deepThought.train("chatterbot.corpus.custom") # 语料库 234 | 235 | app = Bottle() 236 | @app.route('/get_response') 237 | def get_response(): 238 | user_input = request.query.user_input or "" 239 | d_response = deepThought.get_response(user_input).text 240 | response.content_type = 'application/json' 241 | res = {"response":d_response} 242 | return dumps(res) 243 | 244 | run(app, host='localhost', port=8000) 245 | 246 | 247 | 248 | botThread = threading.Thread(target=bot_server) 249 | botThread.setDaemon(True) 250 | botThread.start() 251 | 252 | itchat.auto_login(hotReload=True) 253 | itchat.run() 254 | 255 | -------------------------------------------------------------------------------- /wechat_bot_1207.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | #from wxbot import WXBot 4 | import itchat 5 | from itchat.content import TEXT 6 | from itchat.content import RECORDING 7 | import requests 8 | import threading 9 | from findAddressName import findAddress 10 | from findFirstName import extract_firstName 11 | import requests 12 | import json 13 | import findFirstName 14 | import re 15 | from GetXiaoQuAddress import GetAddress 16 | from surname_corrector import surname_correct 17 | name = '' 18 | phone_number = '' 19 | address='' 20 | address_detail = '' 21 | type = '' 22 | install_place = '' 23 | date = '' 24 | xiaoqu = '' 25 | province = '' 26 | dis_qu = '' 27 | confidence = 0 28 | price = 0 29 | 30 | tmp = '' 31 | import re 32 | def getAllNumber(query_str): 33 | return "".join(re.findall(r"\d+\.?\d*",query_str)) 34 | 35 | def extract_entities(query_str): 36 | # sample input: "天津市和平区西康路37号赛顿中心。" 37 | # its output: ['天津市', '和平区', '西康路', '37号', '赛顿中心'] 38 | response = requests.post("http://192.168.2.171:5002/parse", '{{"q":"{0}", "project": "default", "model": "model_20171207-164652"}}'.format(query_str).encode('utf-8')) 39 | parsed_j = json.loads(response.text) 40 | print(parsed_j) 41 | intent = parsed_j["intent"]['name'] 42 | entity_dict = {e["entity"]: e["value"] for e in parsed_j["entities"]} 43 | values = [e["value"] for e in parsed_j["entities"]] 44 | global confidence#全局变量 45 | 46 | confidence = parsed_j["intent"]['confidence'] 47 | print(intent) 48 | print(confidence) 49 | if intent=="install": 50 | return "install","install" 51 | if intent == "inform" and "install_place" in entity_dict: 52 | return intent,entity_dict["install_place"] 53 | if intent == "signal" and confidence > 0.31: 54 | return intent,intent 55 | if intent == "inform" and "date" in entity_dict: 56 | return intent,entity_dict["date"] 57 | if ('LCD' in tmp and '看看' not in query_str) or intent=="finding": 58 | if len(getAllNumber(query_str)) == 0: 59 | return "getsize","getsize" 60 | if '到家了吗' in tmp: 61 | if '没' in query_str or '快' in query_str or intent=="nottohome": 62 | return "notArrive","notArrive" 63 | if '电视信号' in tmp: 64 | if '没' in query_str or intent=="nosignal": 65 | return "notSignal","notSignal" 66 | if intent == "inform" \ 67 | and ("size" in entity_dict \ 68 | or "phone" in entity_dict \ 69 | or "install_wall_type" in entity_dict): 70 | number = getAllNumber(query_str) 71 | if len(number) >= 10: 72 | intent = "phone_number" 73 | return intent,number 74 | else: 75 | print(tmp + "666") 76 | if('两种收费' in tmp): 77 | intent = "price" 78 | return intent,number 79 | elif(len(number) == 3):#直接就说数字的,无法理解是哪个意思 80 | intent = "unknown" 81 | return intent,intent 82 | elif(len(number) == 2): 83 | intent = "size" 84 | return intent,number 85 | elif(len(number) > 0): 86 | intent = "install_type" 87 | return intent,query_str 88 | #print(intent) 89 | if intent == "inform" and "name" in entity_dict: 90 | return intent,intent 91 | if intent == "greet": 92 | 93 | #values = [e["value"] for e in parsed_j["entities"]] 94 | return intent,intent 95 | if intent == "inform" and "address" in entity_dict: 96 | #print("".join(values)) 97 | return "address","".join(values) 98 | return "null","null" 99 | # todo 用另一个进程把服务起来 100 | bot_api="http://127.0.0.1:8000/get_response" 101 | 102 | # 带对象参数注册,对应消息对象将调用该方法 103 | @itchat.msg_register(TEXT, isFriendChat=True ) 104 | def text_reply(msg): 105 | global tmp 106 | user_input = msg['Text'] 107 | #print(user_input) 108 | user_input = user_input.replace(",","") 109 | print(user_input) 110 | payload={"user_input":user_input} 111 | intent,entity= extract_entities(user_input) 112 | if(intent == "phone_number"): 113 | phone_number = entity 114 | #print(phone_number) 115 | itchat.send("好的,您的电话是" + str(phone_number)+"," +"那您的安装地址哪里呢?", msg['FromUserName']) 116 | elif(intent == "greet"): 117 | itchat.send("您好,感谢您访问夏普公司,很高兴为您服务。", msg['FromUserName']) 118 | elif(intent == "address"): 119 | address,xiaoqu,city,dis_qu2,dong = findAddress(user_input) 120 | address = entity 121 | xiaoqu,address_detail,province,dis_qu= GetAddress(xiaoqu,city) 122 | if(len(dis_qu) > 0): 123 | address = province + city + dis_qu2 + xiaoqu + address_detail + dong 124 | itchat.send("您的地址是" + str(address), msg['FromUserName']) 125 | else: 126 | itchat.send("您的地址是" + str(address), msg['FromUserName']) 127 | elif(intent == "name"): 128 | name = surname_correct(user_input) 129 | if name == "": 130 | name = extract_firstName(user_input) 131 | tmp = "请问您的电视机到家了吗?" 132 | itchat.send("好的," + str(name) + "先生,请问您的电视机到家了吗?", msg['FromUserName']) 133 | elif(intent == "install_type"): 134 | type = entity 135 | tmp = "好的,您的电视型号是" + str(type) + "那请问您的电视是要放在柜子上还是挂在墙上呢?" 136 | itchat.send(tmp, msg['FromUserName']) 137 | elif(intent == "install_place"): 138 | install_place = entity 139 | tmp = "挂在墙上是有两种收费的,一种是简单固定型的是210元,另外一种是裝壁伸缩型可以微调的是550元,那您要选择哪一种呢" 140 | print(tmp) 141 | itchat.send(tmp, msg['FromUserName']) 142 | elif(intent == "signal"): 143 | print(confidence) 144 | tmp = "好的,您的信号已经开通了,请问您的电视机型号可以提供一下吗?是以LCD-开头的" 145 | itchat.send(tmp, msg['FromUserName']) 146 | elif(intent == "date"): 147 | date = entity 148 | itchat.send("好的,那到时候师傅上门是联系您本人吗?", msg['FromUserName']) 149 | elif(intent == "install"): 150 | itchat.send("好的,请问您贵姓呢怎么称呼您呢", msg['FromUserName']) 151 | elif(intent == "hanger"): 152 | tmp = "好的,您的信号已经开通了,请问您的电视机型号可以提供一下吗?是以LCD-开头的" 153 | itchat.send(tmp, msg['FromUserName']) 154 | elif(intent == "price"): 155 | price = entity 156 | itchat.send("好的,您选取的安装方式费用为" + str(price) + "那现在为您预约,从明天开始,哪天方便哪" , msg['FromUserName']) 157 | elif(intent == "getsize"): 158 | tmp = "请问您的电视机尺寸是多少呢?" 159 | itchat.send(tmp,msg['FromUserName']) 160 | elif(intent == "size"): 161 | size = entity 162 | itchat.send("您的电视机尺寸是" + str(size) + "请问您的电视是要放在柜子上还是挂在墙上呢?" , msg['FromUserName']) 163 | elif(intent == "notArrive"): 164 | tmp = "" 165 | itchat.send("为了避免师傅上门时电视还没有送到家无法安装,建议您等电视送到家后再来电报装。" , msg['FromUserName']) 166 | elif(intent == "notSignal"): 167 | tmp = "" 168 | itchat.send("师傅上门安装后还会为您调试,如果信号没有开通就无法进行调试,后续调试的话可能会产生费用,所以建议您等信号开通后再来电报装。" , msg['FromUserName']) 169 | elif(confidence < 0.31): 170 | response = requests.get(bot_api,params=payload).json()["response"] 171 | tmp = response 172 | itchat.send(response, msg['FromUserName']) 173 | 174 | @itchat.msg_register(RECORDING) 175 | def rec_reply(msg): 176 | # 是否开启语音识别,需要安装ffmpeg和pydub 177 | msg['Text']('./records/' + msg['FileName']) 178 | 179 | from beta import wav2text,textToMp3 180 | wav2text.transcode('./records/' + msg['FileName']) 181 | filename = msg['FileName'].replace('mp3','wav') 182 | text = wav2text.wav_to_text('./records/' + filename) 183 | text = text.replace(",","") 184 | print(text) 185 | payload={"user_input":text} 186 | intent,entity= extract_entities(text) 187 | if(intent == "phone_number"): 188 | phone_number = entity 189 | response = "好的,您的电话是" + str(phone_number) + "," +"那您的安装地址哪里呢?" 190 | filename2 = textToMp3.textToMp3(response) 191 | 192 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 193 | #print(phone_number) 194 | #itchat.send("好的,您的电话是" + str(phone_number), msg['FromUserName']) 195 | if(intent == "greet"): 196 | response = "您好,感谢您访问夏普公司,很高兴为您服务。" 197 | filename2 = textToMp3.textToMp3(response) 198 | 199 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 200 | print(reply['BaseResponse']['ErrMsg']) 201 | #itchat.send("您好,感谢您访问夏普公司,很高兴为您服务。", msg['FromUserName']) 202 | if(intent == "address"): 203 | address = findAddress(text) 204 | response = "您的地址是" + str(address) 205 | filename2 = textToMp3.textToMp3(response) 206 | print(reply['BaseResponse']['ErrMsg']) 207 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 208 | if(intent == "null"):#处理地址intent识别错误就用hanlp 209 | #address = findAddress(text) 210 | #response = "您的地址是" + str(address) 211 | #filename2 = textToMp3.textToMp3(response) 212 | 213 | #reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 214 | #print(reply['BaseResponse']['ErrMsg']) 215 | response = requests.get(bot_api,params=payload).json()["response"] 216 | filename2 = textToMp3.textToMp3(response) 217 | print(response) 218 | reply = itchat.send_file('D:/tomcat/wechat_bot-master/auido.mp3', msg['FromUserName']) 219 | print(reply['BaseResponse']['ErrMsg']) 220 | 221 | # 把服务跑起来 bottlell 222 | def bot_server(): 223 | from bottle import Bottle,run 224 | from bottle import response,request 225 | from chatterbot import ChatBot 226 | from chatterbot.trainers import ChatterBotCorpusTrainer 227 | from json import dumps 228 | 229 | deepThought = ChatBot("deepThought",read_only=True) 230 | deepThought.set_trainer(ChatterBotCorpusTrainer) 231 | # 使用中文语料库训练它 232 | # 只需要训练一次,不需要每次启动进程都训练,训练结果默认存到本地`./database.db`,之后启动进程会使用这个数据库 233 | #deepThought.train("chatterbot.corpus.custom") # 语料库 234 | 235 | app = Bottle() 236 | @app.route('/get_response') 237 | def get_response(): 238 | user_input = request.query.user_input or "" 239 | d_response = deepThought.get_response(user_input).text 240 | response.content_type = 'application/json' 241 | res = {"response":d_response} 242 | return dumps(res) 243 | 244 | run(app, host='localhost', port=8000) 245 | 246 | 247 | 248 | botThread = threading.Thread(target=bot_server) 249 | botThread.setDaemon(True) 250 | botThread.start() 251 | 252 | itchat.auto_login(hotReload=True) 253 | itchat.run() 254 | 255 | -------------------------------------------------------------------------------- /x64/libmsc.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/x64/libmsc.so -------------------------------------------------------------------------------- /x86/libmsc.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Juary88/WeChatBot/c187abeb62303338c761b9b9c2605ebcf7eb2e25/x86/libmsc.so --------------------------------------------------------------------------------