├── logs └── readme.md ├── models └── readme.md ├── lib ├── __init__.py ├── contrib │ ├── __init__.py │ ├── audio_featurizer.py │ └── audio.py ├── pinyinDictNoTone.pickle ├── pinyinDictNoToneInv.pickle ├── tools_player.py ├── tools_math.py ├── tools_sparse.py ├── tools_pinyin.py ├── recorder.py ├── tools_audio.py ├── tools_batch.py └── tools_augmentation.py ├── data ├── test.wav ├── result_comparison_yixi.jpg ├── result_comparison_zongli.jpg ├── zongli.srt ├── zongli_original.srt └── yixi.srt ├── test_audio.wav ├── test_audio2.wav ├── LICENSE ├── subtitle_demo.py ├── alternatives └── Pinyin2SimplifiedChinese.py ├── layerNormedGRU.py ├── train901.py ├── train902.py ├── train903.py ├── model901.py ├── model902.py ├── model903.py └── README.md /logs/readme.md: -------------------------------------------------------------------------------- 1 | - 2 | -------------------------------------------------------------------------------- /models/readme.md: -------------------------------------------------------------------------------- 1 | - 2 | -------------------------------------------------------------------------------- /lib/__init__.py: -------------------------------------------------------------------------------- 1 | # init 2 | -------------------------------------------------------------------------------- /lib/contrib/__init__.py: -------------------------------------------------------------------------------- 1 | # init 2 | -------------------------------------------------------------------------------- /data/test.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/data/test.wav -------------------------------------------------------------------------------- /test_audio.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/test_audio.wav -------------------------------------------------------------------------------- /test_audio2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/test_audio2.wav -------------------------------------------------------------------------------- /lib/pinyinDictNoTone.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/lib/pinyinDictNoTone.pickle -------------------------------------------------------------------------------- /data/result_comparison_yixi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/data/result_comparison_yixi.jpg -------------------------------------------------------------------------------- /lib/pinyinDictNoToneInv.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/lib/pinyinDictNoToneInv.pickle -------------------------------------------------------------------------------- /data/result_comparison_zongli.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhutoujiuba20/chines/HEAD/data/result_comparison_zongli.jpg -------------------------------------------------------------------------------- /lib/tools_player.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import sounddevice as sd 3 | import matplotlib.pyplot as plt 4 | 5 | from lib.tools_audio import * 6 | 7 | def play(vec, Fs): 8 | sd.play(vec, Fs, blocking=True) 9 | 10 | def normalize(dat): 11 | return 0.99 * dat / np.max(np.abs(dat)) 12 | 13 | def load_data(file_path): 14 | try: 15 | _, data_temp = read_mp3(file_path) 16 | except: 17 | _, data_temp = read_wav(file_path) 18 | return data_temp 19 | 20 | def plotSound(vec): 21 | plt.plot(vec) 22 | plt.ylabel('Amplitude') 23 | plt.show() 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Ming 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/tools_math.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | def sigmoid(x): 4 | return 1.0/(1.0+np.exp(-x)) 5 | 6 | def normalize(dat): 7 | return 0.99 * dat / np.max(np.abs(dat)) 8 | 9 | def get_topk_args(arr, k): 10 | return arr.argsort()[::-1][:k] 11 | 12 | def get_distance(v1, v2): 13 | if len(v2.shape) != 1: 14 | raise ValueError("arg2 should be an 1d array.") 15 | if len(v1.shape) == 1: 16 | return np.sqrt(np.sum(np.square(v1-v2))) 17 | elif len(v1.shape) == 2: 18 | return np.sqrt(np.sum(np.square(v1-v2), axis = 1)) 19 | else: 20 | raise ValueError("arg1 should be rather 1d or 2d array.") 21 | 22 | def get_cos_sim(v1, v2): 23 | if len(v2.shape) != 1: 24 | raise ValueError("arg2 should be an 1d array.") 25 | if len(v1.shape) == 1: 26 | inner = np.sum((v1*v2)) 27 | normv1 = np.sqrt(np.sum(np.square(v1))) 28 | normv2 = np.sqrt(np.sum(np.square(v2))) 29 | return inner/(normv1*normv2) 30 | elif len(v1.shape) == 2: 31 | inner = np.sum((v1*v2), axis = 1) 32 | normv1 = np.sqrt(np.sum(np.square(v1), axis = 1)) 33 | normv2 = np.sqrt(np.sum(np.square(v2))) 34 | return inner/(normv1*normv2) 35 | 36 | def index2onehot(indices, label_range): 37 | result = np.zeros([len(indices), label_range]) 38 | result[np.arange(len(indices)), indices] = 1.0 39 | return result 40 | 41 | def randomExcept(n, end, start = 0): 42 | r = range(start, n) + range(n+1, end) 43 | return np.random.choice(r) 44 | 45 | def zero_padding_1d(vec, obj_length): 46 | result = np.concatenate([vec, np.zeros(obj_length-len(vec))]) 47 | return result 48 | 49 | def neg_padding_1d(vec, obj_length): 50 | result = np.concatenate([vec, -np.ones(obj_length-len(vec))]) 51 | return result 52 | -------------------------------------------------------------------------------- /lib/tools_sparse.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from lib.tools_pinyin import * 3 | 4 | def get_maxLengthListinList(ls): 5 | length = 0 6 | for l in ls: 7 | if len(l)>length: length = len(l) 8 | return length 9 | 10 | def sparse_tuple_from(sequences, dtype=np.int32): 11 | """ 12 | Create a sparse representention of x. 13 | Args: 14 | sequences: a list of lists of type dtype where each element is a sequence 15 | Returns: 16 | A tuple with (indices, values, shape) 17 | """ 18 | indices = [] 19 | values = [] 20 | 21 | for n, seq in enumerate(sequences): 22 | indices.extend(zip([n] * len(seq), range(len(seq)))) 23 | values.extend(seq) 24 | 25 | indices = np.asarray(indices, dtype=np.int64) 26 | values = np.asarray(values, dtype=dtype) 27 | shape = np.asarray([len(sequences), np.asarray(indices).max(0)[1] + 1], dtype=np.int64) 28 | 29 | return indices, values, shape 30 | 31 | def sparseTuples2dense(sparseTensor): 32 | pred_dense = -np.ones(sparseTensor[2]) 33 | for i in range(len(sparseTensor[0])): 34 | pred_dense[sparseTensor[0][i][0],sparseTensor[0][i][1]] = sparseTensor[1][i] 35 | return pred_dense 36 | 37 | def report_accuracy(decoded_list, test_targets, pyParser): 38 | original_list = sparseTuples2dense(test_targets) 39 | detected_list = sparseTuples2dense(decoded_list) 40 | print("-------------------") 41 | for i in range(len(original_list)): 42 | original_line = [] 43 | detected_line = [] 44 | for stuff in original_list[i]: 45 | if stuff!=-1: 46 | original_line.append(stuff) 47 | for stuff in detected_list[i]: 48 | if stuff!=-1: 49 | detected_line.append(stuff) 50 | print(i) 51 | print(original_line) 52 | print(detected_line) 53 | print(pyParser.decodeIndices(original_line, useUnderline = True)) 54 | print(pyParser.decodeIndices(detected_line, useUnderline = True)) 55 | print("-------------------") 56 | -------------------------------------------------------------------------------- /subtitle_demo.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import warnings 4 | warnings.filterwarnings("ignore", message="numpy.dtype size changed") 5 | warnings.filterwarnings("ignore", message="numpy.ufunc size changed") 6 | with warnings.catch_warnings(): 7 | warnings.simplefilter("ignore") 8 | import tensorflow as tf 9 | import numpy as np 10 | from urllib.request import urlopen 11 | 12 | from lib.tools_batch import * 13 | from lib.tools_math import * 14 | from lib.tools_sparse import * 15 | from lib.contrib.audio_featurizer import AudioFeaturizer 16 | from lib.contrib.audio import AudioSegment 17 | from model901 import * 18 | model_name = "v901" 19 | 20 | def timeStamp2Num(timeStamp, rate): 21 | """ 22 | timeStamp str: 00:00:01,879 23 | rate int: the sampling rate 24 | return int 25 | """ 26 | secs, millisec = timeStamp.split(",") 27 | hour, minute, sec = secs.split(":") 28 | millisec = float(millisec)*0.001 29 | sec = float(hour)*3600+float(minute)*60+float(sec) 30 | num = int(rate*(sec+millisec)) 31 | return num 32 | 33 | pyParser = pinyinParser("lib/pinyinDictNoTone.pickle") 34 | model = model(409) 35 | af = AudioFeaturizer() 36 | 37 | with tf.Session() as sess: 38 | saver = tf.train.Saver() 39 | saver.restore(sess, "models/"+model_name+"/"+model_name+"_0.ckpt") 40 | 41 | rate, data = read_wav("data/test.wav") 42 | data = mergeChannels(data) 43 | data = zero_padding_1d(data, 160240) 44 | a_seg = AudioSegment(data, rate) 45 | xs = np.transpose(np.array([af.featurize(a_seg)]), [0,2,1]) 46 | 47 | pred = model.predict(sess, xs)[0] 48 | pred_dense = sparseTuples2dense(pred) 49 | detected_line = [] 50 | for stuff in pred_dense[0]: 51 | if stuff!=-1: 52 | detected_line.append(stuff) 53 | pinyin = pyParser.decodeIndices(detected_line, useUnderline = False) 54 | print(pinyin) 55 | response = urlopen("https://www.google.com/inputtools/request?ime=pinyin&ie=utf-8&oe=utf-8&app=translate&num=10&text="+pinyin) 56 | html = response.read() 57 | result = html.split(",")[2][2:-1] 58 | -------------------------------------------------------------------------------- /lib/tools_pinyin.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pickle 3 | from pypinyin import lazy_pinyin 4 | 5 | class pinyinParser: 6 | 7 | def __init__(self, path): 8 | with open(path, 'rb') as handle: 9 | self.pinyinDict = pickle.load(handle) 10 | invPath = path[:-7]+"Inv.pickle" 11 | with open(invPath, 'rb') as handle: 12 | self.pinyinDict_inv = pickle.load(handle) 13 | 14 | def getDictSize(self): 15 | return len(self.pinyinDict) 16 | 17 | def getPinYin(self, unicodeContent): 18 | return " ".join([x for x in lazy_pinyin(unicodeContent)]) 19 | 20 | def _index2OneHot(self, index): 21 | result = np.zeros(len(self.pinyinDict)) 22 | result[index] = 1.0 23 | return result 24 | 25 | def _indices2OneHot(self, indices): 26 | result = np.zeros([len(indices), len(self.pinyinDict)]) 27 | result[np.arange(len(indices)), indices] = 1.0 28 | return result 29 | 30 | def getPinYinIndices(self, pinyin): 31 | pinyinList = pinyin.strip().split() 32 | indices = [] 33 | for pinyin in pinyinList: 34 | if pinyin in self.pinyinDict: 35 | indices.append(self.pinyinDict[pinyin]) 36 | else: 37 | raise ValueError("Could not find "+pinyin+" in the dictionary.") 38 | if len(indices)==0: 39 | raise ValueError("Invalid input.") 40 | return indices 41 | 42 | def getPinYinOneHot(self, pinyin): 43 | pinyinList = pinyin.strip().split() 44 | indices = [] 45 | for pinyin in pinyinList: 46 | if pinyin in self.pinyinDict: 47 | indices.append(self.pinyinDict[pinyin]) 48 | else: 49 | raise ValueError("Could not find "+pinyin+" in the dictionary.") 50 | if len(indices)==0: 51 | raise ValueError("Invalid input.") 52 | return self._indices2OneHot(indices) 53 | 54 | def decodeIndices(self, vec, useUnderline = True): 55 | result = [] 56 | for num in vec: 57 | if num in self.pinyinDict_inv: 58 | result.append(self.pinyinDict_inv[num]) 59 | if useUnderline: 60 | return '_'.join(result) 61 | else: 62 | return ''.join(result) 63 | -------------------------------------------------------------------------------- /alternatives/Pinyin2SimplifiedChinese.py: -------------------------------------------------------------------------------- 1 | import urllib.request 2 | import execjs 3 | 4 | class pyjs(): 5 | 6 | def __init__(self): 7 | self.ctx = execjs.compile(""" 8 | function TL(a) { 9 | var k = ""; 10 | var b = 406644; 11 | var b1 = 3293161072; 12 | 13 | var jd = "."; 14 | var $b = "+-a^+6"; 15 | var Zb = "+-3^+b+-f"; 16 | 17 | for (var e = [], f = 0, g = 0; g < a.length; g++) { 18 | var m = a.charCodeAt(g); 19 | 128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), 20 | e[f++] = m >> 18 | 240, 21 | e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, 22 | e[f++] = m >> 6 & 63 | 128), 23 | e[f++] = m & 63 | 128) 24 | } 25 | a = b; 26 | for (f = 0; f < e.length; f++) a += e[f], 27 | a = RL(a, $b); 28 | a = RL(a, Zb); 29 | a ^= b1 || 0; 30 | 0 > a && (a = (a & 2147483647) + 2147483648); 31 | a %= 1E6; 32 | return a.toString() + jd + (a ^ b) 33 | }; 34 | 35 | function RL(a, b) { 36 | var t = "a"; 37 | var Yb = "+"; 38 | for (var c = 0; c < b.length - 2; c += 3) { 39 | var d = b.charAt(c + 2), 40 | d = d >= t ? d.charCodeAt(0) - 87 : Number(d), 41 | d = b.charAt(c + 1) == Yb ? a >>> d: a << d; 42 | a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d 43 | } 44 | return a 45 | } 46 | """) 47 | 48 | def getTk(self,text): 49 | return self.ctx.call("TL",text) 50 | 51 | class translator: 52 | def __init__(self): 53 | self.js = pyjs() 54 | 55 | def open_url(self, url): 56 | headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} 57 | req = urllib.request.Request(url = url,headers=headers) 58 | response = urllib.request.urlopen(req) 59 | data = response.read().decode('utf-8') 60 | return data 61 | 62 | def translate(self, content): 63 | tk = self.js.getTk(content) 64 | if len(content) > 4891: return "" 65 | 66 | content = urllib.parse.quote(content) 67 | 68 | url = "http://translate.google.cn/translate_a/single?client=t"\ 69 | "&sl=zh-CN&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca"\ 70 | "&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1"\ 71 | "&srcrom=0&ssel=0&tsel=0&kc=2&tk=%s&q=%s"%(tk,content) 72 | result = self.open_url(url) 73 | end = result.find("\",") 74 | if end > 4: 75 | return result[4:end] 76 | else: 77 | return "" 78 | 79 | if __name__ == "__main__": 80 | t = translator() 81 | print(t.translate("jin tian tian qi zhen bu cuo")) 82 | -------------------------------------------------------------------------------- /layerNormedGRU.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import tensorflow as tf 3 | 4 | 5 | class layerNormedGRU(tf.contrib.rnn.RNNCell): 6 | 7 | def __init__( 8 | self, size, activation=tf.tanh, reuse=None, 9 | normalizer=tf.contrib.layers.layer_norm, 10 | initializer=tf.contrib.layers.xavier_initializer()): 11 | super(layerNormedGRU, self).__init__(_reuse=reuse) 12 | self._size = size 13 | self._activation = activation 14 | self._normalizer = normalizer 15 | self._initializer = initializer 16 | 17 | @property 18 | def state_size(self): 19 | return self._size 20 | 21 | @property 22 | def output_size(self): 23 | return self._size 24 | 25 | def call(self, input_, state): 26 | update, reset = tf.split(self._forward( 27 | 'update_reset', [state, input_], 2 * self._size, tf.nn.sigmoid, 28 | bias_initializer=tf.constant_initializer(-1.)), 2, 1) 29 | candidate = self._forward( 30 | 'candidate', [reset * state, input_], self._size, self._activation) 31 | state = (1 - update) * state + update * candidate 32 | return state, state 33 | 34 | def _forward(self, name, inputs, size, activation, **kwargs): 35 | with tf.variable_scope(name): 36 | return _forward( 37 | inputs, size, activation, normalizer=self._normalizer, 38 | weight_initializer=self._initializer, **kwargs) 39 | 40 | 41 | def _forward( 42 | inputs, size, activation, normalizer=tf.contrib.layers.layer_norm, 43 | weight_initializer=tf.contrib.layers.xavier_initializer(), 44 | bias_initializer=tf.zeros_initializer()): 45 | if not isinstance(inputs, (tuple, list)): 46 | inputs = (inputs,) 47 | shapes = [] 48 | outputs = [] 49 | # Map each input to individually normalize their outputs. 50 | for index, input_ in enumerate(inputs): 51 | shapes.append(input_.shape[1: -1].as_list()) 52 | input_ = tf.contrib.layers.flatten(input_) 53 | weight = tf.get_variable( 54 | 'weight_{}'.format(index + 1), (int(input_.shape[1]), size), 55 | tf.float32, weight_initializer) 56 | output = tf.matmul(input_, weight) 57 | if normalizer: 58 | output = normalizer(output) 59 | outputs.append(output) 60 | output = tf.reduce_mean(outputs, 0) 61 | # Add bias after normalization. 62 | bias = tf.get_variable( 63 | 'weight', (size,), tf.float32, bias_initializer) 64 | output += bias 65 | # Activation function. 66 | if activation: 67 | output = activation(output) 68 | # Restore shape dimensions that are consistent among inputs. 69 | min_dim = min(len(shape[1:]) for shape in shapes) 70 | dim_shapes = [[shape[dim] for shape in shapes] for dim in range(min_dim)] 71 | matching_dims = ''.join('NY'[len(set(x)) == 1] for x in dim_shapes) + 'N' 72 | agreement = matching_dims.index('N') 73 | remaining = sum(np.prod(shape[agreement:]) for shape in shapes) 74 | if agreement: 75 | batch_size = output.shape[0].value or -1 76 | shape = [batch_size] + shapes[:agreement] + [remaining] 77 | output = tf.reshape(output, shape) 78 | return output 79 | -------------------------------------------------------------------------------- /train901.py: -------------------------------------------------------------------------------- 1 | import os 2 | os.environ["CUDA_VISIBLE_DEVICES"] = input("Which GPU? ") 3 | import time 4 | import warnings 5 | warnings.filterwarnings("ignore", message="numpy.dtype size changed") 6 | warnings.filterwarnings("ignore", message="numpy.ufunc size changed") 7 | with warnings.catch_warnings(): 8 | warnings.simplefilter("ignore") 9 | import tensorflow as tf 10 | import numpy as np 11 | 12 | from lib.tools_batch import * 13 | from lib.tools_math import * 14 | from model901 import * 15 | 16 | def get_learningRate(step): 17 | # return max(4e-4*(0.99999**step), 2e-5) 18 | return 2e-4 19 | 20 | TEST_ROUND = 1 21 | BATCH_SIZE = 128 22 | TEST_SIZE = 16 23 | AUGMENTATION = True 24 | NUM_STEP = int(1e7) 25 | 26 | model_name = "v901" 27 | saving_period = 200 28 | num_labels = 407 29 | num_class = 409 30 | bg = BatchGetter("../data/data_aishell/wav", "../data/data_aishell/transcript/aishell_transcript_v0.8.txt", 31 | "lib/pinyinDictNoTone.pickle", "../data/backgrounds/", server = True) 32 | bg2 = BatchGetter("../data/youtube_subtitles/wav", "../data/youtube_subtitles/subs.txt", 33 | "lib/pinyinDictNoTone.pickle", "../data/backgrounds/", server = True) 34 | pyParser = pinyinParser("lib/pinyinDictNoTone.pickle") 35 | model = model(num_class) 36 | if model_name not in os.listdir('models/'): 37 | os.mkdir('models/'+model_name) 38 | 39 | gpu_options = tf.GPUOptions(allow_growth=True) 40 | with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options,allow_soft_placement=True,log_device_placement=False)) as sess: 41 | 42 | sess.run(tf.global_variables_initializer()) 43 | saver = tf.train.Saver() 44 | # tensorboard --logdir logs/ 45 | summary_writer = tf.summary.FileWriter(logdir = "logs", graph = tf.get_default_graph()) 46 | saver.restore(sess, "models/"+model_name+"/"+model_name+"_0.ckpt") 47 | 48 | for i in range(1, NUM_STEP+1): 49 | 50 | lr = get_learningRate(i) 51 | if i%2==0: 52 | xs, ys = bg.get_batch(BATCH_SIZE, batch_type = 'train') 53 | else: 54 | xs, ys = bg2.get_batch(BATCH_SIZE, batch_type = 'train') 55 | loss, summary = model.train(sess, lr, xs, ys) 56 | summary_writer.add_summary(summary, i) 57 | print(i, loss) 58 | 59 | if i%saving_period == 0: 60 | print("Learning rate =", lr) 61 | save_path = saver.save(sess, "models/"+model_name+"/"+model_name+"_"+str(int(i/50000))+".ckpt") 62 | print("Model saved in path: "+save_path) 63 | 64 | ave_loss = 0.0 65 | for i in range(2): 66 | if i==0: 67 | xs, ys = bg.get_batch(TEST_SIZE, batch_type = 'test', augmentation = False) 68 | else: 69 | xs, ys = bg2.get_batch(TEST_SIZE, batch_type = 'test', augmentation = False) 70 | loss = model.get_loss(sess, xs, ys) 71 | pred = model.predict(sess, xs)[0] 72 | report_accuracy(pred, ys, pyParser) 73 | ave_loss+=loss 74 | print("Test Loss = "+str(ave_loss/float(TEST_ROUND))) 75 | -------------------------------------------------------------------------------- /train902.py: -------------------------------------------------------------------------------- 1 | import os 2 | os.environ["CUDA_VISIBLE_DEVICES"] = input("Which GPU? ") 3 | import time 4 | import warnings 5 | warnings.filterwarnings("ignore", message="numpy.dtype size changed") 6 | warnings.filterwarnings("ignore", message="numpy.ufunc size changed") 7 | with warnings.catch_warnings(): 8 | warnings.simplefilter("ignore") 9 | import tensorflow as tf 10 | import numpy as np 11 | 12 | from lib.tools_batch import * 13 | from lib.tools_math import * 14 | from model902 import * 15 | 16 | def get_learningRate(step): 17 | # return max(4e-4*(0.99999**step), 2e-5) 18 | return 2e-4 19 | 20 | TEST_ROUND = 1 21 | BATCH_SIZE = 64 22 | TEST_SIZE = 16 23 | AUGMENTATION = True 24 | NUM_STEP = int(1e7) 25 | 26 | model_name = "v902" 27 | saving_period = 200 28 | num_labels = 407 29 | num_class = 409 30 | bg = BatchGetter("../data/data_aishell/wav", "../data/data_aishell/transcript/aishell_transcript_v0.8.txt", 31 | "lib/pinyinDictNoTone.pickle", "../data/backgrounds/", server = True) 32 | bg2 = BatchGetter("../data/youtube_subtitles/wav", "../data/youtube_subtitles/subs.txt", 33 | "lib/pinyinDictNoTone.pickle", "../data/backgrounds/", server = True) 34 | pyParser = pinyinParser("lib/pinyinDictNoTone.pickle") 35 | model = model(num_class) 36 | if model_name not in os.listdir('models/'): 37 | os.mkdir('models/'+model_name) 38 | 39 | gpu_options = tf.GPUOptions(allow_growth=True) 40 | with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options,allow_soft_placement=True,log_device_placement=False)) as sess: 41 | 42 | sess.run(tf.global_variables_initializer()) 43 | saver = tf.train.Saver() 44 | # tensorboard --logdir logs/ 45 | summary_writer = tf.summary.FileWriter(logdir = "logs", graph = tf.get_default_graph()) 46 | saver.restore(sess, "models/"+model_name+"/"+model_name+"_0.ckpt") 47 | 48 | for i in range(1, NUM_STEP+1): 49 | 50 | lr = get_learningRate(i) 51 | if i%2==0: 52 | xs, ys = bg.get_batch(BATCH_SIZE, batch_type = 'train') 53 | else: 54 | xs, ys = bg2.get_batch(BATCH_SIZE, batch_type = 'train') 55 | loss, summary = model.train(sess, lr, xs, ys) 56 | summary_writer.add_summary(summary, i) 57 | print(i, loss) 58 | 59 | if i%saving_period == 0: 60 | print("Learning rate =", lr) 61 | save_path = saver.save(sess, "models/"+model_name+"/"+model_name+"_"+str(int(i/50000))+".ckpt") 62 | print("Model saved in path: "+save_path) 63 | 64 | ave_loss = 0.0 65 | for i in range(2): 66 | if i==0: 67 | xs, ys = bg.get_batch(TEST_SIZE, batch_type = 'test', augmentation = False) 68 | else: 69 | xs, ys = bg2.get_batch(TEST_SIZE, batch_type = 'test', augmentation = False) 70 | loss = model.get_loss(sess, xs, ys) 71 | pred = model.predict(sess, xs)[0] 72 | report_accuracy(pred, ys, pyParser) 73 | ave_loss+=loss 74 | print("Test Loss = "+str(ave_loss/float(TEST_ROUND))) 75 | -------------------------------------------------------------------------------- /train903.py: -------------------------------------------------------------------------------- 1 | import os 2 | os.environ["CUDA_VISIBLE_DEVICES"] = input("Which GPU? ") 3 | import time 4 | import warnings 5 | warnings.filterwarnings("ignore", message="numpy.dtype size changed") 6 | warnings.filterwarnings("ignore", message="numpy.ufunc size changed") 7 | with warnings.catch_warnings(): 8 | warnings.simplefilter("ignore") 9 | import tensorflow as tf 10 | import numpy as np 11 | 12 | from lib.tools_batch import * 13 | from lib.tools_math import * 14 | from model903 import * 15 | 16 | def get_learningRate(step): 17 | # return max(4e-4*(0.99999**step), 2e-5) 18 | return 2e-4 19 | 20 | TEST_ROUND = 1 21 | BATCH_SIZE = 32 22 | TEST_SIZE = 16 23 | AUGMENTATION = True 24 | NUM_STEP = int(1e7) 25 | 26 | model_name = "v903" 27 | saving_period = 200 28 | num_labels = 407 29 | num_class = 409 30 | bg = BatchGetter("../data/data_aishell/wav", "../data/data_aishell/transcript/aishell_transcript_v0.8.txt", 31 | "lib/pinyinDictNoTone.pickle", "../data/backgrounds/", server = True) 32 | bg2 = BatchGetter("../data/youtube_subtitles/wav", "../data/youtube_subtitles/subs.txt", 33 | "lib/pinyinDictNoTone.pickle", "../data/backgrounds/", server = True) 34 | pyParser = pinyinParser("lib/pinyinDictNoTone.pickle") 35 | model = model(num_class) 36 | if model_name not in os.listdir('models/'): 37 | os.mkdir('models/'+model_name) 38 | 39 | gpu_options = tf.GPUOptions(allow_growth=True) 40 | with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options,allow_soft_placement=True,log_device_placement=False)) as sess: 41 | 42 | sess.run(tf.global_variables_initializer()) 43 | saver = tf.train.Saver() 44 | # tensorboard --logdir logs/ 45 | summary_writer = tf.summary.FileWriter(logdir = "logs", graph = tf.get_default_graph()) 46 | saver.restore(sess, "models/"+model_name+"/"+model_name+"_0.ckpt") 47 | 48 | for i in range(1, NUM_STEP+1): 49 | 50 | lr = get_learningRate(i) 51 | if i%2==0: 52 | xs, ys = bg.get_batch(BATCH_SIZE, batch_type = 'train') 53 | else: 54 | xs, ys = bg2.get_batch(BATCH_SIZE, batch_type = 'train') 55 | loss, summary = model.train(sess, lr, xs, ys) 56 | summary_writer.add_summary(summary, i) 57 | print(i, loss) 58 | 59 | if i%saving_period == 0: 60 | print("Learning rate =", lr) 61 | save_path = saver.save(sess, "models/"+model_name+"/"+model_name+"_"+str(int(i/50000))+".ckpt") 62 | print("Model saved in path: "+save_path) 63 | 64 | ave_loss = 0.0 65 | for i in range(2): 66 | if i==0: 67 | xs, ys = bg.get_batch(TEST_SIZE, batch_type = 'test', augmentation = False) 68 | else: 69 | xs, ys = bg2.get_batch(TEST_SIZE, batch_type = 'test', augmentation = False) 70 | loss = model.get_loss(sess, xs, ys) 71 | pred = model.predict(sess, xs)[0] 72 | report_accuracy(pred, ys, pyParser) 73 | ave_loss+=loss 74 | print("Test Loss = "+str(ave_loss/float(TEST_ROUND))) 75 | -------------------------------------------------------------------------------- /lib/recorder.py: -------------------------------------------------------------------------------- 1 | import pyaudio 2 | import wave 3 | 4 | class Recorder(object): 5 | '''A recorder class for recording audio to a WAV file. 6 | Records in mono by default. 7 | ''' 8 | 9 | def __init__(self, channels=1, rate=44100, frames_per_buffer=1024): 10 | self.channels = channels 11 | self.rate = rate 12 | self.frames_per_buffer = frames_per_buffer 13 | 14 | def open(self, fname, mode='wb'): 15 | return RecordingFile(fname, mode, self.channels, self.rate, 16 | self.frames_per_buffer) 17 | 18 | class RecordingFile(object): 19 | def __init__(self, fname, mode, channels, 20 | rate, frames_per_buffer): 21 | self.fname = fname 22 | self.mode = mode 23 | self.channels = channels 24 | self.rate = rate 25 | self.frames_per_buffer = frames_per_buffer 26 | self._pa = pyaudio.PyAudio() 27 | self.wavefile = self._prepare_file(self.fname, self.mode) 28 | self._stream = None 29 | 30 | def __enter__(self): 31 | return self 32 | 33 | def __exit__(self, exception, value, traceback): 34 | self.close() 35 | 36 | def record(self, duration): 37 | # Use a stream with no callback function in blocking mode 38 | self._stream = self._pa.open(format=pyaudio.paInt16, 39 | channels=self.channels, 40 | rate=self.rate, 41 | input=True, 42 | frames_per_buffer=self.frames_per_buffer) 43 | for _ in range(int(self.rate / self.frames_per_buffer * duration)): 44 | audio = self._stream.read(self.frames_per_buffer) 45 | self.wavefile.writeframes(audio) 46 | return None 47 | 48 | def start_recording(self): 49 | # Use a stream with a callback in non-blocking mode 50 | self._stream = self._pa.open(format=pyaudio.paInt16, 51 | channels=self.channels, 52 | rate=self.rate, 53 | input=True, 54 | frames_per_buffer=self.frames_per_buffer, 55 | stream_callback=self.get_callback()) 56 | self._stream.start_stream() 57 | return self 58 | 59 | def stop_recording(self): 60 | self._stream.stop_stream() 61 | return self 62 | 63 | def get_callback(self): 64 | def callback(in_data, frame_count, time_info, status): 65 | self.wavefile.writeframes(in_data) 66 | return in_data, pyaudio.paContinue 67 | return callback 68 | 69 | 70 | def close(self): 71 | self._stream.close() 72 | self._pa.terminate() 73 | self.wavefile.close() 74 | 75 | def _prepare_file(self, fname, mode='wb'): 76 | wavefile = wave.open(fname, mode) 77 | wavefile.setnchannels(self.channels) 78 | wavefile.setsampwidth(self._pa.get_sample_size(pyaudio.paInt16)) 79 | wavefile.setframerate(self.rate) 80 | return wavefile 81 | -------------------------------------------------------------------------------- /lib/tools_audio.py: -------------------------------------------------------------------------------- 1 | import scipy.io.wavfile as wav 2 | import numpy as np 3 | import os 4 | import pydub 5 | import tempfile 6 | import scipy 7 | import random 8 | from python_speech_features import logfbank 9 | 10 | from lib.tools_math import * 11 | 12 | def changeRateTo16000(filepath): 13 | if filepath[-4:].lower() =='.wav': 14 | sound = pydub.AudioSegment.from_wav(filepath) 15 | sound = sound.set_frame_rate(16000) 16 | sound.export(filepath, format="wav") 17 | elif filepath[-4:].lower() =='.m4a': 18 | sound = pydub.AudioSegment.from_file(filepath, "m4a") 19 | sound = sound.set_frame_rate(16000) 20 | sound.export(filepath[:-3]+"wav", format="wav") 21 | elif filepath[-4:].lower() =='.mp3': 22 | sound = pydub.AudioSegment.from_mp3(filepath) 23 | sound = sound.set_frame_rate(16000) 24 | sound.export(filepath[:-3]+"wav", format="wav") 25 | else: 26 | print("Unsupported Format.") 27 | 28 | def read_wav(file_path): 29 | assert file_path[-4:]=='.wav' 30 | rate, data = wav.read(file_path) 31 | return rate, data 32 | 33 | def read_m4a(file_path): 34 | path, ext = os.path.splitext(file_path) 35 | assert ext=='.m4a' 36 | aac_version = pydub.AudioSegment.from_file(file_path, "m4a") 37 | _, path = tempfile.mkstemp() 38 | aac_version.export(path, format="wav") 39 | rate, data = scipy.io.wavfile.read(path) 40 | os.remove(path) 41 | return rate, data 42 | 43 | def read_mp3(file_path): 44 | path, ext = os.path.splitext(file_path) 45 | assert ext=='.mp3' 46 | mp3 = pydub.AudioSegment.from_mp3(file_path) 47 | _, path = tempfile.mkstemp() 48 | mp3.export(path, format="wav") 49 | rate, data = scipy.io.wavfile.read(path) 50 | os.remove(path) 51 | return rate, data 52 | 53 | def mp3_to_wav(file_path, obj_path): 54 | path, ext = os.path.splitext(file_path) 55 | assert ext=='.mp3' 56 | mp3 = pydub.AudioSegment.from_mp3(file_path) 57 | mp3.export(obj_path, format="wav") 58 | 59 | def mergeChannels(data): 60 | data = normalize(data) 61 | if len(data.shape)==1: 62 | return data 63 | if len(data.shape)==2: 64 | return np.mean(data, axis = 1) 65 | raise ValueError("This is not what an audio file ought to be!") 66 | 67 | def getDefaultSpectrogram(rate, data): 68 | f, t, Sxx = signal.spectrogram(data, fs=rate, window='hamming', nperseg=400, noverlap=240, nfft=1024, scaling='spectrum', return_onesided=True) 69 | return Sxx 70 | 71 | def frame_split(data, frame_width, frame_step): 72 | if len(data)= num data points in one window(frame) 85 | if wav_process == True: 86 | frame_shift = int(sr * winstep) 87 | frame_size = int(sr * winlen) 88 | wave_data, index = librosa.effects.trim(wave_data, frame_length=frame_size, hop_length=frame_shift) 89 | mel_db = logfbank(wave_data, samplerate=sr, winlen=winlen, winstep=winstep, 90 | nfilt=num_mel, nfft=nfft, lowfreq=0, highfreq=None, preemph=0.97) 91 | mel_db -= (np.mean(mel_db,axis=1).reshape(-1,1)+1e-8) 92 | return mel_db 93 | -------------------------------------------------------------------------------- /model901.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | from layerNormedGRU import layerNormedGRU 4 | 5 | class model: 6 | 7 | def __init__(self, num_class, topk_paths = 10): 8 | self.xs = tf.placeholder(tf.float32, [None, 1000, 161]) 9 | self.ys = tf.sparse_placeholder(tf.int32) 10 | self.learning_rate = tf.placeholder(tf.float32) 11 | self.seq_len = tf.placeholder(tf.int32, [None]) 12 | self.isTrain = tf.placeholder(tf.bool, name='phase') 13 | 14 | xs_input = tf.expand_dims(self.xs, 3) 15 | 16 | conv1 = self._nn_conv_bn_layer(xs_input, 'conv_1', [11, 41, 1, 32], [3, 2]) 17 | conv2 = self._nn_conv_bn_layer(conv1, 'conv_2', [11, 21, 32, 32], [1, 2]) 18 | conv_out = tf.reshape(conv2, [-1, 334, 41*32]) 19 | biRNN1 = self._biRNN_bn_layer(conv_out, 'biRNN_1', 256) 20 | biRNN2 = self._biRNN_bn_layer(biRNN1, 'biRNN_2', 256) 21 | biRNN3 = self._biRNN_bn_layer(biRNN2, 'biRNN_3', 256) 22 | 23 | self.phonemes = tf.layers.dense(biRNN3, num_class) 24 | 25 | # Notes: tf.nn.ctc_loss performs the softmax operation for you, so 26 | # inputs should be e.g. linear projections of outputs by an LSTM. 27 | self.loss = tf.reduce_mean(tf.nn.ctc_loss(labels=self.ys, inputs=self.phonemes, sequence_length=self.seq_len, 28 | ignore_longer_outputs_than_inputs=True, time_major=False)) 29 | 30 | optimizer = tf.train.AdamOptimizer(self.learning_rate, beta1 = 0.6, beta2 = 0.8) 31 | update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 32 | with tf.control_dependencies(update_ops): 33 | gvs = optimizer.compute_gradients(self.loss) 34 | capped_gvs = [(tf.clip_by_value(grad, -400., 400.), var) for grad, var in gvs if grad is not None] 35 | self.train_op = optimizer.apply_gradients(capped_gvs) 36 | 37 | self.prediction, log_prob = tf.nn.ctc_beam_search_decoder(tf.transpose(self.phonemes,[1,0,2]), self.seq_len, top_paths=topk_paths, merge_repeated=False) 38 | 39 | self.loss_summary = tf.summary.scalar("loss", self.loss) 40 | self.merged = tf.summary.merge_all() 41 | 42 | def _nn_conv_bn_layer(self, inputs, scope, shape, strides): 43 | with tf.variable_scope(scope): 44 | W_conv = tf.get_variable("W", shape=shape, initializer=tf.contrib.layers.xavier_initializer()) 45 | h_conv = tf.nn.conv2d(inputs, W_conv, strides=[1, strides[0], strides[1], 1], padding='SAME', name="conv2d") 46 | b = tf.get_variable("bias" , shape=[shape[3]], initializer=tf.contrib.layers.xavier_initializer()) 47 | h_bn = tf.layers.batch_normalization(h_conv+b, training = self.isTrain) 48 | h_relu = tf.nn.relu6(h_bn, name="relu6") 49 | return h_relu 50 | 51 | def _biRNN_bn_layer(self, input, scope, hidden_units, cell = "LayerNormedGRU"): 52 | with tf.variable_scope(scope): 53 | if cell == 'GRU': 54 | fw_cell = tf.nn.rnn_cell.GRUCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 55 | bw_cell = tf.nn.rnn_cell.GRUCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 56 | elif cell == 'LSTM': 57 | fw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 58 | bw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 59 | elif cell == 'vanila': 60 | fw_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 61 | bw_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 62 | elif cell == 'LayerNormedGRU': 63 | with tf.variable_scope('fw_cell'): 64 | fw_cell = layerNormedGRU(hidden_units, activation=tf.nn.relu) 65 | with tf.variable_scope('bw_cell'): 66 | bw_cell = layerNormedGRU(hidden_units, activation=tf.nn.relu) 67 | else: 68 | raise ValueError("Invalid cell type: "+str(cell)) 69 | 70 | (output_fw, output_bw), _ = tf.nn.bidirectional_dynamic_rnn(fw_cell, bw_cell, input, dtype=tf.float32, scope="bi_dynamic_rnn") 71 | # output_fw_bn = tf.layers.batch_normalization(output_fw, training = self.isTrain, name = 'output_fw_bn') 72 | # output_bw_bn = tf.layers.batch_normalization(output_bw, training = self.isTrain, name = 'output_bw_bn') 73 | # bilstm_outputs_concat_1 = tf.concat([output_fw_bn, output_bw_bn], 2) 74 | bilstm_outputs_concat_1 = tf.concat([output_fw, output_bw], 2) 75 | return bilstm_outputs_concat_1 76 | 77 | def train(self, sess, learning_rate, xs, ys): 78 | _, loss, summary = sess.run([self.train_op, self.loss, self.merged], feed_dict = {self.isTrain: True, self.learning_rate: learning_rate, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs, self.ys: ys}) 79 | return loss, summary 80 | 81 | def get_loss(self, sess, xs, ys): 82 | loss = sess.run(self.loss, feed_dict = {self.isTrain: False, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs, self.ys: ys}) 83 | return loss 84 | 85 | def predict(self, sess, xs): 86 | prediction = sess.run(self.prediction, feed_dict = {self.isTrain: False, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs}) 87 | return prediction 88 | -------------------------------------------------------------------------------- /model902.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | from layerNormedGRU import layerNormedGRU 4 | 5 | class model: 6 | 7 | def __init__(self, num_class, topk_paths = 10): 8 | self.xs = tf.placeholder(tf.float32, [None, 1000, 161]) 9 | self.ys = tf.sparse_placeholder(tf.int32) 10 | self.learning_rate = tf.placeholder(tf.float32) 11 | self.seq_len = tf.placeholder(tf.int32, [None]) 12 | self.isTrain = tf.placeholder(tf.bool, name='phase') 13 | 14 | xs_input = tf.expand_dims(self.xs, 3) 15 | 16 | conv1 = self._nn_conv_bn_layer(xs_input, 'conv_1', [11, 41, 1, 32], [3, 2]) 17 | conv2 = self._nn_conv_bn_layer(conv1, 'conv_2', [11, 21, 32, 64], [1, 2]) 18 | conv_out = tf.reshape(conv2, [-1, 334, 41*64]) 19 | biRNN1 = self._biRNN_bn_layer(conv_out, 'biRNN_1', 256) 20 | biRNN2 = self._biRNN_bn_layer(biRNN1, 'biRNN_2', 256) 21 | biRNN3 = self._biRNN_bn_layer(biRNN2, 'biRNN_3', 256) 22 | biRNN4 = self._biRNN_bn_layer(biRNN3, 'biRNN_4', 256) 23 | biRNN5 = self._biRNN_bn_layer(biRNN4, 'biRNN_5', 256) 24 | 25 | self.phonemes = tf.layers.dense(biRNN5, num_class) 26 | 27 | # Notes: tf.nn.ctc_loss performs the softmax operation for you, so 28 | # inputs should be e.g. linear projections of outputs by an LSTM. 29 | self.loss = tf.reduce_mean(tf.nn.ctc_loss(labels=self.ys, inputs=self.phonemes, sequence_length=self.seq_len, 30 | ignore_longer_outputs_than_inputs=True, time_major=False)) 31 | 32 | optimizer = tf.train.AdamOptimizer(self.learning_rate, beta1=0.7, beta2=0.9) 33 | update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 34 | with tf.control_dependencies(update_ops): 35 | gvs = optimizer.compute_gradients(self.loss) 36 | capped_gvs = [(tf.clip_by_value(grad, -400., 400.), var) for grad, var in gvs if grad is not None] 37 | self.train_op = optimizer.apply_gradients(capped_gvs) 38 | 39 | self.prediction, log_prob = tf.nn.ctc_beam_search_decoder(tf.transpose(self.phonemes,[1,0,2]), self.seq_len, top_paths=topk_paths, merge_repeated=False) 40 | 41 | self.loss_summary = tf.summary.scalar("loss", self.loss) 42 | self.merged = tf.summary.merge_all() 43 | 44 | def _nn_conv_bn_layer(self, inputs, scope, shape, strides): 45 | with tf.variable_scope(scope): 46 | W_conv = tf.get_variable("W", shape=shape, initializer=tf.contrib.layers.xavier_initializer()) 47 | h_conv = tf.nn.conv2d(inputs, W_conv, strides=[1, strides[0], strides[1], 1], padding='SAME', name="conv2d") 48 | b = tf.get_variable("bias" , shape=[shape[3]], initializer=tf.contrib.layers.xavier_initializer()) 49 | h_bn = tf.layers.batch_normalization(h_conv+b, training = self.isTrain) 50 | h_relu = tf.nn.relu6(h_bn, name="relu6") 51 | return h_relu 52 | 53 | def _biRNN_bn_layer(self, input, scope, hidden_units, cell = "LayerNormedGRU"): 54 | with tf.variable_scope(scope): 55 | if cell == 'GRU': 56 | fw_cell = tf.nn.rnn_cell.GRUCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 57 | bw_cell = tf.nn.rnn_cell.GRUCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 58 | elif cell == 'LSTM': 59 | fw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 60 | bw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 61 | elif cell == 'vanila': 62 | fw_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 63 | bw_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 64 | elif cell == 'LayerNormedGRU': 65 | with tf.variable_scope('fw_cell'): 66 | fw_cell = layerNormedGRU(hidden_units, activation=tf.nn.relu) 67 | with tf.variable_scope('bw_cell'): 68 | bw_cell = layerNormedGRU(hidden_units, activation=tf.nn.relu) 69 | else: 70 | raise ValueError("Invalid cell type: "+str(cell)) 71 | 72 | (output_fw, output_bw), _ = tf.nn.bidirectional_dynamic_rnn(fw_cell, bw_cell, input, dtype=tf.float32, scope="bi_dynamic_rnn") 73 | # output_fw_bn = tf.layers.batch_normalization(output_fw, training = self.isTrain, name = 'output_fw_bn') 74 | # output_bw_bn = tf.layers.batch_normalization(output_bw, training = self.isTrain, name = 'output_bw_bn') 75 | # bilstm_outputs_concat_1 = tf.concat([output_fw_bn, output_bw_bn], 2) 76 | bilstm_outputs_concat_1 = tf.concat([output_fw, output_bw], 2) 77 | return bilstm_outputs_concat_1 78 | 79 | def train(self, sess, learning_rate, xs, ys): 80 | _, loss, summary = sess.run([self.train_op, self.loss, self.merged], feed_dict = {self.isTrain: True, self.learning_rate: learning_rate, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs, self.ys: ys}) 81 | return loss, summary 82 | 83 | def get_loss(self, sess, xs, ys): 84 | loss = sess.run(self.loss, feed_dict = {self.isTrain: False, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs, self.ys: ys}) 85 | return loss 86 | 87 | def predict(self, sess, xs): 88 | prediction = sess.run(self.prediction, feed_dict = {self.isTrain: False, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs}) 89 | return prediction 90 | -------------------------------------------------------------------------------- /model903.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | from layerNormedGRU import layerNormedGRU 4 | 5 | class model: 6 | 7 | def __init__(self, num_class, topk_paths = 10): 8 | self.xs = tf.placeholder(tf.float32, [None, 1000, 161]) 9 | self.ys = tf.sparse_placeholder(tf.int32) 10 | self.learning_rate = tf.placeholder(tf.float32) 11 | self.seq_len = tf.placeholder(tf.int32, [None]) 12 | self.isTrain = tf.placeholder(tf.bool, name='phase') 13 | 14 | xs_input = tf.expand_dims(self.xs, 3) 15 | 16 | conv1 = self._nn_conv_bn_layer(xs_input, 'conv_1', [11, 41, 1, 32], [3, 2]) 17 | conv2 = self._nn_conv_bn_layer(conv1, 'conv_2', [11, 21, 32, 64], [1, 2]) 18 | conv_out = tf.reshape(conv2, [-1, 334, 41*64]) 19 | biRNN1 = self._biRNN_bn_layer(conv_out, 'biRNN_1', 1024) 20 | biRNN2 = self._biRNN_bn_layer(biRNN1, 'biRNN_2', 1024) 21 | biRNN3 = self._biRNN_bn_layer(biRNN2, 'biRNN_3', 1024) 22 | biRNN4 = self._biRNN_bn_layer(biRNN3, 'biRNN_4', 1024) 23 | biRNN5 = self._biRNN_bn_layer(biRNN4, 'biRNN_5', 1024) 24 | 25 | self.phonemes = tf.layers.dense(biRNN5, num_class) 26 | 27 | # Notes: tf.nn.ctc_loss performs the softmax operation for you, so 28 | # inputs should be e.g. linear projections of outputs by an LSTM. 29 | self.loss = tf.reduce_mean(tf.nn.ctc_loss(labels=self.ys, inputs=self.phonemes, sequence_length=self.seq_len, 30 | ignore_longer_outputs_than_inputs=True, time_major=False)) 31 | 32 | optimizer = tf.train.AdamOptimizer(self.learning_rate, beta1=0.7, beta2=0.9) 33 | update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 34 | with tf.control_dependencies(update_ops): 35 | gvs = optimizer.compute_gradients(self.loss) 36 | capped_gvs = [(tf.clip_by_value(grad, -400., 400.), var) for grad, var in gvs if grad is not None] 37 | self.train_op = optimizer.apply_gradients(capped_gvs) 38 | 39 | self.prediction, log_prob = tf.nn.ctc_beam_search_decoder(tf.transpose(self.phonemes,[1,0,2]), self.seq_len, top_paths=topk_paths, merge_repeated=False) 40 | 41 | self.loss_summary = tf.summary.scalar("loss", self.loss) 42 | self.merged = tf.summary.merge_all() 43 | 44 | def _nn_conv_bn_layer(self, inputs, scope, shape, strides): 45 | with tf.variable_scope(scope): 46 | W_conv = tf.get_variable("W", shape=shape, initializer=tf.contrib.layers.xavier_initializer()) 47 | h_conv = tf.nn.conv2d(inputs, W_conv, strides=[1, strides[0], strides[1], 1], padding='SAME', name="conv2d") 48 | b = tf.get_variable("bias" , shape=[shape[3]], initializer=tf.contrib.layers.xavier_initializer()) 49 | h_bn = tf.layers.batch_normalization(h_conv+b, training = self.isTrain) 50 | h_relu = tf.nn.relu6(h_bn, name="relu6") 51 | return h_relu 52 | 53 | def _biRNN_bn_layer(self, input, scope, hidden_units, cell = "LayerNormedGRU"): 54 | with tf.variable_scope(scope): 55 | if cell == 'GRU': 56 | fw_cell = tf.nn.rnn_cell.GRUCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 57 | bw_cell = tf.nn.rnn_cell.GRUCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 58 | elif cell == 'LSTM': 59 | fw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 60 | bw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 61 | elif cell == 'vanila': 62 | fw_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_units, activation=tf.nn.relu, name = 'fw_cell') 63 | bw_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_units, activation=tf.nn.relu, name = 'bw_cell') 64 | elif cell == 'LayerNormedGRU': 65 | with tf.variable_scope('fw_cell'): 66 | fw_cell = layerNormedGRU(hidden_units, activation=tf.nn.relu) 67 | with tf.variable_scope('bw_cell'): 68 | bw_cell = layerNormedGRU(hidden_units, activation=tf.nn.relu) 69 | else: 70 | raise ValueError("Invalid cell type: "+str(cell)) 71 | 72 | (output_fw, output_bw), _ = tf.nn.bidirectional_dynamic_rnn(fw_cell, bw_cell, input, dtype=tf.float32, scope="bi_dynamic_rnn") 73 | # output_fw_bn = tf.layers.batch_normalization(output_fw, training = self.isTrain, name = 'output_fw_bn') 74 | # output_bw_bn = tf.layers.batch_normalization(output_bw, training = self.isTrain, name = 'output_bw_bn') 75 | # bilstm_outputs_concat_1 = tf.concat([output_fw_bn, output_bw_bn], 2) 76 | bilstm_outputs_concat_1 = tf.concat([output_fw, output_bw], 2) 77 | return bilstm_outputs_concat_1 78 | 79 | def train(self, sess, learning_rate, xs, ys): 80 | _, loss, summary = sess.run([self.train_op, self.loss, self.merged], feed_dict = {self.isTrain: True, self.learning_rate: learning_rate, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs, self.ys: ys}) 81 | return loss, summary 82 | 83 | def get_loss(self, sess, xs, ys): 84 | loss = sess.run(self.loss, feed_dict = {self.isTrain: False, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs, self.ys: ys}) 85 | return loss 86 | 87 | def predict(self, sess, xs): 88 | prediction = sess.run(self.prediction, feed_dict = {self.isTrain: False, self.seq_len: np.ones(xs.shape[0])*334, self.xs: xs}) 89 | return prediction 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 中文语音识别 2 | 3 | by 4 | 5 | ``` 6 | _____ _ __ __ _ _ 7 | / ____| | | \/ (_) (_) 8 | | | | |__ ___ _ __ | \ / |_ _ __ __ ___ ___ __ _ _ __ __ _ 9 | | | | '_ \ / _ \ '_ \ | |\/| | | '_ \ / _` \ \/ / |/ _` | '_ \ / _` | 10 | | |____| | | | __/ | | |_ | | | | | | | | (_| |> <| | (_| | | | | (_| | 11 | \_____|_| |_|\___|_| |_( ) |_| |_|_|_| |_|\__, /_/\_\_|\__,_|_| |_|\__, | 12 | |/ __/ | __/ | 13 | |___/ |___/ 14 | 15 | Email: chenmingxiang110@gmail.com 16 | ``` 17 | 18 | ## 更新 2020.06.23 19 | 20 | 一些朋友提到,将拼音转换成文字时,国内使用谷歌拼音输入法不太方便。我这里根据 wyf19941128 的建议,新写了通过谷歌翻译将拼音转成汉字的方案(国内访问谷歌翻译无需科学上网),所需代码附在 ./alternative 文件夹下。以下是一个实现转换的例子: 21 | 22 | ``` 23 | from Pinyin2SimplifiedChinese import * 24 | 25 | t = translator() 26 | print(t.translate("jin tian tian qi zhen bu cuo")) # return "今天天气真不错" 27 | ``` 28 | 29 | ## 模型简介 30 | 31 | 模型输入是一段不长于10秒钟的语音,模型的输出是该语音所对应的拼音标签。本项目使用python 3.6为主要编程语言。 32 | 33 | 模型参考了Baidu Deep Speech 2:http://proceedings.mlr.press/v48/amodei16.pdf 34 | 35 | 使用了CNN+GRU+CTC_loss的结构 36 | 37 | ## 训练数据 38 | 39 | 所用的训练数据包含两个部分: 40 | 41 | 1. aishell-1语音数据集 42 | 43 | AISHELL-ASR0009-OS1录音时长178小时,约14万条语音数据,下载地址:http://www.aishelltech.com/kysjcp 44 | 45 | 2. YouTube视频及对应字幕文件 46 | 47 | 从YouTube上获取MP4视频文件后转化成wav音频,同时使用对应的srt字幕文件作为target。总计时长大约120小时,有约20万条语音数据。数据量过大,且有版权归属问题,所以暂时不提供公开下载渠道。 48 | 49 | ## 使用方法 50 | 51 | ### 1. 训练模型 52 | 53 | 根据实际需求和硬件情况,可以选择需要的模型进行训练和调试。各个模型区别如下。如果在含GPU的机器上进行模型训练,直接运行 train901.py,train902.py,或者train903.py 即可。如果是在CPU上训练,则运行 train901_cpu.py,train902_cpu.py,或者train903_cpu.py。 54 | 55 | |模型名称 |CNN层数 |GRU层数 |GRU维度 |训练时间 | 56 | |--- |--- |--- |--- |--- | 57 | |901|2|3|256 |约30小时| 58 | |902|2|5|256 |约55小时| 59 | |903|2|5|1024|约130小时| 60 | 61 | 这里的训练时间仅仅是一个大概的统计,训练使用一块Tesla V100完成。 62 | 63 | model 903 链接: https://pan.baidu.com/s/1NcTN8gojuIBaIFT9FB3EJw 密码: 261u 64 | 65 | model 902 链接: https://pan.baidu.com/s/1do7C6Egj6sJO7kn1yHPzBg 密码: 9o87 66 | 67 | model 901 链接: https://pan.baidu.com/s/1utz-1Vv4IO9D-3awj3x1QQ 密码: pv08 68 | 69 | 下载后放在model文件夹下。 70 | 71 | ### 2. 识别音频 72 | 73 | 1. 初始化模型并加载必要的工具 74 | 75 | ``` 76 | import os 77 | import time 78 | import warnings 79 | warnings.filterwarnings("ignore", message="numpy.dtype size changed") 80 | warnings.filterwarnings("ignore", message="numpy.ufunc size changed") 81 | with warnings.catch_warnings(): 82 | warnings.simplefilter("ignore") 83 | import tensorflow as tf 84 | import numpy as np 85 | from urllib.request import urlopen 86 | 87 | from lib.tools_batch import * 88 | from lib.tools_math import * 89 | from lib.tools_sparse import * 90 | from lib.tools_audio import * 91 | from lib.contrib.audio_featurizer import AudioFeaturizer 92 | from lib.contrib.audio import AudioSegment 93 | 94 | # 根据你所使用的模型修改这两行 95 | from model903 import * 96 | model_name = "v903" 97 | 98 | pyParser = pinyinParser("lib/pinyinDictNoTone.pickle") 99 | af = AudioFeaturizer() 100 | model = model(409) 101 | ``` 102 | 103 | 2. 初始化session并reload已经训练好的模型 104 | 105 | ``` 106 | sess = tf.Session() 107 | saver = tf.train.Saver() 108 | saver.restore(sess, "models/"+model_name+"/"+model_name+"_0.ckpt") 109 | ``` 110 | 111 | 3. 读取音频并转化格式 112 | 113 | ``` 114 | rate, data = read_wav("data/test.wav") 115 | data = mergeChannels(data) 116 | data = zero_padding_1d(data, 160240) 117 | a_seg = AudioSegment(data, rate) 118 | xs = np.transpose(np.array([af.featurize(a_seg)]), [0,2,1]) 119 | ``` 120 | 121 | 4. 预测并转化成拼音 122 | 123 | ``` 124 | pred = model.predict(sess, xs)[0] 125 | pred_dense = sparseTuples2dense(pred) 126 | detected_line = [] 127 | for stuff in pred_dense[0]: 128 | if stuff!=-1: 129 | detected_line.append(stuff) 130 | pinyin = pyParser.decodeIndices(detected_line, useUnderline = False) 131 | ``` 132 | 133 | 5. 转化成汉字 134 | 135 | ``` 136 | response = urlopen("https://www.google.com/inputtools/request?ime=pinyin&ie=utf-8&oe=utf-8&app=translate&num=10&text="+pinyin) 137 | html = response.read() 138 | result = (html.decode('utf8')).split(",")[2][2:-1] 139 | print(result) 140 | ``` 141 | 142 | 这里转化成汉字这一步使用了谷歌拼音输入法。如果有需要也可以使用自定义的词表/Markov Chain/seq2seq模型。如果使用词表来定制输入法,可以参考我的另外一个project:https://github.com/chenmingxiang110/SimpleChinese2 143 | 144 | ## 效果和demo 145 | 146 | ASR 应用场景十分多样。这里我做了一个自动添加字幕的demo,代码详见subtitle_demo.ipynb。一下为字幕添加效果。 147 | 148 | 1. 视频一,视频地址:https://www.youtube.com/watch?v=t5cPgIGNosc 149 | 150 | 左侧为自动添加的字幕,右侧为YouTuber人工手动添加的字幕 151 | 152 | ![Alt text](data/result_comparison_yixi.jpg) 153 | 154 | 2. 视频二,视频地址:https://www.youtube.com/watch?v=HLJJlQkY6ro 155 | 156 | 左侧为自动添加的字幕,右侧为YouTuber人工手动添加的字幕 157 | 158 | ![Alt text](data/result_comparison_zongli.jpg) 159 | 160 | 完整的字幕原文件和预测结果可以再data文件夹中找到。 161 | 162 | ``` 163 | _____ _ _ __ __ ___ __ __ _ _ _ 164 | |_ _| |_ __ _ _ _ | |__ \ \ / /__ _ _ | __|__ _ _ \ \ / /_ _| |_ __| |_ (_)_ _ __ _ 165 | | | | ' \/ _` | ' \| / / \ V / _ \ || | | _/ _ \ '_| \ \/\/ / _` | _/ _| ' \| | ' \/ _` | 166 | |_| |_||_\__,_|_||_|_\_\ |_|\___/\_,_| |_|\___/_| \_/\_/\__,_|\__\__|_||_|_|_||_\__, | 167 | |___/ 168 | _.. 169 | .qd$$$$bp. 170 | .q$$$$$$$$$$m. 171 | .$$$$$$$$$$$$$$ 172 | .q$$$$$$$$$$$$$$$$ 173 | .$$$$$$$$$$$$P\$$$$; 174 | .q$$$$$$$$$P^"_.`;$$$$ 175 | q$$$$$$$P;\ , /$$$$P 176 | .$$$P^::Y$/` _ .:.$$$/ 177 | .P.:.. \ `._.-:.. \$P 178 | $':. __.. : :.. :' 179 | /:_..::. `. .:. .'| 180 | _::.. T:.. / : 181 | .::.. J:.. : : 182 | .::.. 7:.. F:.. : ; 183 | _.::.. |:.. J:.. `./ 184 | _..:::.. /J:.. F:. : 185 | .::::.. .T \:.. J:. / 186 | /:::... .' `. \:.. F_o' 187 | .:::... .' \ \:.. J ; 188 | ::::... .-'`. _.`._\:.. \' 189 | ':::... .' `._7.-'_.- `\:. \ 190 | \:::... _..-'__.._/_.--' ,:. b:. \._ 191 | `::::..-"_.'-"_..--" :.. /):. `.\ 192 | `-:/"-7.--"" _::.-'P::.. \} 193 | _....------"""""" _..--".-' \::.. `. 194 | (::.. _...----""" _.-' `---:.. `-. 195 | \::.. _.-"""" `""""---"" `::...___) 196 | `\:._.-""" 197 | ``` 198 | -------------------------------------------------------------------------------- /lib/tools_batch.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import time 3 | import os 4 | # import logging 5 | from lib.tools_pinyin import * 6 | from lib.tools_audio import * 7 | from lib.tools_math import * 8 | from lib.tools_augmentation import * 9 | from lib.tools_sparse import * 10 | from lib.contrib.audio_featurizer import AudioFeaturizer 11 | from lib.contrib.audio import AudioSegment 12 | 13 | # logger = logging.getLogger(__file__) 14 | 15 | class BatchGetter: 16 | 17 | # If turn on the server option, save all the noise waves to RAM, else, only 18 | # the paths will be saved to RAM. 19 | def __init__(self, ids_path, transcript_path, pinyin_path, background_root, server = False): 20 | self.server = server 21 | self.af = AudioFeaturizer() 22 | self.pyParser = pinyinParser(pinyin_path) 23 | temp = self._get_addressList(ids_path) 24 | self.addressList = [] 25 | self.labels = self._get_labelsDict(transcript_path) 26 | self.unicodes = self._get_unicodes(transcript_path) 27 | for address in temp: 28 | id = address.split('/')[-1][:-4] 29 | if id in self.labels: 30 | self.addressList.append(address) 31 | 32 | if background_root[-1] != '/': background_root = background_root+'/' 33 | root_office = background_root+"office_backgrounds/" 34 | root_youtube = background_root+"youtube_backgrounds/" 35 | root_talking = background_root+"youtube_talking/" 36 | bg_office = [root_office+x for x in os.listdir(root_office) if x[0]!='.'] 37 | bg_youtube = [root_youtube+x for x in os.listdir(root_youtube) if x[0]!='.'] 38 | bg_talking = [root_talking+x for x in os.listdir(root_talking) if x[0]!='.'] 39 | if self.server: 40 | bg_office_w = [mergeChannels(read_wav(w)[1]) for w in bg_office] 41 | bg_youtube_w = [mergeChannels(read_wav(w)[1]) for w in bg_youtube] 42 | bg_talking_w = [mergeChannels(read_wav(w)[1]) for w in bg_talking] 43 | self.bg_libs = [bg_office_w, bg_youtube_w, bg_talking_w] 44 | else: 45 | self.bg_libs = [bg_office, bg_youtube, bg_talking] 46 | 47 | def _get_addressList(self, root): 48 | if root[-1] == '/': root=root[:-1] 49 | result = [] 50 | 51 | ids = [f for f in os.listdir(root) if f[0]!='.'] 52 | for id in ids: 53 | files = [root+'/'+id+'/'+f for f in os.listdir(root+'/'+id) if f[0]!='.'] 54 | result.extend(files) 55 | return result 56 | 57 | def _get_labelsDict(self, transcript_path): 58 | result = {} 59 | with open(transcript_path, 'r') as f: 60 | for line in f: 61 | line = line.strip().split() 62 | content = ("".join(line[1:])) 63 | result[line[0]] = self.pyParser.getPinYinIndices(self.pyParser.getPinYin(content)) 64 | return result 65 | 66 | def _get_unicodes(self, transcript_path): 67 | result = {} 68 | with open(transcript_path, 'r') as f: 69 | for line in f: 70 | line = line.strip().split() 71 | content = ("".join(line[1:])) 72 | result[line[0]] = content 73 | return result 74 | 75 | # If using the fbank, remember to adjust the x_obj. What is more, the 76 | # frame_width and frame stride will be disabled, while winlen, winstep, nfft, 77 | # and num_mel will be enabled. 78 | # If raw frames: x_obj(163000) = your_obj(160000)+frame_width(4000)-frame_stride(1000) 79 | # If filterbank: x_obj(160240) = your_obj(160000)+winlen(16000*0.025=400)-winstep(16000*0.01=160) 80 | def get_batch(self, num, x_obj_min = 16000, x_obj = 160160, batch_type = 'train', 81 | augmentation = True, returnUnicode = False, bgMaximum = 0.05, 82 | isCTC = True, verbose = False): 83 | if batch_type=='train': 84 | range_min = 0 85 | range_max = int(len(self.addressList))*0.95 86 | elif batch_type=='test': 87 | range_min = int(len(self.addressList))*0.95 88 | range_max = len(self.addressList) 89 | elif batch_type=='all': 90 | range_min = 0 91 | range_max = int(len(self.addressList)) 92 | else: 93 | return 94 | 95 | xs = [] 96 | ys = [] 97 | aug_total = 0 98 | mfb_total = 0 99 | while len(xs)x_obj: 104 | continue 105 | 106 | id = file_path.split('/')[-1][:-4] 107 | 108 | start = time.time() 109 | if augmentation: 110 | bg_lib = self.bg_libs[np.random.randint(len(self.bg_libs))] 111 | if self.server: 112 | ns = bg_lib[np.random.randint(len(bg_lib))] 113 | else: 114 | _, ns = read_wav(bg_lib[np.random.randint(len(bg_lib))]) 115 | ns = mergeChannels(ns) 116 | data = randomAugment(data, rate, 1, obj_length = x_obj, noiseSource = ns, bgMaximum = bgMaximum)[0] 117 | else: 118 | data = zero_padding_1d(data, x_obj) 119 | time1 = time.time() 120 | a_seg = AudioSegment(data, rate) 121 | xs.append(self.af.featurize(a_seg)) 122 | time2 = time.time() 123 | aug_total += time1-start 124 | mfb_total += time2-time1 125 | 126 | if returnUnicode: 127 | ys.append(self.unicodes[id]) 128 | else: 129 | ys.append(np.array(self.labels[id]).astype(int)) 130 | 131 | if verbose: 132 | # How the fuck to use print? See this: 133 | # print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) 134 | # print("a=%d,b=%d" % (f(x,n),g(x,n))) 135 | print("Augmentation time = %f sec; Featurization time = %f sec" % (aug_total, mfb_total)) 136 | xs = np.array(xs) 137 | xs = np.transpose(xs, [0,2,1]) 138 | if returnUnicode: 139 | return xs, ys 140 | else: 141 | if isCTC: 142 | ys = sparse_tuple_from(ys) 143 | return xs, ys 144 | else: 145 | ys_lengths = [len(y)+1 for y in ys] 146 | max_length = max(ys_lengths) 147 | temp = [] 148 | 149 | # The first three tokens should be reserved for padding, start, and end tokens. 150 | for y in ys: 151 | if len(y)<(max_length-1): 152 | # Add the end token. (Actually 2, but will be 2 after 3 is added.) 153 | y = np.concatenate([y, [-1]]) 154 | temp.append(np.concatenate([y+3, np.zeros(max_length-len(y))])) 155 | else: 156 | y = np.concatenate([y, [-1]]) 157 | temp.append(y+3) 158 | ys = np.array(temp) 159 | return xs, ys, ys_lengths 160 | -------------------------------------------------------------------------------- /lib/contrib/audio_featurizer.py: -------------------------------------------------------------------------------- 1 | """Contains the audio featurizer class.""" 2 | import numpy as np 3 | # https://github.com/jameslyons/python_speech_features 4 | from python_speech_features import mfcc 5 | from python_speech_features import delta 6 | 7 | 8 | class AudioFeaturizer(object): 9 | """Audio featurizer, for extracting features from audio contents of 10 | AudioSegment or SpeechSegment. 11 | 12 | Currently, it supports feature types of linear spectrogram and mfcc. 13 | 14 | :param specgram_type: Specgram feature type. Options: 'linear'. 15 | :type specgram_type: str 16 | :param stride_ms: Striding size (in milliseconds) for generating frames. 17 | :type stride_ms: float 18 | :param window_ms: Window size (in milliseconds) for generating frames. 19 | :type window_ms: float 20 | :param max_freq: When specgram_type is 'linear', only FFT bins 21 | corresponding to frequencies between [0, max_freq] are 22 | returned; when specgram_type is 'mfcc', max_feq is the 23 | highest band edge of mel filters. 24 | :types max_freq: None|float 25 | :param target_sample_rate: Audio are resampled (if upsampling or 26 | downsampling is allowed) to this before 27 | extracting spectrogram features. 28 | :type target_sample_rate: float 29 | :param use_dB_normalization: Whether to normalize the audio to a certain 30 | decibels before extracting the features. 31 | :type use_dB_normalization: bool 32 | :param target_dB: Target audio decibels for normalization. 33 | :type target_dB: float 34 | """ 35 | 36 | def __init__(self, 37 | specgram_type='linear', 38 | stride_ms=10.0, 39 | window_ms=20.0, 40 | max_freq=None, 41 | target_sample_rate=16000, 42 | use_dB_normalization=True, 43 | target_dB=-20): 44 | self._specgram_type = specgram_type 45 | self._stride_ms = stride_ms 46 | self._window_ms = window_ms 47 | self._max_freq = max_freq 48 | self._target_sample_rate = target_sample_rate 49 | self._use_dB_normalization = use_dB_normalization 50 | self._target_dB = target_dB 51 | 52 | def featurize(self, 53 | audio_segment, 54 | allow_downsampling=True, 55 | allow_upsampling=True): 56 | """Extract audio features from AudioSegment or SpeechSegment. 57 | 58 | :param audio_segment: Audio/speech segment to extract features from. 59 | :type audio_segment: AudioSegment|SpeechSegment 60 | :param allow_downsampling: Whether to allow audio downsampling before 61 | featurizing. 62 | :type allow_downsampling: bool 63 | :param allow_upsampling: Whether to allow audio upsampling before 64 | featurizing. 65 | :type allow_upsampling: bool 66 | :return: Spectrogram audio feature in 2darray. 67 | :rtype: ndarray 68 | :raises ValueError: If audio sample rate is not supported. 69 | """ 70 | # upsampling or downsampling 71 | if ((audio_segment.sample_rate > self._target_sample_rate and 72 | allow_downsampling) or 73 | (audio_segment.sample_rate < self._target_sample_rate and 74 | allow_upsampling)): 75 | audio_segment.resample(self._target_sample_rate) 76 | if audio_segment.sample_rate != self._target_sample_rate: 77 | raise ValueError("Audio sample rate is not supported. " 78 | "Turn allow_downsampling or allow up_sampling on.") 79 | # decibel normalization 80 | if self._use_dB_normalization: 81 | audio_segment.normalize(target_db=self._target_dB) 82 | # extract spectrogram 83 | return self._compute_specgram(audio_segment.samples, 84 | audio_segment.sample_rate) 85 | 86 | def _compute_specgram(self, samples, sample_rate): 87 | """Extract various audio features.""" 88 | if self._specgram_type == 'linear': 89 | return self._compute_linear_specgram( 90 | samples, sample_rate, self._stride_ms, self._window_ms, 91 | self._max_freq) 92 | elif self._specgram_type == 'mfcc': 93 | return self._compute_mfcc(samples, sample_rate, self._stride_ms, 94 | self._window_ms, self._max_freq) 95 | else: 96 | raise ValueError("Unknown specgram_type %s. " 97 | "Supported values: linear." % self._specgram_type) 98 | 99 | def _compute_linear_specgram(self, 100 | samples, 101 | sample_rate, 102 | stride_ms=10.0, 103 | window_ms=20.0, 104 | max_freq=None, 105 | eps=1e-14): 106 | """Compute the linear spectrogram from FFT energy.""" 107 | if max_freq is None: 108 | max_freq = sample_rate / 2 109 | if max_freq > sample_rate / 2: 110 | raise ValueError("max_freq must not be greater than half of " 111 | "sample rate.") 112 | if stride_ms > window_ms: 113 | raise ValueError("Stride size must not be greater than " 114 | "window size.") 115 | stride_size = int(0.001 * sample_rate * stride_ms) 116 | window_size = int(0.001 * sample_rate * window_ms) 117 | specgram, freqs = self._specgram_real( 118 | samples, 119 | window_size=window_size, 120 | stride_size=stride_size, 121 | sample_rate=sample_rate) 122 | ind = np.where(freqs <= max_freq)[0][-1] + 1 123 | return np.log(specgram[:ind, :] + eps) 124 | 125 | def _specgram_real(self, samples, window_size, stride_size, sample_rate): 126 | """Compute the spectrogram for samples from a real signal.""" 127 | # extract strided windows 128 | truncate_size = (len(samples) - window_size) % stride_size 129 | samples = samples[:len(samples) - truncate_size] 130 | nshape = (window_size, (len(samples) - window_size) // stride_size + 1) 131 | nstrides = (samples.strides[0], samples.strides[0] * stride_size) 132 | windows = np.lib.stride_tricks.as_strided( 133 | samples, shape=nshape, strides=nstrides) 134 | assert np.all( 135 | windows[:, 1] == samples[stride_size:(stride_size + window_size)]) 136 | # window weighting, squared Fast Fourier Transform (fft), scaling 137 | weighting = np.hanning(window_size)[:, None] 138 | fft = np.fft.rfft(windows * weighting, axis=0) 139 | fft = np.absolute(fft) 140 | fft = fft**2 141 | scale = np.sum(weighting**2) * sample_rate 142 | fft[1:-1, :] *= (2.0 / scale) 143 | fft[(0, -1), :] /= scale 144 | # prepare fft frequency list 145 | freqs = float(sample_rate) / window_size * np.arange(fft.shape[0]) 146 | return fft, freqs 147 | 148 | def _compute_mfcc(self, 149 | samples, 150 | sample_rate, 151 | stride_ms=10.0, 152 | window_ms=20.0, 153 | max_freq=None): 154 | """Compute mfcc from samples.""" 155 | if max_freq is None: 156 | max_freq = sample_rate / 2 157 | if max_freq > sample_rate / 2: 158 | raise ValueError("max_freq must not be greater than half of " 159 | "sample rate.") 160 | if stride_ms > window_ms: 161 | raise ValueError("Stride size must not be greater than " 162 | "window size.") 163 | # compute the 13 cepstral coefficients, and the first one is replaced 164 | # by log(frame energy) 165 | mfcc_feat = mfcc( 166 | signal=samples, 167 | samplerate=sample_rate, 168 | winlen=0.001 * window_ms, 169 | winstep=0.001 * stride_ms, 170 | highfreq=max_freq) 171 | # Deltas 172 | d_mfcc_feat = delta(mfcc_feat, 2) 173 | # Deltas-Deltas 174 | dd_mfcc_feat = delta(d_mfcc_feat, 2) 175 | # transpose 176 | mfcc_feat = np.transpose(mfcc_feat) 177 | d_mfcc_feat = np.transpose(d_mfcc_feat) 178 | dd_mfcc_feat = np.transpose(dd_mfcc_feat) 179 | # concat above three features 180 | concat_mfcc_feat = np.concatenate( 181 | (mfcc_feat, d_mfcc_feat, dd_mfcc_feat)) 182 | return concat_mfcc_feat 183 | -------------------------------------------------------------------------------- /lib/tools_augmentation.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pyfftw 3 | import resampy 4 | from scipy.ndimage import zoom 5 | 6 | def randomAugment(data, rate, num, obj_length = None, noiseSource = None, bgMaximum = 0.08, verbose = False): 7 | """ 8 | Perform random augmentations. Recommended bgMaximum: random noise:0.07, 9 | office - 0.1, youtube human: 0.07, youtube backgrounds: 0.15. 10 | 11 | :param np.ndarray data: The audio's data point. One channel, which means the 12 | length of the shape should be one. 13 | :param int rate: The sampling rate of the audio. 14 | :param int num: Number of augmentation. 15 | :param int obj_length: Output audio lengths. Will not be padded if leave it 16 | none 17 | :param np.ndarray noiseSource: The source of noise. Will add white noise if 18 | leave it none. 19 | :param float bgMaximum: The maximum background sound. 20 | :param boolean verbose: If true, print out the adjustment made during the 21 | process. 22 | 23 | :return: A list of audio data points. 24 | :raises ValueError: If num < 0 or obj_length <= 0 or 0.75*len(data). 25 | """ 26 | if obj_length is not None: 27 | if (obj_length <= 0): 28 | raise ValueError('Objective length must be above than 0.') 29 | if (obj_length <= 0.75*len(data)): 30 | raise ValueError('Objective length too short.') 31 | if num < 0: 32 | raise ValueError('Number of augmentation must be above than or equal to 0.') 33 | if num == 0: 34 | return [] 35 | 36 | result = [] 37 | data = _normalize(data) 38 | for _ in range(num): 39 | # 1. shift the data a little bit. 40 | if len(data)>16000: 41 | shifty = min(int(len(data)/10), np.random.randint(4000)) 42 | if np.random.random()>0.5: shifty *= -1 43 | transformed = shift(data, shifty) 44 | else: 45 | transformed = data 46 | # 2. Adjust the speed. 47 | ub = 1.25 48 | lb = 0.8 49 | if obj_length is not None: 50 | zoomUpperBound = min(ub, obj_length/float(len(transformed))) 51 | if zoomUpperBound= upper. 110 | """ 111 | yf = pyfftw.interfaces.numpy_fft.fft(data) 112 | trans = np.copy(yf) 113 | trans *= 0 114 | 115 | # Clip the frequency. 116 | if freq_range is not None: 117 | # Determine the maximum and the minimum frequency. 118 | minF, maxF = freq_range 119 | assert maxF>minF 120 | fBound = int(rate/2) 121 | minF = max(0, minF) 122 | maxF = min(fBound, maxF) 123 | # Determine the maximum and the minimum point. 124 | minP = int(len(yf)*minF/(2*fBound)) 125 | maxP = int(len(yf)*maxF/(2*fBound)) 126 | # Trim the fourier form. 127 | trans[minP:maxP] = yf[minP:maxP] 128 | trans[-maxP:-minP] = yf[-maxP:-minP] 129 | yf = trans 130 | trans = np.copy(yf) 131 | trans *= 0 132 | 133 | # Shift by the bias. 134 | for i in range(int(len(yf)/2)): 135 | obj_index = int(i-bias*len(yf)/rate) 136 | if (obj_index<=(len(yf)/2)) and (obj_index>=0): 137 | trans[i] = yf[obj_index] 138 | trans[-i] = yf[-obj_index] 139 | 140 | s = _normalize(pyfftw.interfaces.numpy_fft.ifft(trans).real) 141 | return s 142 | 143 | def dataTrim(data, trim_lower, trim_upper): 144 | """ 145 | Trim the audio, which means the data points before trim_lower or after 146 | trim_upper will be removed. trim_upper can be negative. 147 | 148 | :param np.ndarray data: The audio's data point. One channel, which means the 149 | length of the shape should be one. 150 | :param int trim_lower: The lower bound to trim. 151 | :param int trim_upper: The upper bound to trim. 152 | 153 | :return: Transformed audio data points. 154 | :raises ValueError: If trim_lower >= trim_upper. 155 | """ 156 | if (trim_lower < 0): 157 | raise ValueError('Lower bound must be above than or equal to zero.') 158 | if (trim_upper == 0): 159 | raise ValueError('Upper bound cannot be zero.') 160 | if (trim_upper > 0) and (trim_lower >= trim_upper): 161 | raise ValueError('Lower bound is larger than or equal to the upper bound.') 162 | if (trim_upper < 0) and ((trim_lower-trim_upper)>=len(data)): 163 | raise ValueError('Lower bound is larger than or equal to the upper bound.') 164 | 165 | return data[trim_lower:trim_upper] 166 | 167 | def dataPadding(data, padding_lower, padding_upper): 168 | """ 169 | Add zeros to the beginning or the end of the audio. 170 | 171 | :param np.ndarray data: The audio's data point. One channel, which means the 172 | length of the shape should be one. 173 | :param int padding_lower: Number of zeros to be added to the beginning. 174 | :param int padding_upper: Number of zeros to be added to the end. 175 | 176 | :return: Transformed audio data points. 177 | :raises ValueError: If padding_lower or padding_upper < 0. 178 | """ 179 | if (padding_lower <= 0) or (padding_upper <= 0): 180 | raise ValueError('Number of padding must be above than zero.') 181 | result = np.zeros(len(data)+padding_lower+padding_upper) 182 | try: 183 | result[padding_lower:-padding_upper] = data 184 | except ValueError: 185 | print(padding_lower) 186 | print(padding_upper) 187 | print(len(data)) 188 | raise ValueError("FUCK YOU!!!!!!!!!") 189 | return result 190 | 191 | def audioResize(data, zoomFactor): 192 | """ 193 | Resize the audio. Not only the length, but the frequency will also be 194 | changed. If dealing with speech data, the zoomFactor bound recommended is 195 | [0.75,1.35]. 196 | 197 | :param np.ndarray data: The audio's data point. One channel, which means the 198 | length of the shape should be one. 199 | :param int zoomFactor: The objective zoomFactor. 200 | 201 | :return: Transformed audio data points. 202 | :raises ValueError: If zoomFactor <= 0. 203 | """ 204 | if (zoomFactor <= 0): 205 | raise ValueError('The zoomFactor should be larger than zero.') 206 | return zoom(data, zoomFactor) 207 | 208 | def audioVolume(data, maximum): 209 | """ 210 | Set the maximum volume of the audio. I personally do not recommend setting 211 | the maximum above than 0.99 212 | 213 | :param np.ndarray data: The audio's data point. One channel, which means the 214 | length of the shape should be one. 215 | :param float maximum: The maximum volume. 216 | 217 | :return: Transformed audio data points. Should be the same size as the 218 | 'data'. 219 | :raises ValueError: If maximum < 0 or >1. 220 | """ 221 | if (maximum < 0) or (maximum > 1): 222 | raise ValueError('The maximum should be between 0 and 1.') 223 | return maximum * data / np.max(np.abs(data)) 224 | 225 | def audioVolumeLinear(data, maximum_start, maximum_end): 226 | """ 227 | Set the maximum volume of the audio linearly regarding the time. 228 | 229 | :param np.ndarray data: The audio's data point. One channel, which means the 230 | length of the shape should be one. 231 | :param float maximum_start: The maximum volume at the beginning. 232 | :param float maximum_end: The maximum volume in the end. 233 | 234 | :return: Transformed audio data points. Should be the same size as the 235 | 'data'. 236 | :raises ValueError: If (maximum_start < 0 or >1) or (maximum_end < 0 or >1). 237 | """ 238 | if (maximum_start < 0) or (maximum_start > 1) or (maximum_end < 0) or (maximum_end > 1): 239 | raise ValueError('The maximum should be between 0 and 1.') 240 | maximum = np.linspace(maximum_start, maximum_end, num=len(data)) 241 | return maximum * data / np.max(np.abs(data)) 242 | 243 | def addNoise(data, noise_factor): 244 | """ 245 | Add random noise to the audio. 246 | 247 | :param np.ndarray data: The audio's data point. One channel, which means the 248 | length of the shape should be one. 249 | :param float noise_factor: The ratio of noise in volume. 250 | 251 | :return: Transformed audio data points. Should be the same size as the 252 | 'data'. 253 | :raises ValueError: If noise_factor < 0 or >1. 254 | """ 255 | if (noise_factor < 0) or (noise_factor > 1): 256 | raise ValueError('The noise factor should be between 0 and 1.') 257 | noise = np.random.random(size=len(data))*2-1 258 | noise /= (np.max(np.abs(noise))/noise_factor) 259 | audio = (1.0-noise_factor) * data / np.max(np.abs(data)) 260 | return noise+audio 261 | 262 | def addNoiseFrom(data, noiseSource, noise_factor): 263 | """ 264 | Add random noise from source. If noise from people speaking, recommend below 265 | 0.05, else, recommend below 0.3 266 | 267 | :param np.ndarray data: The audio's data point. One channel, which means the 268 | length of the shape should be one. 269 | :param np.ndarray noiseSource: The noise data. Must be longer or equal to 270 | the length of 'data'. 271 | :param float noise_factor: The ratio of noise in volume. 272 | 273 | :return: Transformed audio data points. Should be the same size as the 274 | 'data'. 275 | :raises ValueError: If len(noiseSource)1. 277 | """ 278 | if (noise_factor < 0) or (noise_factor > 1): 279 | raise ValueError('The noise factor should be between 0 and 1.') 280 | if (len(noiseSource) len(audio): 300 | raise ValueError("Absolute value of shift_ms should be smaller " 301 | "than audio duration.") 302 | if shifty > 0: 303 | # time advance 304 | audio[:-shifty] = audio[shifty:] 305 | audio[-shifty:] = 0 306 | elif shifty < 0: 307 | # time delay 308 | audio[-shifty:] = audio[:shifty] 309 | audio[:-shifty] = 0 310 | return audio 311 | 312 | def resample(audio, rate, target_sample_rate, filter='kaiser_best'): 313 | """ 314 | Resample the audio to a target sample rate. 315 | 316 | :param np.ndarray audio: Audio data points. 317 | :param int target_sample_rate: Target sample rate. 318 | :param str filter: The resampling filter to use one of {'kaiser_best', 319 | 'kaiser_fast'}. 320 | """ 321 | audio = resampy.resample(audio, rate, target_sample_rate, filter=filter) 322 | return audio 323 | 324 | def simple_echo(audio, factor, duration): 325 | """ 326 | Resample the audio to a target sample rate. 327 | 328 | :param np.ndarray audio: Audio data points. 329 | :param int factor: Echo factor. 330 | :param int duration: Echo duration. If duration == 0, then no echo. 331 | """ 332 | if duration == 0: return audio 333 | result = np.zeros(len(audio)+duration) 334 | ratio = 1 335 | for i in range(duration+1): 336 | result[i:len(audio)+i] = ratio*audio 337 | ratio*=factor 338 | return _normalize(result) 339 | 340 | def impulse_echo(audio, impulse_func): 341 | """ 342 | Resample the audio to a target sample rate. 343 | 344 | :param np.ndarray audio: Audio data points. 345 | :param np.ndarray impulse_func: Echo factors array. 346 | """ 347 | result = np.zeros(len(audio)+len(impulse_func)) 348 | result[:len(audio)] = audio 349 | for i in range(duration): 350 | result[i+1:len(audio)+i+1] = impulse_func[i]*audio 351 | return _normalize(result) 352 | 353 | def _normalize(dat): 354 | return 0.99 * dat / np.max(np.abs(dat)) 355 | 356 | def _zeroPad(dat, l): 357 | """ 358 | Pad by zeros. 359 | 360 | :param list dat: The data array. 361 | :param int l: Objective length. 362 | :raises ValueError: If l is shorter than the dat length. 363 | """ 364 | if l 00:00:06,440 3 | 各位同胞大家晚上好 4 | 5 | 2 6 | 00:00:06,440 --> 00:00:12,000 7 | 今年是我们见过地无视了周年纪念 8 | 9 | 3 10 | 00:00:12,000 --> 00:00:18,120 11 | 犹如见过的初期摆在我们年前的时序罗重大的问题 12 | 13 | 4 14 | 00:00:18,120 --> 00:00:25,040 15 | 比如恐怖主义外交关系和经济发展 16 | 17 | 5 18 | 00:00:25,040 --> 00:00:30,420 19 | 政府正在精神力任经理处理这些问题 20 | 21 | 6 22 | 00:00:30,420 --> 00:00:35,600 23 | 希望得到人民权利的配合与支持 24 | 25 | 7 26 | 00:00:35,600 --> 00:00:42,740 27 | 其中我知道大家都很关心经济的展望和九月前景 28 | 29 | 8 30 | 00:00:42,740 --> 00:00:48,420 31 | 我国的经济保持实力今年的经济增长有骑射 32 | 33 | 9 34 | 00:00:48,420 --> 00:00:53,560 35 | 预计将达到百分之二点五必取人好 36 | 37 | 10 38 | 00:00:53,560 --> 00:01:01,180 39 | 更令人孤的是经济转型也取得进展生产力有所提升 40 | 41 | 11 42 | 00:01:01,180 --> 00:01:09,840 43 | 生产力的提升将能给国人带来更好的工作更高的收入 44 | 45 | 12 46 | 00:01:09,840 --> 00:01:17,220 47 | 不过经济转型的工作还没完成我们还要付出更多努力 48 | 49 | 13 50 | 00:01:17,220 --> 00:01:24,120 51 | 再转听的过程中一些新价保人士需工作包括专业人士 52 | 53 | 14 54 | 00:01:24,120 --> 00:01:33,300 55 | 我们正在协助他们接受再训练,寻找新工作,重新出发。 56 | 57 | 15 58 | 00:01:37,120 --> 00:01:44,000 59 | 风向政府有什么援助措施来帮助国人提升技能 60 | 61 | 16 62 | 00:01:44,000 --> 00:01:51,040 63 | 这就是他出席的其中一强对话未必高 64 | 65 | 17 66 | 00:01:51,040 --> 00:01:59,180 67 | 政府也为商家提供各种援助帮助他们提升业务开拓市场 68 | 69 | 18 70 | 00:01:59,180 --> 00:02:04,680 71 | 其中一家收回的本地企业是老板多花 72 | 73 | 19 74 | 00:02:04,680 --> 00:02:11,180 75 | 在体罚局的协助下他们在越南开了小半豆花 76 | 77 | 20 78 | 00:02:11,180 --> 00:02:13,980 79 | 我问他们为什么越南叫做小班 80 | 81 | 21 82 | 00:02:19,200 --> 00:02:26,800 83 | 悦然的小班和新加坡的老板一颗口粮受欢迎 84 | 85 | 22 86 | 00:02:26,800 --> 00:02:32,480 87 | 我相信只要政府人民和企业痛立刻做 88 | 89 | 23 90 | 00:02:36,340 --> 00:02:43,760 91 | 开创新的局面创造良好的就业机会 92 | 93 | 24 94 | 00:02:43,760 --> 00:02:47,200 95 | 加快经济转型是单务之急 96 | 97 | 25 98 | 00:02:47,200 --> 00:02:51,860 99 | 这会直接影响我们的生活和范宽 100 | 101 | 26 102 | 00:02:51,860 --> 00:02:55,820 103 | 不过要维持国家繁荣社会稳定 104 | 105 | 27 106 | 00:02:59,560 --> 00:03:05,200 107 | 宏观的政策为将来做好准备 108 | 109 | 28 110 | 00:03:05,200 --> 00:03:12,060 111 | 所以金旺我要坐中堂三个有关火锅长远未来的课题 112 | 113 | 29 114 | 00:03:12,060 --> 00:03:16,700 115 | 低如何提升学前教育 116 | 117 | 30 118 | 00:03:16,700 --> 00:03:22,720 119 | 因为我们要让每一个孩子都能打下扎实的基础 120 | 121 | 31 122 | 00:03:22,720 --> 00:03:29,240 123 | 为他们争取更好的人生起跑点 124 | 125 | 32 126 | 00:03:29,240 --> 00:03:34,200 127 | 第二如何一起对抗糖药病 128 | 129 | 33 130 | 00:03:36,900 --> 00:03:42,780 131 | 这个会对个人和社会带来承重的负担 132 | 133 | 34 134 | 00:03:42,780 --> 00:03:47,480 135 | 第三如何实现智慧果的愿景 136 | 137 | 35 138 | 00:03:47,480 --> 00:03:50,840 139 | 因为我们要善加利用科技 140 | 141 | 36 142 | 00:03:50,840 --> 00:03:58,600 143 | 为各界城人民带来更好的生活和更多的机遇 144 | 145 | 37 146 | 00:03:58,600 --> 00:04:02,860 147 | 让我先看一谈如何赶上学前教育 148 | 149 | 38 150 | 00:04:02,860 --> 00:04:06,420 151 | 我们会从三方面着手 152 | 153 | 39 154 | 00:04:12,200 --> 00:04:16,580 155 | 第二提升学前教育的素质 156 | 157 | 40 158 | 00:04:16,579 --> 00:04:21,799 159 | 并让孩子们从小打好双鱼的基础 160 | 161 | 41 162 | 00:04:21,800 --> 00:04:25,540 163 | 第三加强师资的培训 164 | 165 | 42 166 | 00:04:25,540 --> 00:04:29,780 167 | 你吸引更多人加入这个专业 168 | 169 | 43 170 | 00:04:31,840 --> 00:04:36,780 171 | 是为不同家庭背景的孩子提供良好的学前教育 172 | 173 | 44 174 | 00:04:36,780 --> 00:04:40,960 175 | 我们尤其关注经济条件较差的孩子 176 | 177 | 45 178 | 00:04:40,960 --> 00:04:44,780 179 | 确保他们挥挥素斋认真的起跑点 180 | 181 | 46 182 | 00:04:44,780 --> 00:04:49,680 183 | 使他们能够充分发挥所长 184 | 185 | 47 186 | 00:04:49,680 --> 00:04:55,600 187 | 令到六岁的孩子学习成长的速度都很快 188 | 189 | 48 190 | 00:04:55,600 --> 00:05:01,240 191 | 这些幼童的大脑就好像海绵两样有很强的吸收能力 192 | 193 | 49 194 | 00:05:01,240 --> 00:05:06,540 195 | 我们必须把握这个关键的发育阶段 196 | 197 | 50 198 | 00:05:06,540 --> 00:05:11,740 199 | 让孩子们多接触语言美术音乐等 200 | 201 | 51 202 | 00:05:11,740 --> 00:05:14,780 203 | 同时让他们同龄的孩子交朋友 204 | 205 | 52 206 | 00:05:20,600 --> 00:05:26,620 207 | 研究显示学习院的这家年龄就是领导三退 208 | 209 | 53 210 | 00:05:26,620 --> 00:05:33,600 211 | 这些幼童对于人学习特别敏感接受能力很强 212 | 213 | 54 214 | 00:05:33,600 --> 00:05:41,140 215 | 成个人也可以学习元旦不容易上手不容易说得流利 216 | 217 | 55 218 | 00:05:45,700 --> 00:05:51,800 219 | 你如果年长之后才开始水可能四声不分 220 | 221 | 56 222 | 00:05:51,800 --> 00:05:57,440 223 | 并不出其中的差别跟物化准确的发硬 224 | 225 | 57 226 | 00:05:57,440 --> 00:06:01,060 227 | 发硬不准可能能回了楚小瑶华 228 | 229 | 58 230 | 00:06:01,060 --> 00:06:04,580 231 | 例如玄生要跟老师请教的时候 232 | 233 | 59 234 | 00:06:04,580 --> 00:06:07,540 235 | 本来要说我要问利文老师 236 | 237 | 60 238 | 00:06:07,540 --> 00:06:11,560 239 | 可能所称我要问你问老师 240 | 241 | 61 242 | 00:06:11,560 --> 00:06:19,320 243 | 身子我要问你问老师那就肯定不及格了 244 | 245 | 62 246 | 00:06:19,320 --> 00:06:25,200 247 | 所以学习准确地反映必须从小开始 248 | 249 | 63 250 | 00:06:25,200 --> 00:06:29,340 251 | 我母亲的经验就能够说明这一点 252 | 253 | 64 254 | 00:06:29,340 --> 00:06:34,540 255 | 我母亲是在这张事情二十岁左右才开始是话语的 256 | 257 | 65 258 | 00:06:34,540 --> 00:06:41,900 259 | 它能够多能提能说不过很少用话语沟通 260 | 261 | 66 262 | 00:06:48,480 --> 00:06:52,900 263 | 光射到了多年后才发现他不讲划一的原因 264 | 265 | 67 266 | 00:07:00,600 --> 00:07:06,400 267 | 或许妈妈觉得有点不好意思过后就不讲话里了 268 | 269 | 68 270 | 00:07:11,000 --> 00:07:15,920 271 | 我三岁时父母就挂我送到那辆有自愿读书 272 | 273 | 69 274 | 00:07:15,920 --> 00:07:21,560 275 | 他们希望过能在一个使用华文的话的学习环境里成长 276 | 277 | 70 278 | 00:07:21,560 --> 00:07:25,300 279 | 把好花纹的基础 280 | 281 | 71 282 | 00:07:25,300 --> 00:07:32,080 283 | 在老实用性的教导下我轻松愉快地学习华文华语 284 | 285 | 72 286 | 00:07:32,080 --> 00:07:37,980 287 | 可是一个是在我的学生时代没机会学标准法应 288 | 289 | 73 290 | 00:07:37,980 --> 00:07:42,360 291 | 因为那时候汉语平阴还没有面世 292 | 293 | 74 294 | 00:07:42,360 --> 00:07:46,660 295 | 所以我的怀宇带着南阳抢标 296 | 297 | 75 298 | 00:07:46,660 --> 00:07:53,480 299 | 我十多年前陈年之后才开始注意标准的发硬 300 | 301 | 76 302 | 00:07:53,480 --> 00:07:56,980 303 | 虽然我是华小生还是觉得不容易 304 | 305 | 77 306 | 00:07:56,980 --> 00:08:02,760 307 | 一直到现在博还是会走音 308 | 309 | 78 310 | 00:08:02,760 --> 00:08:11,480 311 | 巴士和四圣卢焯樂電視都城电池已熟读成伊苏 312 | 313 | 79 314 | 00:08:11,480 --> 00:08:22,940 315 | 或把 “出发” 读成 “醋发“、“结果” 变成 “借果”,等。 316 | 317 | 80 318 | 00:08:22,940 --> 00:08:26,380 319 | 可见张到后学费元真不容易 320 | 321 | 81 322 | 00:08:26,380 --> 00:08:31,740 323 | 所以要找开始最好有额时候就开始 324 | 325 | 82 326 | 00:08:31,740 --> 00:08:37,740 327 | 从我自己和父母的经验来看我们应该尽早学习语文 328 | 329 | 83 330 | 00:08:37,740 --> 00:08:44,840 331 | 因此我们决定通过学前教育进一步巩固我们的双语政策 332 | 333 | 84 334 | 00:08:44,840 --> 00:08:49,700 335 | 现在许多家长都以隐喻和孩子沟通 336 | 337 | 85 338 | 00:08:49,700 --> 00:08:56,800 339 | 沐浴在家里用的少学校和木为教师的角色变得更为重要 340 | 341 | 86 342 | 00:09:00,920 --> 00:09:06,840 343 | 又为学前教育对孩子的好处多也能够发挥各种社会功用 344 | 345 | 87 346 | 00:09:06,840 --> 00:09:15,000 347 | 政府于是决定加大力度增加投资已全面提升学前教育 348 | 349 | 88 350 | 00:09:15,000 --> 00:09:25,040 351 | 五年前,政府在学前教育方面的年开支是今年的一半。 352 | 353 | 89 354 | 00:09:25,040 --> 00:09:34,440 355 | 五年后,政府这方面的年开支将比今年增加一倍。 356 | 357 | 90 358 | 00:09:34,440 --> 00:09:40,740 359 | 由此可见政府对学前教育的重视和决心 360 | 361 | 91 362 | 00:09:40,740 --> 00:09:45,600 363 | 我们希望这些头颅有助于提升学前教育的素质 364 | 365 | 92 366 | 00:09:45,600 --> 00:09:48,800 367 | 让整幅字宙的托儿所河流幼儿园 368 | 369 | 93 370 | 00:09:55,920 --> 00:10:02,600 371 | 这样所有孩子无论平复都有公平竞争力争上游的机会 372 | 373 | 94 374 | 00:10:02,600 --> 00:10:05,940 375 | 己日为社会做出贡献 376 | 377 | 95 378 | 00:10:05,940 --> 00:10:10,400 379 | 同时我们将确保托儿所和幼儿园的学费 380 | 381 | 96 382 | 00:10:15,160 --> 00:10:18,420 383 | 孩子能够得到良好的照顾良好的教育 384 | 385 | 97 386 | 00:10:18,420 --> 00:10:31,980 387 | 我希望这能够激励年轻夫妇多生几个孩子。 388 | 389 | 98 390 | 00:10:31,980 --> 00:10:36,480 391 | 接下来我要谈的课题跟大家的健康有关 392 | 393 | 99 394 | 00:10:36,480 --> 00:10:41,140 395 | 那就是糖尿病日益普遍的问题 396 | 397 | 100 398 | 00:10:41,140 --> 00:10:45,900 399 | 许多人在听了我的国庆献辞之后感到有点纳闷 400 | 401 | 101 402 | 00:10:45,900 --> 00:10:52,080 403 | 他们问唐尧并值得在群众到会上高谈阔论吗 404 | 405 | 102 406 | 00:10:52,080 --> 00:10:58,520 407 | 我的回答是正因为很多人不担心我才担心 408 | 409 | 103 410 | 00:11:02,000 --> 00:11:06,900 411 | 他今天才变成一个严重的问题 412 | 413 | 104 414 | 00:11:06,900 --> 00:11:11,680 415 | 患上糖尿病的人逐年增加 416 | 417 | 105 418 | 00:11:11,680 --> 00:11:17,020 419 | 你身边的清洗朋友当中不难发现糖尿病患者 420 | 421 | 106 422 | 00:11:17,020 --> 00:11:26,100 423 | 60岁以上的国人,每10个人当中就有3个人患有糖尿病! 424 | 425 | 107 426 | 00:11:26,100 --> 00:11:32,060 427 | 此外汤药必以当时孔就会出现严重的并发症 428 | 429 | 108 430 | 00:11:36,880 --> 00:11:42,620 431 | 有些患者还必须截肢以保住生民 432 | 433 | 109 434 | 00:11:42,620 --> 00:11:49,020 435 | 新加坡每年平均具有一千两百名糖尿病患者必须节制 436 | 437 | 110 438 | 00:11:49,020 --> 00:11:56,560 439 | 每天三四个人情况可能是全世界最严重的 440 | 441 | 111 442 | 00:11:56,560 --> 00:12:00,340 443 | 重力和医院就和我很像了这样的一个故事 444 | 445 | 112 446 | 00:12:00,340 --> 00:12:05,520 447 | 他进行交房时见到一位男居民他是糖尿药病患者 448 | 449 | 113 450 | 00:12:05,520 --> 00:12:11,240 451 | 这个四十来岁以女儿正在上小学 452 | 453 | 114 454 | 00:12:11,240 --> 00:12:15,160 455 | 这位男居民告诉理会她下个新题 456 | 457 | 115 458 | 00:12:15,160 --> 00:12:21,080 459 | 就必须节制会失去指教 460 | 461 | 116 462 | 00:12:21,080 --> 00:12:25,640 463 | 他的女儿害家人还有例会都很刚性 464 | 465 | 117 466 | 00:12:25,640 --> 00:12:29,240 467 | 里面接下来他的生活起居需要家人照料 468 | 469 | 118 470 | 00:12:29,240 --> 00:12:38,720 471 | 生活素质大受影响,同时也会打击他的工作能力和家庭的收入。 472 | 473 | 119 474 | 00:12:38,720 --> 00:12:46,600 475 | 所以我们对待糖药病绝对不可以钓鱼情形听信不当你会是 476 | 477 | 120 478 | 00:12:46,600 --> 00:12:52,560 479 | 汤药并在本地痕图片很普遍和严重远离我几个 480 | 481 | 121 482 | 00:13:00,680 --> 00:13:05,960 483 | 总理会议议员的居民四十多费只要节制了 484 | 485 | 122 486 | 00:13:05,960 --> 00:13:09,600 487 | 所以你可能还是中年人生只是年轻人 488 | 489 | 123 490 | 00:13:09,600 --> 00:13:13,760 491 | 李悦有面对唐尧根的风险 492 | 493 | 124 494 | 00:13:13,760 --> 00:13:18,260 495 | 还有糖尿病的臭气症状不明显 496 | 497 | 125 498 | 00:13:18,260 --> 00:13:21,840 499 | 所以你后续不知道自己患就糖尿病 500 | 501 | 126 502 | 00:13:21,840 --> 00:13:27,500 503 | 更有一些人虽然健康开始亮红灯也不远离去看医生 504 | 505 | 127 506 | 00:13:27,500 --> 00:13:31,880 507 | 因为他们害怕听到坏消息 508 | 509 | 128 510 | 00:13:31,880 --> 00:13:37,100 511 | 但是病从浅中医听大家不要她看医生 512 | 513 | 129 514 | 00:13:37,100 --> 00:13:40,400 515 | 要及早就医替医生的话 516 | 517 | 130 518 | 00:13:40,400 --> 00:13:47,360 519 | 改变生活方式控制饮食准时只要 520 | 521 | 131 522 | 00:13:47,360 --> 00:13:51,540 523 | 在这里我也要给大家两个建立 524 | 525 | 132 526 | 00:13:51,540 --> 00:13:56,740 527 | 第一大家一改定期多身体健康检查 528 | 529 | 133 530 | 00:13:56,740 --> 00:13:59,920 531 | 为什不交代我替他们把个小广告 532 | 533 | 134 534 | 00:13:59,920 --> 00:14:04,680 535 | 向大家推荐他们的健康检查优惠大减价 536 | 537 | 135 538 | 00:14:06,820 --> 00:14:10,560 539 | 从下个棋如果你是四十岁上德国人 540 | 541 | 136 542 | 00:14:14,480 --> 00:14:20,980 543 | 这个配套的成本起身是一百多块钱所谓这个是很大的优惠 544 | 545 | 137 546 | 00:14:27,940 --> 00:14:32,660 547 | 如如果你认为这个优惠还不够 548 | 549 | 138 550 | 00:14:36,520 --> 00:14:39,820 551 | 看你看自己也没有三高 552 | 553 | 139 554 | 00:14:39,820 --> 00:14:50,680 555 | 什么是“三高”?高血糖、高血压、高胆固醇。 556 | 557 | 140 558 | 00:14:57,580 --> 00:15:00,380 559 | 保持影视均很 560 | 561 | 141 562 | 00:15:00,380 --> 00:15:04,940 563 | 所谓两声知道墨先是 564 | 565 | 142 566 | 00:15:04,940 --> 00:15:11,440 567 | 中医学里就有这样的概念以实物当药材调理身体 568 | 569 | 143 570 | 00:15:11,440 --> 00:15:16,580 571 | 另外我们还要控制体重经常做运动 572 | 573 | 144 574 | 00:15:16,580 --> 00:15:30,060 575 | 把自己的身体照顾好,才能健健康康地过充实的人生! 576 | 577 | 145 578 | 00:15:34,440 --> 00:15:36,280 579 | 什么是智慧果呢 580 | 581 | 146 582 | 00:15:42,120 --> 00:15:46,360 583 | 他高科技这些所谓年轻人的瓦利尔 584 | 585 | 147 586 | 00:15:46,360 --> 00:15:51,840 587 | 实际上只回过就是通过现代科技让全体人民鼓轮了 588 | 589 | 148 590 | 00:15:51,840 --> 00:15:58,840 591 | 无论老少都能受惠包括能改善年长者的日常生活 592 | 593 | 149 594 | 00:15:58,840 --> 00:16:07,200 595 | 让我举个例子来解释资讯科技如何让独居的年长者的生活跟安全 596 | 597 | 150 598 | 00:16:07,200 --> 00:16:12,320 599 | 现在我们常常见到独具的年老夫妇和单程老人 600 | 601 | 151 602 | 00:16:12,320 --> 00:16:17,140 603 | 如何照顾这些独居老人是个很困难的问题 604 | 605 | 152 606 | 00:16:21,180 --> 00:16:26,200 607 | 我们家怎么知道怎么才及时抢救 608 | 609 | 153 610 | 00:16:26,200 --> 00:16:32,440 611 | 要解决这个生活中的实际问题科技可以台上用长 612 | 613 | 154 614 | 00:16:32,440 --> 00:16:36,980 615 | 我们可以在年长的阁主家安装智能感应体 616 | 617 | 155 618 | 00:16:36,980 --> 00:16:45,720 619 | 像这张图表所显示的你可以在门口和每一个房间安装一个 620 | 621 | 156 622 | 00:16:45,720 --> 00:16:51,640 623 | 这个肝引起的主要功能是看车架里的动静 624 | 625 | 157 626 | 00:16:51,640 --> 00:16:56,600 627 | 赶紧起会学习分辨绵掌着的是日常生活汇率 628 | 629 | 158 630 | 00:16:56,600 --> 00:17:02,180 631 | 比方说他通常既点题床准备早餐 632 | 633 | 159 634 | 00:17:09,000 --> 00:17:12,440 635 | 钢筋其探测不到这些日常生我的动静 636 | 637 | 160 638 | 00:17:12,440 --> 00:17:15,560 639 | 并非及时通知家人 640 | 641 | 161 642 | 00:17:15,560 --> 00:17:20,600 643 | 这样一来家人可以及时发硬可以放心了 644 | 645 | 162 646 | 00:17:20,599 --> 00:17:23,739 647 | 老人家也不必怕因社会被挺烦 648 | 649 | 163 650 | 00:17:23,740 --> 00:17:29,540 651 | 因为这些干警岂不是建设企业不是秘鲁电池 652 | 653 | 164 654 | 00:17:29,540 --> 00:17:34,560 655 | 结构据目前在一些年长者的住家试验这种干劲系统 656 | 657 | 165 658 | 00:17:34,560 --> 00:17:38,540 659 | 茶与事业的就包括一位聊人士 660 | 661 | 166 662 | 00:17:38,540 --> 00:17:42,740 663 | 有一天廖女士的儿子受到的系统发出的通知 664 | 665 | 167 666 | 00:17:42,740 --> 00:17:46,380 667 | 知道母亲家里出现不寻常的状况 668 | 669 | 168 670 | 00:17:46,380 --> 00:17:50,320 671 | 系统探测不到某种东京 672 | 673 | 169 674 | 00:17:55,720 --> 00:18:01,060 675 | 他连忙赶起麻辣的家才发现妈妈卧病在床 676 | 677 | 170 678 | 00:18:01,060 --> 00:18:07,620 679 | 好马上可以妈妈去看医生信号最终平安如是 680 | 681 | 171 682 | 00:18:07,620 --> 00:18:14,580 683 | 可见现在科技可以解决生活的问题人人都可火影 684 | 685 | 172 686 | 00:18:14,580 --> 00:18:18,480 687 | 科技还可以帮着李某盛馔一口饭吃 688 | 689 | 173 690 | 00:18:18,480 --> 00:18:25,460 691 | 即使你不是专家即使你进一把年纪了 692 | 693 | 174 694 | 00:18:25,460 --> 00:18:30,060 695 | 让我举一个例子在市区工作的人 696 | 697 | 175 698 | 00:18:30,060 --> 00:18:33,940 699 | 可能有主意了一位充满活力的搭建 700 | 701 | 176 702 | 00:18:33,940 --> 00:18:40,160 703 | 经常穿街走巷忙周围伤官的人宜送食物 704 | 705 | 177 706 | 00:18:40,160 --> 00:18:44,960 707 | 这位送外卖的大姐市长对兰律师 708 | 709 | 178 710 | 00:18:44,960 --> 00:18:48,000 711 | 他今年七十岁了比我大一点 712 | 713 | 179 714 | 00:18:48,000 --> 00:18:53,120 715 | 会使用一些资讯科技使工作更变更顺利 716 | 717 | 180 718 | 00:18:53,120 --> 00:18:59,500 719 | 不可很欣赏他都叫他还得我们神起你想 720 | 721 | 181 722 | 00:18:59,500 --> 00:19:06,780 723 | 他最近上的电视节目让我们看一看这位身体率下的风采 724 | 725 | 182 726 | 00:21:02,020 --> 00:21:12,440 727 | 【掌声】 728 | 729 | 183 730 | 00:21:12,440 --> 00:21:15,000 731 | 这位已经是张大姐了 732 | 733 | 184 734 | 00:21:15,000 --> 00:21:18,080 735 | 我们应该向张大姐学习 736 | 737 | 185 738 | 00:21:18,080 --> 00:21:22,840 739 | 那种乐观积极活到老学到老的精神 740 | 741 | 186 742 | 00:21:22,840 --> 00:21:26,420 743 | 张大姐懂得抓紧数码时代的机会 744 | 745 | 187 746 | 00:21:26,420 --> 00:21:32,160 747 | 一边工作赚钱以便做运动两全其美 748 | 749 | 188 750 | 00:21:32,160 --> 00:21:35,520 751 | 张大姐做得到的比他年轻的人 752 | 753 | 189 754 | 00:21:35,520 --> 00:21:41,660 755 | 肯定可以做得到你收摄不是 756 | 757 | 190 758 | 00:21:41,660 --> 00:21:47,760 759 | 即使你不是沈青钰翔也可以学习掌握这些现代科技 760 | 761 | 191 762 | 00:21:47,760 --> 00:21:51,520 763 | 比如你可以先却用爱看看抱着 764 | 765 | 192 766 | 00:21:51,520 --> 00:21:53,680 767 | 始终来看它有体量好处 768 | 769 | 193 770 | 00:21:53,680 --> 00:21:58,340 771 | 像我这样有老花眼的话可以随意放大字体来看 772 | 773 | 194 774 | 00:22:03,040 --> 00:22:08,860 775 | 可以一手看报纸一手持宝这算受报班 776 | 777 | 195 778 | 00:22:11,640 --> 00:22:15,420 779 | 可记忆在大家的日常生活中所带来的好处 780 | 781 | 196 782 | 00:22:15,420 --> 00:22:18,840 783 | 当然还有很多不慎美军 784 | 785 | 197 786 | 00:22:24,120 --> 00:22:30,060 787 | 让生活更扁你更安全更丰富 788 | 789 | 198 790 | 00:22:30,060 --> 00:22:34,800 791 | 新加坡具有实现智慧过于安静的条件 792 | 793 | 199 794 | 00:22:34,800 --> 00:22:39,180 795 | 我们互联网的覆盖面管速度也良好 796 | 797 | 200 798 | 00:22:39,180 --> 00:22:43,160 799 | 我们向来也注重梳理和工程方面的教育 800 | 801 | 201 802 | 00:22:43,160 --> 00:22:47,880 803 | 培育培养了不少科技人才 804 | 805 | 202 806 | 00:22:47,880 --> 00:22:51,380 807 | 他们有好些在海外大屏 808 | 809 | 203 810 | 00:22:51,380 --> 00:22:54,740 811 | 去年我到美国三方是访问时 812 | 813 | 204 814 | 00:22:54,740 --> 00:22:59,940 815 | 遇到不少新加坡人在那里从事咨询科技工作 816 | 817 | 205 818 | 00:22:59,940 --> 00:23:03,160 819 | 我和他们仅仅了会面交流 820 | 821 | 206 822 | 00:23:03,160 --> 00:23:10,360 823 | 他们多数是年轻人当中不少曾经在美国圣召 824 | 825 | 207 826 | 00:23:15,760 --> 00:23:18,900 827 | 我他们分享了新加坡的智慧国测绿萼 828 | 829 | 208 830 | 00:23:18,900 --> 00:23:25,240 831 | 也要请他们回到新加坡帮助我们实现这个愿景 832 | 833 | 209 834 | 00:23:25,240 --> 00:23:29,600 835 | 其中一位是真冰冰女士 836 | 837 | 210 838 | 00:23:29,600 --> 00:23:32,740 839 | 甄女士旅居海外十年 840 | 841 | 211 842 | 00:23:32,740 --> 00:23:38,000 843 | 在三藩市井伊家替补公司成绩不错 844 | 845 | 212 846 | 00:23:38,000 --> 00:23:40,600 847 | 不久前他动了回家的念头 848 | 849 | 213 850 | 00:23:40,600 --> 00:23:45,900 851 | 因为慕其年纪大了需要他多克一半多找过 852 | 853 | 214 854 | 00:23:45,900 --> 00:23:49,040 855 | 他也发现在新加坡许多年长者 856 | 857 | 215 858 | 00:23:53,160 --> 00:23:57,920 859 | 于是冰冰回国后就跟合伙人创办的一家公司 860 | 861 | 216 862 | 00:23:57,920 --> 00:24:01,340 863 | 叫做加恩后面起 864 | 865 | 217 866 | 00:24:05,580 --> 00:24:09,000 867 | 为有需要的家庭提供服务 868 | 869 | 218 870 | 00:24:09,000 --> 00:24:11,480 871 | 那就是通过网站和安 872 | 873 | 219 874 | 00:24:11,480 --> 00:24:18,040 875 | 为需要看路的年长者和提供这种服务的人配对起来 876 | 877 | 220 878 | 00:24:18,040 --> 00:24:24,860 879 | 就像颠倒的生活私家车的安培对司机和乘客李 880 | 881 | 221 882 | 00:24:24,860 --> 00:24:30,220 883 | 这些看护可能是学生或者是专业故事 884 | 885 | 222 886 | 00:24:30,220 --> 00:24:34,420 887 | 加人之所以成功是因为它利用科技 888 | 889 | 223 890 | 00:24:34,420 --> 00:24:37,840 891 | 把供求双方可以堆起来 892 | 893 | 224 894 | 00:24:43,100 --> 00:24:51,700 895 | 结合科技和服务提纲生活福祉使更多人受益 896 | 897 | 225 898 | 00:24:51,700 --> 00:24:55,560 899 | 五十二年来新加坡茁壮成干 900 | 901 | 226 902 | 00:24:55,560 --> 00:25:00,220 903 | 我们一起建设了一个温馨的家人 904 | 905 | 227 906 | 00:25:00,220 --> 00:25:04,380 907 | 在这个大家庭里父母的那一代努力付出 908 | 909 | 228 910 | 00:25:04,380 --> 00:25:11,080 911 | 给孩子最好的一切为他们的未来开拓机会 912 | 913 | 229 914 | 00:25:17,620 --> 00:25:23,780 915 | 很多年轻人在锅里狗国外闯出了一片天 916 | 917 | 230 918 | 00:25:23,780 --> 00:25:27,320 919 | 作为父母亲这让我们欣慰的 920 | 921 | 231 922 | 00:25:27,320 --> 00:25:32,640 923 | 就是看到孩子事业有成之后回到我们身边 924 | 925 | 232 926 | 00:25:32,640 --> 00:25:35,340 927 | 尤其是海外的游子 928 | 929 | 233 930 | 00:25:43,180 --> 00:25:48,320 931 | 尤其是海外的有着落叶归根 932 | 933 | 234 934 | 00:25:55,400 --> 00:26:00,180 935 | 我从许多年轻人的圣上感受到这股新加坡精神 936 | 937 | 235 938 | 00:26:00,180 --> 00:26:05,320 939 | 他们有知识有志气有勇气 940 | 941 | 236 942 | 00:26:09,600 --> 00:26:15,940 943 | 我有新型这些年轻人有能力能够带领新加坡前景 944 | 945 | 237 946 | 00:26:15,940 --> 00:26:20,120 947 | 创造一个更美好的新加坡谢谢大家 948 | -------------------------------------------------------------------------------- /data/zongli_original.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:00,740 --> 00:00:06,440 3 | 各位同胞,大家晚上好! 4 | 5 | 2 6 | 00:00:06,440 --> 00:00:12,000 7 | 今年是我们建国第52周年纪念。 8 | 9 | 3 10 | 00:00:12,000 --> 00:00:18,120 11 | 有如建国的初期,摆在我们眼前的是许多重大的问题 12 | 13 | 4 14 | 00:00:18,120 --> 00:00:25,040 15 | 比如恐怖主义、外交关系和经济发展。 16 | 17 | 5 18 | 00:00:25,040 --> 00:00:30,420 19 | 政府正在谨慎地、冷静地处理这些问题, 20 | 21 | 6 22 | 00:00:30,420 --> 00:00:35,600 23 | 希望得到人民全力的配合与支持。 24 | 25 | 7 26 | 00:00:35,600 --> 00:00:42,740 27 | 其中,我知道大家都很关心经济的展望和就业前景。 28 | 29 | 8 30 | 00:00:42,740 --> 00:00:48,420 31 | 我国的经济保持实力,今年的经济增长有起色, 32 | 33 | 9 34 | 00:00:48,420 --> 00:00:53,560 35 | 预计将达到百分之二点五,比去年好。 36 | 37 | 10 38 | 00:00:53,560 --> 00:01:01,180 39 | 更令人鼓舞的是,经济转型也取得进展,生产力有所提升。 40 | 41 | 11 42 | 00:01:01,180 --> 00:01:09,840 43 | 生产力的提升,将能给国人带来更好的工作,更高的收入。 44 | 45 | 12 46 | 00:01:09,840 --> 00:01:17,220 47 | 不过,经济转型的工作还没完成,我们还要付出更多努力。 48 | 49 | 13 50 | 00:01:17,220 --> 00:01:24,120 51 | 在转型的过程中,一些新加坡人失去工作,包括专业人士。 52 | 53 | 14 54 | 00:01:24,120 --> 00:01:33,300 55 | 我们正在协助他们接受再训练,寻找新工作,重新出发。 56 | 林瑞生部长就经常在各种活动上, 57 | 58 | 15 59 | 00:01:37,120 --> 00:01:44,000 60 | 分享政府有什么援助措施来帮助国人提升技能。 61 | 62 | 16 63 | 00:01:44,000 --> 00:01:51,040 64 | 这就是他出席的其中一场对话会 – Kopi Talk。 65 | 66 | 17 67 | 00:01:51,040 --> 00:01:59,180 68 | 政府也为商家提供各种援助,帮助他们提升业务,开拓市场。 69 | 70 | 18 71 | 00:01:59,180 --> 00:02:04,680 72 | 其中一家受惠的本地企业是 “老伴豆花”。 73 | 74 | 19 75 | 00:02:04,680 --> 00:02:11,180 76 | 在企发局 (IE Singapore)的协助下,他们在越南开了“小伴豆花”。 77 | 78 | 20 79 | 00:02:11,180 --> 00:02:13,980 80 | 我问他们为什么在越南叫做“小伴”, 81 | 他们说商标给人家拿了,其实是同一个 “老伴”。 82 | 83 | 21 84 | 00:02:19,200 --> 00:02:26,800 85 | 越南的“小伴”和新加坡的“老伴”,一样可口,一样受欢迎。 86 | 87 | 22 88 | 00:02:26,800 --> 00:02:32,480 89 | 我相信,只要政府,人民和企业通力合作, 90 | 我们的经济就能够继续稳健地发展, 91 | 92 | 23 93 | 00:02:36,340 --> 00:02:43,760 94 | 开创新的局面,创造良好的就业机会。 95 | 96 | 24 97 | 00:02:43,760 --> 00:02:47,200 98 | 加快经济转型是当务之急, 99 | 100 | 25 101 | 00:02:47,200 --> 00:02:51,860 102 | 这会直接影响我们的生活和饭碗。 103 | 104 | 26 105 | 00:02:51,860 --> 00:02:55,820 106 | 不过,要维持国家繁荣,社会稳定, 107 | 我们同时必须推行一些战略性, 108 | 109 | 27 110 | 00:02:59,560 --> 00:03:05,200 111 | 宏观的政策,为将来做好准备。 112 | 113 | 28 114 | 00:03:05,200 --> 00:03:12,060 115 | 所以,今晚我要着重谈三个攸关我国长远未来的课题: 116 | 117 | 29 118 | 00:03:12,060 --> 00:03:16,700 119 | 第一,如何提升学前教育 -- 120 | 121 | 30 122 | 00:03:16,700 --> 00:03:22,720 123 | 因为我们要让每一个孩子都能打下扎实 的基础, 124 | 125 | 31 126 | 00:03:22,720 --> 00:03:29,240 127 | 为他们争取更好的人生起跑点; 128 | 129 | 32 130 | 00:03:29,240 --> 00:03:34,200 131 | 第二,如何一起对抗糖尿病 -- 132 | 因为糖尿病患者不断增加, 133 | 134 | 33 135 | 00:03:36,900 --> 00:03:42,780 136 | 这会对个人和社会带来沉重的负担; 137 | 138 | 34 139 | 00:03:42,780 --> 00:03:47,480 140 | 第三,如何实现智慧国的愿景 -- 141 | 142 | 35 143 | 00:03:47,480 --> 00:03:50,840 144 | 因为我们要善加利用科技, 145 | 146 | 36 147 | 00:03:50,840 --> 00:03:58,600 148 | 为各阶层人民带来更好的生活和更多的机遇。 149 | 150 | 37 151 | 00:03:58,600 --> 00:04:02,860 152 | 让我先谈一谈如何改善学前教育。 153 | 154 | 38 155 | 00:04:02,860 --> 00:04:06,420 156 | 我们会从三方面着手: 157 | 第一,增加更多的托儿所和幼儿园名额; 158 | 159 | 39 160 | 00:04:12,200 --> 00:04:16,580 161 | 第二,提升学前教育的素质, 162 | 163 | 40 164 | 00:04:16,579 --> 00:04:21,799 165 | 并让孩子们从小打好双语的基础; 166 | 167 | 41 168 | 00:04:21,800 --> 00:04:25,540 169 | 第三,加强师资的培训, 170 | 171 | 42 172 | 00:04:25,540 --> 00:04:29,780 173 | 以吸引更多人加入这个专业。 174 | 我们最重要的目标, 175 | 176 | 43 177 | 00:04:31,840 --> 00:04:36,780 178 | 是为不同家庭背景的孩子提供良好的学前教育; 179 | 180 | 44 181 | 00:04:36,780 --> 00:04:40,960 182 | 我们尤其关注经济条件较差的孩子, 183 | 184 | 45 185 | 00:04:40,960 --> 00:04:44,780 186 | 确保他们不会输在人生的起跑点, 187 | 188 | 46 189 | 00:04:44,780 --> 00:04:49,680 190 | 使他们能够充分发挥所长。 191 | 192 | 47 193 | 00:04:49,680 --> 00:04:55,600 194 | 0到 6岁的孩子,学习和成长的速度都很快。 195 | 196 | 48 197 | 00:04:55,600 --> 00:05:01,240 198 | 这些幼童的大脑就像海绵一样,有很强的吸收能力。 199 | 200 | 49 201 | 00:05:01,240 --> 00:05:06,540 202 | 我们必须把握这个关键的发育阶段, 203 | 204 | 50 205 | 00:05:06,540 --> 00:05:11,740 206 | 让孩子们多接触语言、美术、音乐等。 207 | 208 | 51 209 | 00:05:11,740 --> 00:05:14,780 210 | 同时,让他们和同龄的孩子交朋友, 211 | 学习分享,学习控制情绪。 212 | 213 | 52 214 | 00:05:20,600 --> 00:05:26,620 215 | 研究显示,学习语言的最佳年龄就是0到3岁。 216 | 217 | 53 218 | 00:05:26,620 --> 00:05:33,600 219 | 这些幼童对语言学习特别敏感,接受能力很强。 220 | 221 | 54 222 | 00:05:33,600 --> 00:05:41,140 223 | 成年人也可以学习语言,但不容易上手,不容易说得流利。 224 | 比如,华语有“阴阳上去”四声, 225 | 226 | 55 227 | 00:05:45,700 --> 00:05:51,800 228 | 你如果年长之后才开始学,可能四声不分, 229 | 230 | 56 231 | 00:05:51,800 --> 00:05:57,440 232 | 听不出其中的差别,更无法准的确发音。 233 | 234 | 57 235 | 00:05:57,440 --> 00:06:01,060 236 | 发音不准,可能会闹出笑话。 237 | 238 | 58 239 | 00:06:01,060 --> 00:06:04,580 240 | 例如,学生要跟老师请教时, 241 | 242 | 59 243 | 00:06:04,580 --> 00:06:07,540 244 | 本来要说“我要问一问老师”, 245 | 246 | 60 247 | 00:06:07,540 --> 00:06:11,560 248 | 可能说成“我要闻一闻老师”, 249 | 250 | 61 251 | 00:06:11,560 --> 00:06:19,320 252 | 甚至 “我要吻一吻老师”,那就肯定不及格了。 253 | 254 | 62 255 | 00:06:19,320 --> 00:06:25,200 256 | 所以,学习准确的发音必须从小开始 。 257 | 258 | 63 259 | 00:06:25,200 --> 00:06:29,340 260 | 我母亲的经验,就能够说明这点。 261 | 262 | 64 263 | 00:06:29,340 --> 00:06:34,540 264 | 我母亲是在二战时期,20岁左右才开始学华语。 265 | 266 | 65 267 | 00:06:34,540 --> 00:06:41,900 268 | 她能读、能听、能说,不过很少用华语沟通。 269 | 有时人家以为她不会讲华语,就用华语畅谈,她就静静的听。 270 | 271 | 66 272 | 00:06:48,480 --> 00:06:52,900 273 | 我是到了多年后才发现,她不讲华语的原因: 274 | 有一天,她的朋友告诉她,她讲的是英式华语,有英式口音。 275 | 276 | 67 277 | 00:07:00,600 --> 00:07:06,400 278 | 或许妈妈觉得有点不好意思,过后就不讲华语了。 279 | 然而,我的父母亲很重视孩子的母语学习。 280 | 281 | 68 282 | 00:07:11,000 --> 00:07:15,920 283 | 我3岁时,父母就把我送到南洋幼稚园读书。 284 | 285 | 69 286 | 00:07:15,920 --> 00:07:21,560 287 | 他们希望我能在一个使用华文华语的学习环境里成长, 288 | 289 | 70 290 | 00:07:21,560 --> 00:07:25,300 291 | 打好华文的基础。 292 | 293 | 71 294 | 00:07:25,300 --> 00:07:32,080 295 | 在老师用心的教导下,我轻松、愉快地学习华文华语。 296 | 297 | 72 298 | 00:07:32,080 --> 00:07:37,980 299 | 可惜的是,在我的学生时代,没机会学标准发音, 300 | 301 | 73 302 | 00:07:37,980 --> 00:07:42,360 303 | 因为那时候汉语拼音还没有面世, 304 | 305 | 74 306 | 00:07:42,360 --> 00:07:46,660 307 | 所以我的华语带着南洋腔调。 308 | 309 | 75 310 | 00:07:46,660 --> 00:07:53,480 311 | 我十多年前 – 成年之后 – 才开始注意标准的发音。 312 | 313 | 76 314 | 00:07:53,480 --> 00:07:56,980 315 | 虽然我是华校生,还是觉得不容易, 316 | 317 | 77 318 | 00:07:56,980 --> 00:08:02,760 319 | 一直到现在,偶尔还是会走音。 320 | 321 | 78 322 | 00:08:02,760 --> 00:08:11,480 323 | 把shi和si声读错了,“电视” 读成 “电四”、 还有 “艺术” 读成 “艺速”、 324 | 325 | 79 326 | 00:08:11,480 --> 00:08:22,940 327 | 或把 “出发” 读成 “醋发“、“结果” 变成 “借果”,等。 328 | 329 | 80 330 | 00:08:22,940 --> 00:08:26,380 331 | 可见长大后学习语言真不容易, 332 | 333 | 81 334 | 00:08:26,380 --> 00:08:31,740 335 | 所以要早开始,最好幼儿时候就开始。 336 | 337 | 82 338 | 00:08:31,740 --> 00:08:37,740 339 | 从我自己和父母的经验来看,我们应该尽早学习语文。 340 | 341 | 83 342 | 00:08:37,740 --> 00:08:44,840 343 | 因此,我们决定通过学前教育,进一步巩固我们的双语政策。 344 | 345 | 84 346 | 00:08:44,840 --> 00:08:49,700 347 | 现在,许多家长都以英语和孩子沟通。 348 | 349 | 85 350 | 00:08:49,700 --> 00:08:56,800 351 | 母语在家里用得少,学校和母语教师的角色变得更为重要, 352 | 尤其是托儿所和幼儿园。 353 | 354 | 86 355 | 00:09:00,920 --> 00:09:06,840 356 | 由于学前教育对孩子的好处多,也能够发挥各种社会功用, 357 | 358 | 87 359 | 00:09:06,840 --> 00:09:15,000 360 | 政府于是决定加大力度,增加投资,以全面提升学前教育。 361 | 362 | 88 363 | 00:09:15,000 --> 00:09:25,040 364 | 五年前,政府在学前教育方面的年开支是今年的一半。 365 | 366 | 89 367 | 00:09:25,040 --> 00:09:34,440 368 | 五年后,政府这方面的年开支将比今年增加一倍。 369 | 370 | 90 371 | 00:09:34,440 --> 00:09:40,740 372 | 由此可见,政府对学前教育的重视和决心。 373 | 374 | 91 375 | 00:09:40,740 --> 00:09:45,600 376 | 我们希望这些投入有助于提升学前教育的素质, 377 | 378 | 92 379 | 00:09:45,600 --> 00:09:48,800 380 | 让政府资助的托儿所和幼儿园, 381 | 能够像政府资助的小学、中学一样优秀,一样普及。 382 | 383 | 93 384 | 00:09:55,920 --> 00:10:02,600 385 | 这样,所有孩子,无论贫富,都有公平竞争、力争上游的机会, 386 | 387 | 94 388 | 00:10:02,600 --> 00:10:05,940 389 | 进而为社会做出贡献。 390 | 391 | 95 392 | 00:10:05,940 --> 00:10:10,400 393 | 同时,我们将确保托儿所和幼儿园的学费, 394 | 是所有家长负担得起的。 395 | 396 | 96 397 | 00:10:15,160 --> 00:10:18,420 398 | 孩子能够得到良好的照顾,良好的教育, 399 | 400 | 97 401 | 00:10:18,420 --> 00:10:31,980 402 | 我希望这能够激励年轻夫妇多生几个孩子。 403 | 404 | 98 405 | 00:10:31,980 --> 00:10:36,480 406 | 接下来,我要谈的课题跟大家的健康有关, 407 | 408 | 99 409 | 00:10:36,480 --> 00:10:41,140 410 | 那就是糖尿病日益普遍的问题。 411 | 412 | 100 413 | 00:10:41,140 --> 00:10:45,900 414 | 许多人在听了我的国庆献词之后,感到有点纳闷 -- 415 | 416 | 101 417 | 00:10:45,900 --> 00:10:52,080 418 | 他们问,糖尿病值得在群众大会上高谈阔论吗? 419 | 420 | 102 421 | 00:10:52,080 --> 00:10:58,520 422 | 我的回答是:正因为很多人不担心,我才担心! 423 | 正因为很多人不把糖尿病当一回事, 424 | 425 | 103 426 | 00:11:02,000 --> 00:11:06,900 427 | 它今天才变成一个严重的问题! 428 | 429 | 104 430 | 00:11:06,900 --> 00:11:11,680 431 | 患上糖尿病的人逐年增加。 432 | 433 | 105 434 | 00:11:11,680 --> 00:11:17,020 435 | 你身边的亲戚朋友当中,不难发现糖尿病患者。 436 | 437 | 106 438 | 00:11:17,020 --> 00:11:26,100 439 | 60岁以上的国人,每10个人当中就有3个人患有糖尿病! 440 | 441 | 107 442 | 00:11:26,100 --> 00:11:32,060 443 | 此外,糖尿病一旦失控,就会出现严重的并发症。 444 | 例如:失明、心脏病、肾衰竭。 445 | 446 | 108 447 | 00:11:36,880 --> 00:11:42,620 448 | 有些患者还必须截肢,以保住性命。 449 | 450 | 109 451 | 00:11:42,620 --> 00:11:49,020 452 | 新加坡每年平均就有 1,200名 糖尿病患者必须截肢, 453 | 454 | 110 455 | 00:11:49,020 --> 00:11:56,560 456 | 每天三四个人,情况可能是全世界最严重的。 457 | 458 | 111 459 | 00:11:56,560 --> 00:12:00,340 460 | 钟丽慧议员就和我分享了这样一个故事: 461 | 462 | 112 463 | 00:12:00,340 --> 00:12:05,520 464 | 她进行家访时,见到一位男居民,他是糖尿病患者, 465 | 466 | 113 467 | 00:12:05,520 --> 00:12:11,240 468 | 只有40来岁,女儿正在上小学。 469 | 470 | 114 471 | 00:12:11,240 --> 00:12:15,160 472 | 这位男居民告诉丽慧,他下个星期 473 | 474 | 115 475 | 00:12:15,160 --> 00:12:21,080 476 | 就必须截肢,会失去一只脚。 477 | 478 | 116 479 | 00:12:21,080 --> 00:12:25,640 480 | 他的女儿和家人,还有丽慧,都很担心。 481 | 482 | 117 483 | 00:12:25,640 --> 00:12:29,240 484 | 因为接下来,他的生活起居需要家人照料, 485 | 486 | 118 487 | 00:12:29,240 --> 00:12:38,720 488 | 生活素质大受影响,同时也会打击他的工作能力和家庭的收入。 489 | 490 | 119 491 | 00:12:38,720 --> 00:12:46,600 492 | 所以,我们对待糖尿病绝对不能掉以轻心、不当一回事。 493 | 494 | 120 495 | 00:12:46,600 --> 00:12:52,560 496 | 糖尿病在本地很普遍、很严重,原因有几个: 497 | 首先,很多人以为,只有老年人才会患上糖尿病,其实不然。 498 | 499 | 121 500 | 00:13:00,680 --> 00:13:05,960 501 | 钟丽慧议员的居民,40多岁,就要截肢了, 502 | 503 | 122 504 | 00:13:05,960 --> 00:13:09,600 505 | 所以你可能还是中年人,甚至是年轻人, 506 | 507 | 123 508 | 00:13:09,600 --> 00:13:13,760 509 | 你也有面对糖尿病的风险。 510 | 511 | 124 512 | 00:13:13,760 --> 00:13:18,260 513 | 还有,糖尿病的初期症状不明显, 514 | 515 | 125 516 | 00:13:18,260 --> 00:13:21,840 517 | 所以你或许不知道自己患有糖尿病。 518 | 519 | 126 520 | 00:13:21,840 --> 00:13:27,500 521 | 更有一些人,虽然健康开始亮红灯,也不愿意去看医生, 522 | 523 | 127 524 | 00:13:27,500 --> 00:13:31,880 525 | 因为他们害怕听到坏消息。 526 | 527 | 128 528 | 00:13:31,880 --> 00:13:37,100 529 | 但是 “病从浅中医”,请大家不要怕看医生, 530 | 531 | 129 532 | 00:13:37,100 --> 00:13:40,400 533 | 要及早就医,听医生的话, 534 | 535 | 130 536 | 00:13:40,400 --> 00:13:47,360 537 | 改变生活方式、控制饮食、准时吃药。 538 | 539 | 131 540 | 00:13:47,360 --> 00:13:51,540 541 | 在这里,我也要给大家两个建议: 542 | 543 | 132 544 | 00:13:51,540 --> 00:13:56,740 545 | 第一,大家应该定期做身体健康检查。 546 | 547 | 133 548 | 00:13:56,740 --> 00:13:59,920 549 | 卫生部交代我替他们打个小广告, 550 | 551 | 134 552 | 00:13:59,920 --> 00:14:04,680 553 | 向大家推荐它们的健康检查优惠大减价。 554 | 555 | 135 556 | 00:14:04,680 --> 00:14:06,820 557 | 【笑声】 558 | 559 | 136 560 | 00:14:06,820 --> 00:14:10,560 561 | 从下个月起,如果你是40岁以上的国人, 562 | 只要付5块钱,就可以进行健康检查。 563 | 564 | 137 565 | 00:14:14,480 --> 00:14:20,980 566 | 这个配套的成本其实是一百多块钱,所以这是很大的优惠! 567 | 568 | 138 569 | 00:14:20,980 --> 00:14:27,940 570 | 【掌声】 571 | 572 | 139 573 | 00:14:27,940 --> 00:14:32,660 574 | 如果你认为这个优惠还不够, 575 | 那你可以参加基层组织安排的健康检查, 576 | 577 | 140 578 | 00:14:36,520 --> 00:14:39,820 579 | 看一看自己有没有“三高”。 580 | 581 | 141 582 | 00:14:39,820 --> 00:14:50,680 583 | 什么是“三高”?高血糖、高血压、高胆固醇。 584 | 第二,我们应该趁年轻时就开始养成良好的生活习惯, 585 | 586 | 142 587 | 00:14:57,580 --> 00:15:00,380 588 | 保持饮食均衡。 589 | 590 | 143 591 | 00:15:00,380 --> 00:15:04,940 592 | 所谓:养生之道,莫先于食。 593 | 594 | 144 595 | 00:15:04,940 --> 00:15:11,440 596 | 中医学里就有这样的概念,以食物当药材,调理身体。 597 | 598 | 145 599 | 00:15:11,440 --> 00:15:16,580 600 | 另外,我们还要控制体重、经常做运动。 601 | 602 | 146 603 | 00:15:16,580 --> 00:15:30,060 604 | 把自己的身体照顾好,才能健健康康地过充实的人生! 605 | 我今晚要谈的第三个课题是智慧国。 606 | 607 | 147 608 | 00:15:34,440 --> 00:15:36,280 609 | 什么是“智慧国”呢? 610 | 说到智慧国,大家可能会联想到电脑、互联网 611 | 612 | 148 613 | 00:15:42,120 --> 00:15:46,360 614 | 和高科技,这些所谓年轻人的玩意儿。 615 | 616 | 149 617 | 00:15:46,360 --> 00:15:51,840 618 | 实际上,智慧国就是通过现代科技让全体人民, 619 | 620 | 150 621 | 00:15:51,840 --> 00:15:58,840 622 | 无论老少,都能受惠,包括能改善年长者的日常生活。 623 | 624 | 151 625 | 00:15:58,840 --> 00:16:07,200 626 | 让我举一个例子,来解释资讯科技如何让独居的年长者的生活更安全。 627 | 628 | 152 629 | 00:16:07,200 --> 00:16:12,320 630 | 现在,我们常常见到独居的年老夫妇和单身老人。 631 | 632 | 153 633 | 00:16:12,320 --> 00:16:17,140 634 | 如何照顾这些独居老人是个很困难的问题。 635 | 万一他们在家里跌倒,或是身体不适,起不了床, 636 | 637 | 154 638 | 00:16:21,180 --> 00:16:26,200 639 | 我们要怎么知道,怎么才及时抢救? 640 | 641 | 155 642 | 00:16:26,200 --> 00:16:32,440 643 | 要解决这个生活中的实际问题,科技可以派上用场了。 644 | 645 | 156 646 | 00:16:32,440 --> 00:16:36,980 647 | 我们可以在年长者的住家安装智能感应器。 648 | 649 | 157 650 | 00:16:36,980 --> 00:16:45,720 651 | 像这张图表所显示的,你可以在门口和每个一房间安装一个。 652 | 653 | 158 654 | 00:16:45,720 --> 00:16:51,640 655 | 这个感应器的主要功能是探测家里的动静。 656 | 657 | 159 658 | 00:16:51,640 --> 00:16:56,600 659 | 感应器会学习分辨年长者的日常生活规律。 660 | 661 | 160 662 | 00:16:56,600 --> 00:17:02,180 663 | 比方说,他通常几点起床,准备早餐, 664 | 过后几点出门,用了午餐之后几点回家睡午觉等等。 665 | 666 | 161 667 | 00:17:09,000 --> 00:17:12,440 668 | 感应器探测不到这些日常生活的动静, 669 | 670 | 162 671 | 00:17:12,440 --> 00:17:15,560 672 | 便会及时通知家人。 673 | 674 | 163 675 | 00:17:15,560 --> 00:17:20,600 676 | 这样一来,家人可以及时反应,可以放心了。 677 | 678 | 164 679 | 00:17:20,599 --> 00:17:23,739 680 | 老人家也不必怕隐私会被侵犯, 681 | 682 | 165 683 | 00:17:23,740 --> 00:17:29,540 684 | 因为这些感应器不是监视器,也不是闭路电视。 685 | 686 | 166 687 | 00:17:29,540 --> 00:17:34,560 688 | 建屋局目前在一些年长者的住家试验这种感应系统。 689 | 690 | 167 691 | 00:17:34,560 --> 00:17:38,540 692 | 参与试验的,就包括一位廖女士。 693 | 694 | 168 695 | 00:17:38,540 --> 00:17:42,740 696 | 有一天,廖女士的儿子收到了系统发出的通知, 697 | 698 | 169 699 | 00:17:42,740 --> 00:17:46,380 700 | 知道母亲家里出现不寻常的状况, 701 | 702 | 170 703 | 00:17:46,380 --> 00:17:50,320 704 | 系统探测不到某种动静。 705 | 儿子于是尝试打电话给妈妈,却联络不上。 706 | 707 | 171 708 | 00:17:55,720 --> 00:18:01,060 709 | 他连忙赶去妈妈的家,才发现妈妈卧病在床。 710 | 711 | 172 712 | 00:18:01,060 --> 00:18:07,620 713 | 他马上陪妈妈去看医生,幸好最终平安无事。 714 | 715 | 173 716 | 00:18:07,620 --> 00:18:14,580 717 | 可见,现代科技可以解决生活的问题,人人都可获益; 718 | 719 | 174 720 | 00:18:14,580 --> 00:18:18,480 721 | 科技还可以帮助你谋生,赚一口饭吃, 722 | 723 | 175 724 | 00:18:18,480 --> 00:18:25,460 725 | 即使你不是专家,即使你已经一把年纪了。 726 | 727 | 176 728 | 00:18:25,460 --> 00:18:30,060 729 | 让我举一个例子:在市区工作的人, 730 | 731 | 177 732 | 00:18:30,060 --> 00:18:33,940 733 | 可能有注意到一位充满活力的大姐, 734 | 735 | 178 736 | 00:18:33,940 --> 00:18:40,160 737 | 经常穿街走巷,忙着为上班的人递送食物。 738 | 739 | 179 740 | 00:18:40,160 --> 00:18:44,960 741 | 这位送外卖的大姐是张玉兰女士。 742 | 743 | 180 744 | 00:18:44,960 --> 00:18:48,000 745 | 她今年70岁,比我大一点, 746 | 747 | 181 748 | 00:18:48,000 --> 00:18:53,120 749 | 会使用一些资讯科技,使工作更顺利。 750 | 751 | 182 752 | 00:18:53,120 --> 00:18:59,500 753 | 顾客很欣赏她,都叫她Wonder Woman,神奇女侠。 754 | 755 | 183 756 | 00:18:59,500 --> 00:19:06,780 757 | 她最近上了电视节目,让我们看一看这位神奇女侠的风采。 758 | 759 | 184 760 | 00:21:02,020 --> 00:21:12,440 761 | 【掌声】 762 | 763 | 185 764 | 00:21:12,440 --> 00:21:15,000 765 | 这位就是张大姐了! 766 | 767 | 186 768 | 00:21:15,000 --> 00:21:18,080 769 | 我们应该向张大姐学习 770 | 771 | 187 772 | 00:21:18,080 --> 00:21:22,840 773 | 那种乐观积极、活到老、学到老的精神。 774 | 775 | 188 776 | 00:21:22,840 --> 00:21:26,420 777 | 张大姐懂得抓紧数码时代的机会; 778 | 779 | 189 780 | 00:21:26,420 --> 00:21:32,160 781 | 一边工作赚钱,一边做运动,两全其美。 782 | 783 | 190 784 | 00:21:32,160 --> 00:21:35,520 785 | 张大姐做到的,比她年轻的人, 786 | 787 | 191 788 | 00:21:35,520 --> 00:21:41,660 789 | 肯定可以做得到,你说是不是? 790 | 791 | 192 792 | 00:21:41,660 --> 00:21:47,760 793 | 即使你不是“神奇女侠”,也可以学习掌握这些现代科技。 794 | 795 | 193 796 | 00:21:47,760 --> 00:21:51,520 797 | 比如,你可以先学用iPad看报纸。 798 | 799 | 194 800 | 00:21:51,520 --> 00:21:53,680 801 | 使用iPad还有其他好处: 802 | 803 | 195 804 | 00:21:53,680 --> 00:21:58,340 805 | 像我这样有老花眼的话,可以随意放大字体来看, 806 | 比较容易读,而且手指也不会沾上油墨, 807 | 808 | 196 809 | 00:22:03,040 --> 00:22:08,860 810 | 可以一手看报纸,一手吃包子,双手包办。 811 | 812 | 197 813 | 00:22:08,860 --> 00:22:11,640 814 | 【笑声】 815 | 816 | 198 817 | 00:22:11,640 --> 00:22:15,420 818 | 科技在大家的日常生活中所带来的好处, 819 | 820 | 199 821 | 00:22:15,420 --> 00:22:18,840 822 | 当然还有很多,不胜枚举。 823 | 所谓有心不怕迟,希望大家一起学习运用科技, 824 | 825 | 200 826 | 00:22:24,120 --> 00:22:30,060 827 | 让生活更便利、更安全、更丰富。 828 | 829 | 201 830 | 00:22:30,060 --> 00:22:34,800 831 | 新加坡具有实现智慧国愿景的条件。 832 | 833 | 202 834 | 00:22:34,800 --> 00:22:39,180 835 | 我们互联网的覆盖面广,速度也良好。 836 | 837 | 203 838 | 00:22:39,180 --> 00:22:43,160 839 | 我们向来也注重数理和工程方面的教育, 840 | 841 | 204 842 | 00:22:43,160 --> 00:22:47,880 843 | 培养了不少科技人才。 844 | 845 | 205 846 | 00:22:47,880 --> 00:22:51,380 847 | 他们有好些在海外打拼。 848 | 849 | 206 850 | 00:22:51,380 --> 00:22:54,740 851 | 去年,我到美国三藩市访问时, 852 | 853 | 207 854 | 00:22:54,740 --> 00:22:59,940 855 | 遇到不少新加坡人在那里从事资讯科技工作。 856 | 857 | 208 858 | 00:22:59,940 --> 00:23:03,160 859 | 我和他们进行了会面交流。 860 | 861 | 209 862 | 00:23:03,160 --> 00:23:10,360 863 | 他们多数是年轻人,当中不少曾经在美国深造。 864 | 毕业后留在当地创业,或在大型科技公司工作。 865 | 866 | 210 867 | 00:23:15,760 --> 00:23:18,900 868 | 我和他们分享了新加坡的智慧国策略, 869 | 870 | 211 871 | 00:23:18,900 --> 00:23:25,240 872 | 也邀请他们回到新加坡帮助我们实现这个愿景。 873 | 874 | 212 875 | 00:23:25,240 --> 00:23:29,600 876 | 其中一位是郑彬彬女士。 877 | 878 | 213 879 | 00:23:29,600 --> 00:23:32,740 880 | 郑女士旅居海外15年, 881 | 882 | 214 883 | 00:23:32,740 --> 00:23:38,000 884 | 在三藩市经营一家起步公司,成绩不错。 885 | 886 | 215 887 | 00:23:38,000 --> 00:23:40,600 888 | 不久前她动了回家的念头, 889 | 890 | 216 891 | 00:23:40,600 --> 00:23:45,900 892 | 因为母亲年纪大了,需要她多陪伴、多照顾。 893 | 894 | 217 895 | 00:23:45,900 --> 00:23:49,040 896 | 她也发现,在新加坡,许多年长者 897 | 也像她的母亲一样,需要他人照顾。 898 | 899 | 218 900 | 00:23:53,160 --> 00:23:57,920 901 | 于是,彬彬回国后,就跟合伙人创办了一家公司, 902 | 903 | 219 904 | 00:23:57,920 --> 00:24:01,340 905 | 叫做《家恩》(Homage)。 906 | 公司结合了科技和看护人员供求, 907 | 908 | 220 909 | 00:24:05,580 --> 00:24:09,000 910 | 为有需要的家庭提供服务。 911 | 912 | 221 913 | 00:24:09,000 --> 00:24:11,480 914 | 那就是通过网站和app, 915 | 916 | 222 917 | 00:24:11,480 --> 00:24:18,040 918 | 为需要看护的年长者,和提供这种服务的人配对起来, 919 | 920 | 223 921 | 00:24:18,040 --> 00:24:24,860 922 | 就像电召德士或私家车的app,配对司机和乘客一样。 923 | 924 | 224 925 | 00:24:24,860 --> 00:24:30,220 926 | 这些看护 可能是学生,或者是专业护士。 927 | 928 | 225 929 | 00:24:30,220 --> 00:24:34,420 930 | 《家恩》之所以成功,是因为它利用科技, 931 | 932 | 226 933 | 00:24:34,420 --> 00:24:37,840 934 | 把供求双方配对起来。 935 | 我希望我们的企业和政府部门向这间公司看齐, 936 | 937 | 227 938 | 00:24:43,100 --> 00:24:51,700 939 | 结合科技和服务,提高生活素质,使更多人受益。 940 | 941 | 228 942 | 00:24:51,700 --> 00:24:55,560 943 | 52年来,新加坡茁壮成长, 944 | 945 | 229 946 | 00:24:55,560 --> 00:25:00,220 947 | 我们一起建设了一个温馨的家园。 948 | 949 | 230 950 | 00:25:00,220 --> 00:25:04,380 951 | 在这个大家庭里,父母的那一代努力付出, 952 | 953 | 231 954 | 00:25:04,380 --> 00:25:11,080 955 | 给孩子最好的一切,为他们的未来开拓机会。 956 | 身为孩子的那一代,也很懂得把握机遇,力求上进。 957 | 958 | 232 959 | 00:25:17,620 --> 00:25:23,780 960 | 很多年轻人在国内或海外闯出一片天。 961 | 962 | 233 963 | 00:25:23,780 --> 00:25:27,320 964 | 而作为父母亲,最让我们欣慰的, 965 | 966 | 234 967 | 00:25:27,320 --> 00:25:32,640 968 | 就是看到孩子事业有成之后,回到我们身边。 969 | 970 | 235 971 | 00:25:32,640 --> 00:25:35,340 972 | 尤其是海外的游子。。。 973 | 【掌声】 974 | 975 | 236 976 | 00:25:43,180 --> 00:25:48,320 977 | 尤其是海外的游子落叶归根; 978 | 他们即使志在四方,还是很珍惜这个家,也就是新加坡。 979 | 980 | 237 981 | 00:25:55,400 --> 00:26:00,180 982 | 我从许多年轻人的身上感受到这股新加坡精神。 983 | 984 | 238 985 | 00:26:00,180 --> 00:26:05,320 986 | 他们有知识,有志气,有勇气。 987 | 他们有担当,也很爱家、爱国。 988 | 989 | 239 990 | 00:26:09,600 --> 00:26:15,940 991 | 我有信心这些年轻人有能力,能够带领新加坡前进, 992 | 993 | 240 994 | 00:26:15,940 --> 00:26:20,120 995 | 创造一个更美好的新加坡。谢谢大家! 996 | 【掌声】 -------------------------------------------------------------------------------- /lib/contrib/audio.py: -------------------------------------------------------------------------------- 1 | """Contains the audio segment class.""" 2 | import numpy as np 3 | import io 4 | import struct 5 | import re 6 | import soundfile 7 | import resampy 8 | from scipy import signal 9 | import random 10 | import copy 11 | 12 | 13 | class AudioSegment(object): 14 | """Monaural audio segment abstraction. 15 | 16 | :param samples: Audio samples [num_samples x num_channels]. 17 | :type samples: ndarray.float32 18 | :param sample_rate: Audio sample rate. 19 | :type sample_rate: int 20 | :raises TypeError: If the sample data type is not float or int. 21 | """ 22 | 23 | def __init__(self, samples, sample_rate): 24 | """Create audio segment from samples. 25 | 26 | Samples are convert float32 internally, with int scaled to [-1, 1]. 27 | """ 28 | self._samples = self._convert_samples_to_float32(samples) 29 | self._sample_rate = sample_rate 30 | if self._samples.ndim >= 2: 31 | self._samples = np.mean(self._samples, 1) 32 | 33 | def __eq__(self, other): 34 | """Return whether two objects are equal.""" 35 | if type(other) is not type(self): 36 | return False 37 | if self._sample_rate != other._sample_rate: 38 | return False 39 | if self._samples.shape != other._samples.shape: 40 | return False 41 | if np.any(self.samples != other._samples): 42 | return False 43 | return True 44 | 45 | def __ne__(self, other): 46 | """Return whether two objects are unequal.""" 47 | return not self.__eq__(other) 48 | 49 | def __str__(self): 50 | """Return human-readable representation of segment.""" 51 | return ("%s: num_samples=%d, sample_rate=%d, duration=%.2fsec, " 52 | "rms=%.2fdB" % (type(self), self.num_samples, self.sample_rate, 53 | self.duration, self.rms_db)) 54 | 55 | @classmethod 56 | def from_file(cls, file): 57 | """Create audio segment from audio file. 58 | 59 | :param filepath: Filepath or file object to audio file. 60 | :type filepath: basestring|file 61 | :return: Audio segment instance. 62 | :rtype: AudioSegment 63 | """ 64 | samples, sample_rate = soundfile.read(file, dtype='float32') 65 | return cls(samples, sample_rate) 66 | 67 | @classmethod 68 | def slice_from_file(cls, file, start=None, end=None): 69 | """Loads a small section of an audio without having to load 70 | the entire file into the memory which can be incredibly wasteful. 71 | 72 | :param file: Input audio filepath or file object. 73 | :type file: basestring|file 74 | :param start: Start time in seconds. If start is negative, it wraps 75 | around from the end. If not provided, this function 76 | reads from the very beginning. 77 | :type start: float 78 | :param end: End time in seconds. If end is negative, it wraps around 79 | from the end. If not provided, the default behvaior is 80 | to read to the end of the file. 81 | :type end: float 82 | :return: AudioSegment instance of the specified slice of the input 83 | audio file. 84 | :rtype: AudioSegment 85 | :raise ValueError: If start or end is incorrectly set, e.g. out of 86 | bounds in time. 87 | """ 88 | sndfile = soundfile.SoundFile(file) 89 | sample_rate = sndfile.samplerate 90 | duration = float(len(sndfile)) / sample_rate 91 | start = 0. if start is None else start 92 | end = 0. if end is None else end 93 | if start < 0.0: 94 | start += duration 95 | if end < 0.0: 96 | end += duration 97 | if start < 0.0: 98 | raise ValueError("The slice start position (%f s) is out of " 99 | "bounds." % start) 100 | if end < 0.0: 101 | raise ValueError("The slice end position (%f s) is out of bounds." % 102 | end) 103 | if start > end: 104 | raise ValueError("The slice start position (%f s) is later than " 105 | "the slice end position (%f s)." % (start, end)) 106 | if end > duration: 107 | raise ValueError("The slice end position (%f s) is out of bounds " 108 | "(> %f s)" % (end, duration)) 109 | start_frame = int(start * sample_rate) 110 | end_frame = int(end * sample_rate) 111 | sndfile.seek(start_frame) 112 | data = sndfile.read(frames=end_frame - start_frame, dtype='float32') 113 | return cls(data, sample_rate) 114 | 115 | @classmethod 116 | def from_sequence_file(cls, filepath): 117 | """Create audio segment from sequence file. Sequence file is a binary 118 | file containing a collection of multiple audio files, with several 119 | header bytes in the head indicating the offsets of each audio byte data 120 | chunk. 121 | 122 | The format is: 123 | 124 | 4 bytes (int, version), 125 | 4 bytes (int, num of utterance), 126 | 4 bytes (int, bytes per header), 127 | [bytes_per_header*(num_utterance+1)] bytes (offsets for each audio), 128 | audio_bytes_data_of_1st_utterance, 129 | audio_bytes_data_of_2nd_utterance, 130 | ...... 131 | 132 | Sequence file name must end with ".seqbin". And the filename of the 5th 133 | utterance's audio file in sequence file "xxx.seqbin" must be 134 | "xxx.seqbin_5", with "5" indicating the utterance index within this 135 | sequence file (starting from 1). 136 | 137 | :param filepath: Filepath of sequence file. 138 | :type filepath: basestring 139 | :return: Audio segment instance. 140 | :rtype: AudioSegment 141 | """ 142 | # parse filepath 143 | matches = re.match(r"(.+\.seqbin)_(\d+)", filepath) 144 | if matches is None: 145 | raise IOError("File type of %s is not supported" % filepath) 146 | filename = matches.group(1) 147 | fileno = int(matches.group(2)) 148 | 149 | # read headers 150 | f = open(filename, 'rb') 151 | version = f.read(4) 152 | num_utterances = struct.unpack("i", f.read(4))[0] 153 | bytes_per_header = struct.unpack("i", f.read(4))[0] 154 | header_bytes = f.read(bytes_per_header * (num_utterances + 1)) 155 | header = [ 156 | struct.unpack("i", header_bytes[bytes_per_header * i: 157 | bytes_per_header * (i + 1)])[0] 158 | for i in range(num_utterances + 1) 159 | ] 160 | 161 | # read audio bytes 162 | f.seek(header[fileno - 1]) 163 | audio_bytes = f.read(header[fileno] - header[fileno - 1]) 164 | f.close() 165 | 166 | # create audio segment 167 | try: 168 | return cls.from_bytes(audio_bytes) 169 | except Exception as e: 170 | samples = np.frombuffer(audio_bytes, dtype='int16') 171 | return cls(samples=samples, sample_rate=8000) 172 | 173 | @classmethod 174 | def from_bytes(cls, bytes): 175 | """Create audio segment from a byte string containing audio samples. 176 | 177 | :param bytes: Byte string containing audio samples. 178 | :type bytes: str 179 | :return: Audio segment instance. 180 | :rtype: AudioSegment 181 | """ 182 | samples, sample_rate = soundfile.read( 183 | io.BytesIO(bytes), dtype='float32') 184 | return cls(samples, sample_rate) 185 | 186 | @classmethod 187 | def concatenate(cls, *segments): 188 | """Concatenate an arbitrary number of audio segments together. 189 | 190 | :param *segments: Input audio segments to be concatenated. 191 | :type *segments: tuple of AudioSegment 192 | :return: Audio segment instance as concatenating results. 193 | :rtype: AudioSegment 194 | :raises ValueError: If the number of segments is zero, or if the 195 | sample_rate of any segments does not match. 196 | :raises TypeError: If any segment is not AudioSegment instance. 197 | """ 198 | # Perform basic sanity-checks. 199 | if len(segments) == 0: 200 | raise ValueError("No audio segments are given to concatenate.") 201 | sample_rate = segments[0]._sample_rate 202 | for seg in segments: 203 | if sample_rate != seg._sample_rate: 204 | raise ValueError("Can't concatenate segments with " 205 | "different sample rates") 206 | if type(seg) is not cls: 207 | raise TypeError("Only audio segments of the same type " 208 | "can be concatenated.") 209 | samples = np.concatenate([seg.samples for seg in segments]) 210 | return cls(samples, sample_rate) 211 | 212 | @classmethod 213 | def make_silence(cls, duration, sample_rate): 214 | """Creates a silent audio segment of the given duration and sample rate. 215 | 216 | :param duration: Length of silence in seconds. 217 | :type duration: float 218 | :param sample_rate: Sample rate. 219 | :type sample_rate: float 220 | :return: Silent AudioSegment instance of the given duration. 221 | :rtype: AudioSegment 222 | """ 223 | samples = np.zeros(int(duration * sample_rate)) 224 | return cls(samples, sample_rate) 225 | 226 | def to_wav_file(self, filepath, dtype='float32'): 227 | """Save audio segment to disk as wav file. 228 | 229 | :param filepath: WAV filepath or file object to save the 230 | audio segment. 231 | :type filepath: basestring|file 232 | :param dtype: Subtype for audio file. Options: 'int16', 'int32', 233 | 'float32', 'float64'. Default is 'float32'. 234 | :type dtype: str 235 | :raises TypeError: If dtype is not supported. 236 | """ 237 | samples = self._convert_samples_from_float32(self._samples, dtype) 238 | subtype_map = { 239 | 'int16': 'PCM_16', 240 | 'int32': 'PCM_32', 241 | 'float32': 'FLOAT', 242 | 'float64': 'DOUBLE' 243 | } 244 | soundfile.write( 245 | filepath, 246 | samples, 247 | self._sample_rate, 248 | format='WAV', 249 | subtype=subtype_map[dtype]) 250 | 251 | def superimpose(self, other): 252 | """Add samples from another segment to those of this segment 253 | (sample-wise addition, not segment concatenation). 254 | 255 | Note that this is an in-place transformation. 256 | 257 | :param other: Segment containing samples to be added in. 258 | :type other: AudioSegments 259 | :raise TypeError: If type of two segments don't match. 260 | :raise ValueError: If the sample rates of the two segments are not 261 | equal, or if the lengths of segments don't match. 262 | """ 263 | if isinstance(other, type(self)): 264 | raise TypeError("Cannot add segments of different types: %s " 265 | "and %s." % (type(self), type(other))) 266 | if self._sample_rate != other._sample_rate: 267 | raise ValueError("Sample rates must match to add segments.") 268 | if len(self._samples) != len(other._samples): 269 | raise ValueError("Segment lengths must match to add segments.") 270 | self._samples += other._samples 271 | 272 | def to_bytes(self, dtype='float32'): 273 | """Create a byte string containing the audio content. 274 | 275 | :param dtype: Data type for export samples. Options: 'int16', 'int32', 276 | 'float32', 'float64'. Default is 'float32'. 277 | :type dtype: str 278 | :return: Byte string containing audio content. 279 | :rtype: str 280 | """ 281 | samples = self._convert_samples_from_float32(self._samples, dtype) 282 | return samples.tostring() 283 | 284 | def gain_db(self, gain): 285 | """Apply gain in decibels to samples. 286 | 287 | Note that this is an in-place transformation. 288 | 289 | :param gain: Gain in decibels to apply to samples. 290 | :type gain: float|1darray 291 | """ 292 | self._samples *= 10.**(gain / 20.) 293 | 294 | def change_speed(self, speed_rate): 295 | """Change the audio speed by linear interpolation. 296 | 297 | Note that this is an in-place transformation. 298 | 299 | :param speed_rate: Rate of speed change: 300 | speed_rate > 1.0, speed up the audio; 301 | speed_rate = 1.0, unchanged; 302 | speed_rate < 1.0, slow down the audio; 303 | speed_rate <= 0.0, not allowed, raise ValueError. 304 | :type speed_rate: float 305 | :raises ValueError: If speed_rate <= 0.0. 306 | """ 307 | if speed_rate <= 0: 308 | raise ValueError("speed_rate should be greater than zero.") 309 | old_length = self._samples.shape[0] 310 | new_length = int(old_length / speed_rate) 311 | old_indices = np.arange(old_length) 312 | new_indices = np.linspace(start=0, stop=old_length, num=new_length) 313 | self._samples = np.interp(new_indices, old_indices, self._samples) 314 | 315 | def normalize(self, target_db=-20, max_gain_db=300.0): 316 | """Normalize audio to be of the desired RMS value in decibels. 317 | 318 | Note that this is an in-place transformation. 319 | 320 | :param target_db: Target RMS value in decibels. This value should be 321 | less than 0.0 as 0.0 is full-scale audio. 322 | :type target_db: float 323 | :param max_gain_db: Max amount of gain in dB that can be applied for 324 | normalization. This is to prevent nans when 325 | attempting to normalize a signal consisting of 326 | all zeros. 327 | :type max_gain_db: float 328 | :raises ValueError: If the required gain to normalize the segment to 329 | the target_db value exceeds max_gain_db. 330 | """ 331 | gain = target_db - self.rms_db 332 | if gain > max_gain_db: 333 | raise ValueError( 334 | "Unable to normalize segment to %f dB because the " 335 | "the probable gain have exceeds max_gain_db (%f dB)" % 336 | (target_db, max_gain_db)) 337 | self.gain_db(min(max_gain_db, target_db - self.rms_db)) 338 | 339 | def normalize_online_bayesian(self, 340 | target_db, 341 | prior_db, 342 | prior_samples, 343 | startup_delay=0.0): 344 | """Normalize audio using a production-compatible online/causal 345 | algorithm. This uses an exponential likelihood and gamma prior to 346 | make online estimates of the RMS even when there are very few samples. 347 | 348 | Note that this is an in-place transformation. 349 | 350 | :param target_db: Target RMS value in decibels. 351 | :type target_bd: float 352 | :param prior_db: Prior RMS estimate in decibels. 353 | :type prior_db: float 354 | :param prior_samples: Prior strength in number of samples. 355 | :type prior_samples: float 356 | :param startup_delay: Default 0.0s. If provided, this function will 357 | accrue statistics for the first startup_delay 358 | seconds before applying online normalization. 359 | :type startup_delay: float 360 | """ 361 | # Estimate total RMS online. 362 | startup_sample_idx = min(self.num_samples - 1, 363 | int(self.sample_rate * startup_delay)) 364 | prior_mean_squared = 10.**(prior_db / 10.) 365 | prior_sum_of_squares = prior_mean_squared * prior_samples 366 | cumsum_of_squares = np.cumsum(self.samples**2) 367 | sample_count = np.arange(self.num_samples) + 1 368 | if startup_sample_idx > 0: 369 | cumsum_of_squares[:startup_sample_idx] = \ 370 | cumsum_of_squares[startup_sample_idx] 371 | sample_count[:startup_sample_idx] = \ 372 | sample_count[startup_sample_idx] 373 | mean_squared_estimate = ((cumsum_of_squares + prior_sum_of_squares) / 374 | (sample_count + prior_samples)) 375 | rms_estimate_db = 10 * np.log10(mean_squared_estimate) 376 | # Compute required time-varying gain. 377 | gain_db = target_db - rms_estimate_db 378 | self.gain_db(gain_db) 379 | 380 | def resample(self, target_sample_rate, filter='kaiser_best'): 381 | """Resample the audio to a target sample rate. 382 | 383 | Note that this is an in-place transformation. 384 | 385 | :param target_sample_rate: Target sample rate. 386 | :type target_sample_rate: int 387 | :param filter: The resampling filter to use one of {'kaiser_best', 388 | 'kaiser_fast'}. 389 | :type filter: str 390 | """ 391 | self._samples = resampy.resample( 392 | self.samples, self.sample_rate, target_sample_rate, filter=filter) 393 | self._sample_rate = target_sample_rate 394 | 395 | def pad_silence(self, duration, sides='both'): 396 | """Pad this audio sample with a period of silence. 397 | 398 | Note that this is an in-place transformation. 399 | 400 | :param duration: Length of silence in seconds to pad. 401 | :type duration: float 402 | :param sides: Position for padding: 403 | 'beginning' - adds silence in the beginning; 404 | 'end' - adds silence in the end; 405 | 'both' - adds silence in both the beginning and the end. 406 | :type sides: str 407 | :raises ValueError: If sides is not supported. 408 | """ 409 | if duration == 0.0: 410 | return self 411 | cls = type(self) 412 | silence = self.make_silence(duration, self._sample_rate) 413 | if sides == "beginning": 414 | padded = cls.concatenate(silence, self) 415 | elif sides == "end": 416 | padded = cls.concatenate(self, silence) 417 | elif sides == "both": 418 | padded = cls.concatenate(silence, self, silence) 419 | else: 420 | raise ValueError("Unknown value for the sides %s" % sides) 421 | self._samples = padded._samples 422 | 423 | def shift(self, shift_ms): 424 | """Shift the audio in time. If `shift_ms` is positive, shift with time 425 | advance; if negative, shift with time delay. Silence are padded to 426 | keep the duration unchanged. 427 | 428 | Note that this is an in-place transformation. 429 | 430 | :param shift_ms: Shift time in millseconds. If positive, shift with 431 | time advance; if negative; shift with time delay. 432 | :type shift_ms: float 433 | :raises ValueError: If shift_ms is longer than audio duration. 434 | """ 435 | if abs(shift_ms) / 1000.0 > self.duration: 436 | raise ValueError("Absolute value of shift_ms should be smaller " 437 | "than audio duration.") 438 | shift_samples = int(shift_ms * self._sample_rate / 1000) 439 | if shift_samples > 0: 440 | # time advance 441 | self._samples[:-shift_samples] = self._samples[shift_samples:] 442 | self._samples[-shift_samples:] = 0 443 | elif shift_samples < 0: 444 | # time delay 445 | self._samples[-shift_samples:] = self._samples[:shift_samples] 446 | self._samples[:-shift_samples] = 0 447 | 448 | def subsegment(self, start_sec=None, end_sec=None): 449 | """Cut the AudioSegment between given boundaries. 450 | 451 | Note that this is an in-place transformation. 452 | 453 | :param start_sec: Beginning of subsegment in seconds. 454 | :type start_sec: float 455 | :param end_sec: End of subsegment in seconds. 456 | :type end_sec: float 457 | :raise ValueError: If start_sec or end_sec is incorrectly set, e.g. out 458 | of bounds in time. 459 | """ 460 | start_sec = 0.0 if start_sec is None else start_sec 461 | end_sec = self.duration if end_sec is None else end_sec 462 | if start_sec < 0.0: 463 | start_sec = self.duration + start_sec 464 | if end_sec < 0.0: 465 | end_sec = self.duration + end_sec 466 | if start_sec < 0.0: 467 | raise ValueError("The slice start position (%f s) is out of " 468 | "bounds." % start_sec) 469 | if end_sec < 0.0: 470 | raise ValueError("The slice end position (%f s) is out of bounds." % 471 | end_sec) 472 | if start_sec > end_sec: 473 | raise ValueError("The slice start position (%f s) is later than " 474 | "the end position (%f s)." % (start_sec, end_sec)) 475 | if end_sec > self.duration: 476 | raise ValueError("The slice end position (%f s) is out of bounds " 477 | "(> %f s)" % (end_sec, self.duration)) 478 | start_sample = int(round(start_sec * self._sample_rate)) 479 | end_sample = int(round(end_sec * self._sample_rate)) 480 | self._samples = self._samples[start_sample:end_sample] 481 | 482 | def random_subsegment(self, subsegment_length, rng=None): 483 | """Cut the specified length of the audiosegment randomly. 484 | 485 | Note that this is an in-place transformation. 486 | 487 | :param subsegment_length: Subsegment length in seconds. 488 | :type subsegment_length: float 489 | :param rng: Random number generator state. 490 | :type rng: random.Random 491 | :raises ValueError: If the length of subsegment is greater than 492 | the origineal segemnt. 493 | """ 494 | rng = random.Random() if rng is None else rng 495 | if subsegment_length > self.duration: 496 | raise ValueError("Length of subsegment must not be greater " 497 | "than original segment.") 498 | start_time = rng.uniform(0.0, self.duration - subsegment_length) 499 | self.subsegment(start_time, start_time + subsegment_length) 500 | 501 | def convolve(self, impulse_segment, allow_resample=False): 502 | """Convolve this audio segment with the given impulse segment. 503 | 504 | Note that this is an in-place transformation. 505 | 506 | :param impulse_segment: Impulse response segments. 507 | :type impulse_segment: AudioSegment 508 | :param allow_resample: Indicates whether resampling is allowed when 509 | the impulse_segment has a different sample 510 | rate from this signal. 511 | :type allow_resample: bool 512 | :raises ValueError: If the sample rate is not match between two 513 | audio segments when resample is not allowed. 514 | """ 515 | if allow_resample and self.sample_rate != impulse_segment.sample_rate: 516 | impulse_segment.resample(self.sample_rate) 517 | if self.sample_rate != impulse_segment.sample_rate: 518 | raise ValueError("Impulse segment's sample rate (%d Hz) is not " 519 | "equal to base signal sample rate (%d Hz)." % 520 | (impulse_segment.sample_rate, self.sample_rate)) 521 | samples = signal.fftconvolve(self.samples, impulse_segment.samples, 522 | "full") 523 | self._samples = samples 524 | 525 | def convolve_and_normalize(self, impulse_segment, allow_resample=False): 526 | """Convolve and normalize the resulting audio segment so that it 527 | has the same average power as the input signal. 528 | 529 | Note that this is an in-place transformation. 530 | 531 | :param impulse_segment: Impulse response segments. 532 | :type impulse_segment: AudioSegment 533 | :param allow_resample: Indicates whether resampling is allowed when 534 | the impulse_segment has a different sample 535 | rate from this signal. 536 | :type allow_resample: bool 537 | """ 538 | target_db = self.rms_db 539 | self.convolve(impulse_segment, allow_resample=allow_resample) 540 | self.normalize(target_db) 541 | 542 | def add_noise(self, 543 | noise, 544 | snr_dB, 545 | allow_downsampling=False, 546 | max_gain_db=300.0, 547 | rng=None): 548 | """Add the given noise segment at a specific signal-to-noise ratio. 549 | If the noise segment is longer than this segment, a random subsegment 550 | of matching length is sampled from it and used instead. 551 | 552 | Note that this is an in-place transformation. 553 | 554 | :param noise: Noise signal to add. 555 | :type noise: AudioSegment 556 | :param snr_dB: Signal-to-Noise Ratio, in decibels. 557 | :type snr_dB: float 558 | :param allow_downsampling: Whether to allow the noise signal to be 559 | downsampled to match the base signal sample 560 | rate. 561 | :type allow_downsampling: bool 562 | :param max_gain_db: Maximum amount of gain to apply to noise signal 563 | before adding it in. This is to prevent attempting 564 | to apply infinite gain to a zero signal. 565 | :type max_gain_db: float 566 | :param rng: Random number generator state. 567 | :type rng: None|random.Random 568 | :raises ValueError: If the sample rate does not match between the two 569 | audio segments when downsampling is not allowed, or 570 | if the duration of noise segments is shorter than 571 | original audio segments. 572 | """ 573 | rng = random.Random() if rng is None else rng 574 | if allow_downsampling and noise.sample_rate > self.sample_rate: 575 | noise = noise.resample(self.sample_rate) 576 | if noise.sample_rate != self.sample_rate: 577 | raise ValueError("Noise sample rate (%d Hz) is not equal to base " 578 | "signal sample rate (%d Hz)." % (noise.sample_rate, 579 | self.sample_rate)) 580 | if noise.duration < self.duration: 581 | raise ValueError("Noise signal (%f sec) must be at least as long as" 582 | " base signal (%f sec)." % 583 | (noise.duration, self.duration)) 584 | noise_gain_db = min(self.rms_db - noise.rms_db - snr_dB, max_gain_db) 585 | noise_new = copy.deepcopy(noise) 586 | noise_new.random_subsegment(self.duration, rng=rng) 587 | noise_new.gain_db(noise_gain_db) 588 | self.superimpose(noise_new) 589 | 590 | @property 591 | def samples(self): 592 | """Return audio samples. 593 | 594 | :return: Audio samples. 595 | :rtype: ndarray 596 | """ 597 | return self._samples.copy() 598 | 599 | @property 600 | def sample_rate(self): 601 | """Return audio sample rate. 602 | 603 | :return: Audio sample rate. 604 | :rtype: int 605 | """ 606 | return self._sample_rate 607 | 608 | @property 609 | def num_samples(self): 610 | """Return number of samples. 611 | 612 | :return: Number of samples. 613 | :rtype: int 614 | """ 615 | return self._samples.shape[0] 616 | 617 | @property 618 | def duration(self): 619 | """Return audio duration. 620 | 621 | :return: Audio duration in seconds. 622 | :rtype: float 623 | """ 624 | return self._samples.shape[0] / float(self._sample_rate) 625 | 626 | @property 627 | def rms_db(self): 628 | """Return root mean square energy of the audio in decibels. 629 | 630 | :return: Root mean square energy in decibels. 631 | :rtype: float 632 | """ 633 | # square root => multiply by 10 instead of 20 for dBs 634 | mean_square = np.mean(self._samples**2) 635 | return 10 * np.log10(mean_square) 636 | 637 | def _convert_samples_to_float32(self, samples): 638 | """Convert sample type to float32. 639 | 640 | Audio sample type is usually integer or float-point. 641 | Integers will be scaled to [-1, 1] in float32. 642 | """ 643 | float32_samples = samples.astype('float32') 644 | if samples.dtype in np.sctypes['int']: 645 | bits = np.iinfo(samples.dtype).bits 646 | float32_samples *= (1. / 2**(bits - 1)) 647 | elif samples.dtype in np.sctypes['float']: 648 | pass 649 | else: 650 | raise TypeError("Unsupported sample type: %s." % samples.dtype) 651 | return float32_samples 652 | 653 | def _convert_samples_from_float32(self, samples, dtype): 654 | """Convert sample type from float32 to dtype. 655 | 656 | Audio sample type is usually integer or float-point. For integer 657 | type, float32 will be rescaled from [-1, 1] to the maximum range 658 | supported by the integer type. 659 | 660 | This is for writing a audio file. 661 | """ 662 | dtype = np.dtype(dtype) 663 | output_samples = samples.copy() 664 | if dtype in np.sctypes['int']: 665 | bits = np.iinfo(dtype).bits 666 | output_samples *= (2**(bits - 1) / 1.) 667 | min_val = np.iinfo(dtype).min 668 | max_val = np.iinfo(dtype).max 669 | output_samples[output_samples > max_val] = max_val 670 | output_samples[output_samples < min_val] = min_val 671 | elif samples.dtype in np.sctypes['float']: 672 | min_val = np.finfo(dtype).min 673 | max_val = np.finfo(dtype).max 674 | output_samples[output_samples > max_val] = max_val 675 | output_samples[output_samples < min_val] = min_val 676 | else: 677 | raise TypeError("Unsupported sample type: %s." % samples.dtype) 678 | return output_samples.astype(dtype) 679 | -------------------------------------------------------------------------------- /data/yixi.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:15,870 --> 00:00:16,800 3 | 大家好 4 | 5 | 2 6 | 00:00:16,800 --> 00:00:19,300 7 | 或持来自华中科学大学的章洛伊 8 | 9 | 3 10 | 00:00:19,600 --> 00:00:21,300 11 | 我今天给伊达家呆了一个官 12 | 13 | 4 14 | 00:00:21,300 --> 00:00:24,150 15 | 在一个关于我们为什么要睡觉的演讲 16 | 17 | 5 18 | 00:00:29,500 --> 00:00:32,100 19 | 我们已身中带来有三分之一的时间 20 | 21 | 6 22 | 00:00:32,100 --> 00:00:33,800 23 | 是在睡眠中度过的 24 | 25 | 7 26 | 00:00:36,400 --> 00:00:38,270 27 | 你从出生到现在 28 | 29 | 8 30 | 00:00:38,270 --> 00:00:40,100 31 | 先大概睡了能有十年的叫了 32 | 33 | 9 34 | 00:00:40,470 --> 00:00:45,370 35 | 如果从一个跟宏大的岩画的背景上面来看的话 36 | 37 | 10 38 | 00:00:45,570 --> 00:00:47,220 39 | 其实睡眠这个现象 40 | 41 | 11 42 | 00:00:47,270 --> 00:00:50,120 43 | 在地球上出现了已经有数亿年了 44 | 45 | 12 46 | 00:00:50,250 --> 00:00:53,100 47 | 就是地球上的动物均水了基因链的角恶 48 | 49 | 13 50 | 00:00:53,520 --> 00:00:57,700 51 | 从一个最简单的蠕虫类的东贤重 52 | 53 | 14 54 | 00:00:57,700 --> 00:00:59,700 55 | 老根复杂的生物 56 | 57 | 15 58 | 00:00:59,900 --> 00:01:01,250 59 | 比如说昆虫 60 | 61 | 16 62 | 00:01:01,370 --> 00:01:03,270 63 | 然后还有一些鱼类 64 | 65 | 17 66 | 00:01:03,920 --> 00:01:06,220 67 | 还有一些哺乳动物 68 | 69 | 18 70 | 00:01:06,270 --> 00:01:10,570 71 | 就又跟我们人类跟接近的这种类似睡眠的状态 72 | 73 | 19 74 | 00:01:12,320 --> 00:01:14,400 75 | 所以试了很多年的交 76 | 77 | 20 78 | 00:01:14,550 --> 00:01:17,470 79 | 其实我们并不是特别清楚 80 | 81 | 21 82 | 00:01:17,520 --> 00:01:19,620 83 | 我们到底是怎么睡觉或者说 84 | 85 | 22 86 | 00:01:19,720 --> 00:01:21,250 87 | 睡眠是怎么发生的 88 | 89 | 23 90 | 00:01:21,750 --> 00:01:25,170 91 | 要研究这个问题的话 92 | 93 | 24 94 | 00:01:25,350 --> 00:01:29,020 95 | 我们首先要搞清楚到底什么是睡眠 96 | 97 | 25 98 | 00:01:29,920 --> 00:01:32,220 99 | 我们睡眠从第一章来说 100 | 101 | 26 102 | 00:01:32,220 --> 00:01:37,270 103 | 它是一种行为上禁止而且觉醒阈值身高的状态 104 | 105 | 27 106 | 00:01:37,420 --> 00:01:39,600 107 | 这个觉醒阈值是什么意思呢 108 | 109 | 28 110 | 00:01:39,850 --> 00:01:43,620 111 | 就是说当动物或者我们人进入到睡眠的状态以后 112 | 113 | 29 114 | 00:01:43,950 --> 00:01:48,500 115 | 需要更强的刺激才能让我们或者让动物做出反应 116 | 117 | 30 118 | 00:01:48,500 --> 00:01:51,600 119 | 这个是一个周边邻的老电影的学段 120 | 121 | 31 122 | 00:01:52,000 --> 00:01:54,320 123 | 那从这个里面我们可以看到 124 | 125 | 32 126 | 00:01:54,900 --> 00:01:56,950 127 | 一只狗在他醒酒的时候 128 | 129 | 33 130 | 00:01:56,950 --> 00:01:59,650 131 | 我们只要接近他他就会有反映 132 | 133 | 34 134 | 00:01:59,670 --> 00:02:01,450 135 | 但是当这个狗睡觉了 136 | 137 | 35 138 | 00:02:01,570 --> 00:02:04,720 139 | 我们临他到耳朵根他的一把 140 | 141 | 36 142 | 00:02:04,720 --> 00:02:05,600 143 | 他都没有反应 144 | 145 | 37 146 | 00:02:05,600 --> 00:02:07,750 147 | 这就是决心与纸的身高 148 | 149 | 38 150 | 00:02:08,870 --> 00:02:11,050 151 | 如果要研究睡眠的话 152 | 153 | 39 154 | 00:02:11,050 --> 00:02:13,470 155 | 我是边还有两个基本的特就 156 | 157 | 40 158 | 00:02:14,070 --> 00:02:17,050 159 | 一个就是睡眠再会积累 160 | 161 | 41 162 | 00:02:17,100 --> 00:02:18,470 163 | 去了较北部 164 | 165 | 42 166 | 00:02:18,550 --> 00:02:21,050 167 | 这个再生非常有一个专有的名称 168 | 169 | 43 170 | 00:02:21,050 --> 00:02:23,520 171 | 我们把它叫做睡眠的稳态平衡 172 | 173 | 44 174 | 00:02:24,000 --> 00:02:25,450 175 | 然后另外一点就是水 176 | 177 | 45 178 | 00:02:25,450 --> 00:02:28,570 179 | 就是睡眠一般发生在一天中相对固定的时段 180 | 181 | 46 182 | 00:02:28,870 --> 00:02:31,850 183 | 对宇宙性动物就是白天活动的动物 184 | 185 | 47 186 | 00:02:31,850 --> 00:02:32,870 187 | 比如说我们人类 188 | 189 | 48 190 | 00:02:33,100 --> 00:02:35,120 191 | 睡眠通常发生在夜间 192 | 193 | 49 194 | 00:02:35,400 --> 00:02:37,670 195 | 而对于夜行动物比如说小数 196 | 197 | 50 198 | 00:02:37,820 --> 00:02:39,700 199 | 那睡眠通常法人在白天 200 | 201 | 51 202 | 00:02:40,300 --> 00:02:44,070 203 | 能么要验证睡眠的话我们首先要能够测量睡眠 204 | 205 | 52 206 | 00:02:44,270 --> 00:02:46,800 207 | 最标准的测量睡眠的方法 208 | 209 | 53 210 | 00:02:46,800 --> 00:02:48,450 211 | 就是通过监测腦電波 212 | 213 | 54 214 | 00:02:48,720 --> 00:02:52,170 215 | 老电波是由我们脑内的神经元产生的 216 | 217 | 55 218 | 00:02:52,300 --> 00:02:56,970 219 | 然后神经元是我们脑内最重要的一种神经细胞 220 | 221 | 56 222 | 00:02:58,020 --> 00:03:02,320 223 | 他他在齿形它的功能的时候 224 | 225 | 57 226 | 00:03:05,270 --> 00:03:09,320 227 | 这种方便体现在整个脑的层面竟是脑电波 228 | 229 | 58 230 | 00:03:09,750 --> 00:03:11,970 231 | 在我们醒着和睡着的时候 232 | 233 | 59 234 | 00:03:12,150 --> 00:03:15,400 235 | 脑电波发放的平率和模式是不一样的 236 | 237 | 60 238 | 00:03:15,650 --> 00:03:17,720 239 | 所以通过这种方式 240 | 241 | 61 242 | 00:03:17,720 --> 00:03:20,070 243 | 就可以判断这个人或者这个动物 244 | 245 | 62 246 | 00:03:20,070 --> 00:03:23,100 247 | 动物是处于清醒的状态还是睡眠的状态 248 | 249 | 63 250 | 00:03:24,020 --> 00:03:27,800 251 | 们这边又变得就有一些典型的脑电波的代表土 252 | 253 | 64 254 | 00:03:27,970 --> 00:03:30,970 255 | 对对于色地使我们清醒的时候的闹过 256 | 257 | 65 258 | 00:03:31,020 --> 00:03:34,420 259 | 根据睡眠状态的时候我们的眼球是否转动 260 | 261 | 66 262 | 00:03:34,550 --> 00:03:38,650 263 | 睡眠又会被分为动眼睡眠和不动眼睡眠 264 | 265 | 67 266 | 00:03:38,920 --> 00:03:41,050 267 | 动睡眠不说我们人类可有的 268 | 269 | 68 270 | 00:03:41,050 --> 00:03:43,100 271 | 我们通常我所说的几个做梦 272 | 273 | 69 274 | 00:03:44,700 --> 00:03:47,800 275 | 大家可能觉得做工很高阶的中线向 276 | 277 | 70 278 | 00:03:47,870 --> 00:03:50,300 279 | 但是在骑士东野的水里面这个阶段 280 | 281 | 71 282 | 00:03:50,620 --> 00:03:53,770 283 | 在一些爬行类动物在一些鱼类究竟 284 | 285 | 72 286 | 00:03:53,770 --> 00:03:54,950 287 | 就已经拍时出现了 288 | 289 | 73 290 | 00:03:55,150 --> 00:03:57,100 291 | 所以可能不止我们人会做梦 292 | 293 | 74 294 | 00:03:57,320 --> 00:03:58,750 295 | 包括小刷 296 | 297 | 75 298 | 00:03:58,750 --> 00:04:03,220 299 | 然后写鱼鸟可能都可以做梦 300 | 301 | 76 302 | 00:04:03,520 --> 00:04:07,050 303 | 我动员睡眠的根据台的脑电波发放模式的不同 304 | 305 | 77 306 | 00:04:07,050 --> 00:04:10,370 307 | 不会被分为一根儿和恩善散的阶段 308 | 309 | 78 310 | 00:04:10,600 --> 00:04:14,220 311 | 这个红色就是跟完阶段的脑电波 312 | 313 | 79 314 | 00:04:14,350 --> 00:04:16,550 315 | 一阶段因为跟清醒的时候比较像 316 | 317 | 80 318 | 00:04:16,550 --> 00:04:17,900 319 | 这里没有展示出来 320 | 321 | 81 322 | 00:04:18,100 --> 00:04:21,770 323 | 然后下面这个蓝色的呢是本三结对 324 | 325 | 82 326 | 00:04:25,570 --> 00:04:31,670 327 | 这个是一个健康的成年人一晚上的睡眠分布图 328 | 329 | 83 330 | 00:04:31,670 --> 00:04:35,050 331 | 我可以看到首先会来到这个另一阶段 332 | 333 | 84 334 | 00:04:35,720 --> 00:04:40,200 335 | 然后一阶段大概很多只有两三分钟就结束了 336 | 337 | 85 338 | 00:04:40,370 --> 00:04:44,550 339 | 然后之后会进入到不动员睡眠的恶骂二阶段 340 | 341 | 86 342 | 00:04:45,100 --> 00:04:49,170 343 | 让恩而切断一般会持续二十到三十分钟 344 | 345 | 87 346 | 00:04:49,350 --> 00:04:52,070 347 | 然后就进又到了深度深绵恩三阶段 348 | 349 | 88 350 | 00:04:52,200 --> 00:04:56,570 351 | 等三节大概也会有摆个小时到四十分钟 352 | 353 | 89 354 | 00:04:56,820 --> 00:04:58,900 355 | 然后之后又进入到了华尔街段 356 | 357 | 90 358 | 00:04:59,000 --> 00:05:01,970 359 | 然后完了以后就会经入道这个图上红色标记的 360 | 361 | 91 362 | 00:05:01,970 --> 00:05:03,450 363 | 动眼睡眠阶段 364 | 365 | 92 366 | 00:05:03,550 --> 00:05:05,770 367 | 这个时候就开始做梦了 368 | 369 | 93 370 | 00:05:05,870 --> 00:05:08,120 371 | 我们夜间第一次说梦网时间很短 372 | 373 | 94 374 | 00:05:08,120 --> 00:05:09,750 375 | 他该球季分钟就解说了 376 | 377 | 95 378 | 00:05:09,850 --> 00:05:13,870 379 | 然后完了以后就会进入到不懂夜睡眠的恶化而本三 380 | 381 | 96 382 | 00:05:13,870 --> 00:05:15,320 383 | 然后问三赛道德观 384 | 385 | 97 386 | 00:05:15,320 --> 00:05:18,020 387 | 然后再到这个动眼睡眠的琢磨了阶段 388 | 389 | 98 390 | 00:05:18,150 --> 00:05:20,220 391 | 中间可能他会玩醒来几次 392 | 393 | 99 394 | 00:05:20,370 --> 00:05:21,870 395 | 所以我们以诚月的睡眠 396 | 397 | 100 398 | 00:05:21,870 --> 00:05:24,820 399 | 大概就是在东衍义补洞沿水面舰 400 | 401 | 101 402 | 00:05:25,120 --> 00:05:26,920 403 | 交替我付进行的 404 | 405 | 102 406 | 00:05:27,200 --> 00:05:30,300 407 | 但是总过再说我们从初上可以看出来一个趋势 408 | 409 | 103 410 | 00:05:30,500 --> 00:05:34,250 411 | 就是不动员睡眠恩三阶段的这个深冬睡眠 412 | 413 | 104 414 | 00:05:34,520 --> 00:05:37,850 415 | 主要发生在前半夜就是铅似的消失 416 | 417 | 105 418 | 00:05:38,100 --> 00:05:41,070 419 | 然后动眼睡眠做梦主要发生在后半叶 420 | 421 | 106 422 | 00:05:43,650 --> 00:05:46,420 423 | 因为我觉得这个厂子还挺适合搭客岁的 424 | 425 | 107 426 | 00:05:46,820 --> 00:05:50,820 427 | 如果说我在演讲的时候你们睡着了就很正常 428 | 429 | 108 430 | 00:05:51,170 --> 00:05:54,000 431 | 但是我在演讲的时候我睡着了 432 | 433 | 109 434 | 00:05:54,000 --> 00:05:55,870 435 | 这个可能就是使水镇了 436 | 437 | 110 438 | 00:05:56,170 --> 00:05:58,850 439 | 是水生患者可以在任何的时候 440 | 441 | 111 442 | 00:05:59,050 --> 00:06:01,920 443 | 比如说说话的时候站着走路的时候 444 | 445 | 112 446 | 00:06:01,920 --> 00:06:03,320 447 | 都有可能随时睡着 448 | 449 | 113 450 | 00:06:03,600 --> 00:06:06,850 451 | 比如说这个左边这个视频就位小朋友他正在大嚼 452 | 453 | 114 454 | 00:06:07,250 --> 00:06:08,900 455 | 然后突然就睡着了 456 | 457 | 115 458 | 00:06:09,120 --> 00:06:10,870 459 | 然不光是人有时睡着 460 | 461 | 116 462 | 00:06:10,870 --> 00:06:11,720 463 | 这种动物也有 464 | 465 | 117 466 | 00:06:11,820 --> 00:06:14,720 467 | 比如说右边的视频里了举止够 468 | 469 | 118 470 | 00:06:14,720 --> 00:06:16,950 471 | 他跑着袍子然后就高了睡觉了 472 | 473 | 119 474 | 00:06:17,150 --> 00:06:18,120 475 | 还有个特写 476 | 477 | 120 478 | 00:06:18,170 --> 00:06:19,570 479 | 不要解释是随证 480 | 481 | 121 482 | 00:06:19,950 --> 00:06:23,300 483 | 我们就要先解释一下水面到底是怎么产生的 484 | 485 | 122 486 | 00:06:23,550 --> 00:06:27,170 487 | 从环路的从一个宏观的环的层面来说 488 | 489 | 123 490 | 00:06:27,370 --> 00:06:28,850 491 | 睡眠主要是因为 492 | 493 | 124 494 | 00:06:28,850 --> 00:06:31,450 495 | 因为我们脑内有一些促进睡眠的脑区 496 | 497 | 125 498 | 00:06:31,570 --> 00:06:32,470 499 | 他活跃了 500 | 501 | 126 502 | 00:06:32,700 --> 00:06:35,900 503 | 然后抑制了一些促进清醒的脑区的活动 504 | 505 | 127 506 | 00:06:35,970 --> 00:06:37,620 507 | 这样子睡眠就发生了 508 | 509 | 128 510 | 00:06:38,120 --> 00:06:41,970 511 | 然后在我们脑内有一个叫做下丘脑的部位 512 | 513 | 129 514 | 00:06:42,150 --> 00:06:44,560 515 | 它分泌右边这个图里的这种叫做 516 | 517 | 130 518 | 00:06:44,560 --> 00:06:46,200 519 | 焦作市欲诉的起诉 520 | 521 | 131 522 | 00:06:46,450 --> 00:06:48,350 523 | 这个时日苏轼一个堕胎 524 | 525 | 132 526 | 00:06:48,420 --> 00:06:50,400 527 | 然后他又出轻型的作用 528 | 529 | 133 530 | 00:06:50,900 --> 00:06:55,320 531 | 所以在我们脑内分别是语素的脑区 532 | 533 | 134 534 | 00:06:55,320 --> 00:06:56,600 535 | 如果出现了问题 536 | 537 | 135 538 | 00:06:56,650 --> 00:07:00,920 539 | 让这个是匀速不能正常分离了就回的嗜睡症 540 | 541 | 136 542 | 00:07:00,950 --> 00:07:05,200 543 | 如果反过来内邪从水面的脑区出现问题的话 544 | 545 | 137 546 | 00:07:05,200 --> 00:07:06,570 547 | 那就可能会导致失眠 548 | 549 | 138 550 | 00:07:07,320 --> 00:07:10,320 551 | 这个是从一个宏观的关东的层面来 552 | 553 | 139 554 | 00:07:10,320 --> 00:07:12,070 555 | 曾来解释睡眠是怎么产生的 556 | 557 | 140 558 | 00:07:12,270 --> 00:07:15,920 559 | 下面我再介绍一下从更微观的分子的层面 560 | 561 | 141 562 | 00:07:16,120 --> 00:07:17,520 563 | 睡眠是怎么产生的 564 | 565 | 142 566 | 00:07:18,120 --> 00:07:20,820 567 | 这就要回到我前面说的一个概念了 568 | 569 | 143 570 | 00:07:20,820 --> 00:07:23,150 571 | 就是睡眠的稳态平衡 572 | 573 | 144 574 | 00:07:23,500 --> 00:07:26,250 575 | 这个稳态平衡其实一直都在进行 576 | 577 | 145 578 | 00:07:26,250 --> 00:07:28,210 579 | 在我们现在醒着的时候 580 | 581 | 146 582 | 00:07:28,210 --> 00:07:29,670 583 | 是时刻个都在进行 584 | 585 | 147 586 | 00:07:30,000 --> 00:07:32,820 587 | 然后它的作用就是他会积累睡眠债 588 | 589 | 148 590 | 00:07:32,990 --> 00:07:34,220 591 | 或者说睡眠压力 592 | 593 | 149 594 | 00:07:34,450 --> 00:07:37,000 595 | 大家现在听到这的已经是与领悟力的心 596 | 597 | 150 598 | 00:07:37,000 --> 00:07:39,600 599 | 新田就像这位专家请说扔花 600 | 601 | 151 602 | 00:07:40,550 --> 00:07:46,720 603 | 通俗地说着稳态平衡会持续的积累困意 604 | 605 | 152 606 | 00:07:46,800 --> 00:07:49,250 607 | 就是我们行得越久我们会觉得越困 608 | 609 | 153 610 | 00:07:49,470 --> 00:07:51,660 611 | 这种困意其实就是 612 | 613 | 154 614 | 00:07:51,660 --> 00:07:54,920 615 | 稳态平衡机制金磊睡眠压力的体现 616 | 617 | 155 618 | 00:07:55,420 --> 00:07:57,800 619 | 那么这个坤到底是什么呢 620 | 621 | 156 622 | 00:07:58,400 --> 00:08:02,670 623 | 在我们的脑内有一种叫做腺甘的化学物质 624 | 625 | 157 626 | 00:08:03,400 --> 00:08:04,920 627 | 在我们醒着的时候 628 | 629 | 158 630 | 00:08:04,970 --> 00:08:09,070 631 | 这项安徽在脑内移植及泪不停的积累 632 | 633 | 159 634 | 00:08:09,320 --> 00:08:12,120 635 | 然后他会有一个促进睡眠的作用 636 | 637 | 160 638 | 00:08:12,500 --> 00:08:13,900 639 | 如果我们这样想 640 | 641 | 161 642 | 00:08:13,900 --> 00:08:17,300 643 | 如果有一种方法可以对抗着相爱的作用 644 | 645 | 162 646 | 00:08:17,300 --> 00:08:21,520 647 | 但是不是我们就我可以不不觉得困难 648 | 649 | 163 650 | 00:08:23,450 --> 00:08:25,370 651 | 后那确实是有这样的方法的 652 | 653 | 164 654 | 00:08:25,870 --> 00:08:31,500 655 | 最常用的一种可以对抗腺苷的物质就是咖啡应 656 | 657 | 165 658 | 00:08:31,720 --> 00:08:34,020 659 | 它存在于图上这些我们 660 | 661 | 166 662 | 00:08:34,020 --> 00:08:37,700 663 | 我们每天可能都在应用的应聘当中 664 | 665 | 167 666 | 00:08:37,820 --> 00:08:43,920 667 | 包括像咖啡红牛各种茶还有可能等等 668 | 669 | 168 670 | 00:08:44,049 --> 00:08:49,120 671 | 这个像安踏在我们脑内是可以跟它的受体结合 672 | 673 | 169 674 | 00:08:49,120 --> 00:08:50,420 675 | 从而促进睡眠 676 | 677 | 170 678 | 00:08:50,650 --> 00:08:52,150 679 | 那咖啡人作用就是看 680 | 681 | 171 682 | 00:08:52,150 --> 00:08:54,300 683 | 就是咖啡因会跟线杆的受体结合 684 | 685 | 172 686 | 00:08:54,320 --> 00:08:56,720 687 | 让岘港不能跟他自己的手地结合 688 | 689 | 173 690 | 00:08:56,850 --> 00:09:00,100 691 | 这样就可以一直睡眠促进清晰 692 | 693 | 174 694 | 00:09:00,970 --> 00:09:04,420 695 | 相爱是我前面提到的各 696 | 697 | 175 698 | 00:09:06,570 --> 00:09:08,400 699 | 但是他不是唯一的媒介 700 | 701 | 176 702 | 00:09:08,450 --> 00:09:12,270 703 | 还有其他许多粉丝都参与到了这个调控过程中 704 | 705 | 177 706 | 00:09:12,370 --> 00:09:15,370 707 | 我们可以把稳态平衡机制肖湘成一个杀戮 708 | 709 | 178 710 | 00:09:15,900 --> 00:09:17,670 711 | 在我们醒着的时候 712 | 713 | 179 714 | 00:09:17,670 --> 00:09:21,770 715 | 个我太平衡其实它会一直的积累我们的睡眠压力 716 | 717 | 180 718 | 00:09:21,850 --> 00:09:24,170 719 | 然后到我们进入到睡眠的时候 720 | 721 | 181 722 | 00:09:26,720 --> 00:09:28,950 723 | 但这个水边压力释放关闭以后 724 | 725 | 182 726 | 00:09:28,950 --> 00:09:29,850 727 | 睡眠就会结束 728 | 729 | 183 730 | 00:09:29,850 --> 00:09:30,800 731 | 我们会醒来 732 | 733 | 184 734 | 00:09:31,050 --> 00:09:33,370 735 | 我们可以想象如果在醒着的时候 736 | 737 | 185 738 | 00:09:33,370 --> 00:09:35,070 739 | 我们挤在越多的睡眠压力 740 | 741 | 186 742 | 00:09:35,520 --> 00:09:37,520 743 | 也就意味着说进入睡眠以后 744 | 745 | 187 746 | 00:09:37,650 --> 00:09:39,070 747 | 需要更长的时间 748 | 749 | 188 750 | 00:09:39,250 --> 00:09:41,470 751 | 才能把这些水被压力释放干净 752 | 753 | 189 754 | 00:09:41,870 --> 00:09:43,420 755 | 那也就意味的是我们可能 756 | 757 | 190 758 | 00:09:43,420 --> 00:09:45,720 759 | 我们可能会睡得更就是一个跟神 760 | 761 | 191 762 | 00:09:45,900 --> 00:09:48,370 763 | 我太平衡晶石的左右其实就在这里 764 | 765 | 192 766 | 00:09:48,370 --> 00:09:50,750 767 | 它是决定我们睡多久和水多深 768 | 769 | 193 770 | 00:09:51,150 --> 00:09:53,450 771 | 所以如果你一夜没睡熬夜了 772 | 773 | 194 774 | 00:09:53,450 --> 00:09:56,320 775 | 离第二天就会睡得比平时要酒喝声 776 | 777 | 195 778 | 00:09:56,670 --> 00:09:59,350 779 | 然后如果说这个工作日睡的比较少 780 | 781 | 196 782 | 00:09:59,650 --> 00:10:02,050 783 | 那周末可能就会要不教会 784 | 785 | 197 786 | 00:10:02,050 --> 00:10:04,570 787 | 回水到特别的就特别的深 788 | 789 | 198 790 | 00:10:05,320 --> 00:10:07,470 791 | 可以所以从这里我们可以看出来 792 | 793 | 199 794 | 00:10:07,470 --> 00:10:10,400 795 | 七十个睡眠呀离婚者所睡眠债一个 796 | 797 | 200 798 | 00:10:10,400 --> 00:10:13,320 799 | 再以跟我们签的所有其他债一样都是要还的 800 | 801 | 201 802 | 00:10:13,470 --> 00:10:15,900 803 | 对我前面讲到了水面这两大特征 804 | 805 | 202 806 | 00:10:15,900 --> 00:10:19,050 807 | 一个是他收到我太平和机制的调控 808 | 809 | 203 810 | 00:10:19,200 --> 00:10:20,700 811 | 然后另外一点就是她还 812 | 813 | 204 814 | 00:10:20,700 --> 00:10:23,170 815 | 他还会发展在一天中相对固定的时段 816 | 817 | 205 818 | 00:10:23,400 --> 00:10:25,800 819 | 对于我们人类来说主要是在夜间 820 | 821 | 206 822 | 00:10:26,000 --> 00:10:27,800 823 | 但是基本说在液晶睡觉 824 | 825 | 207 826 | 00:10:27,800 --> 00:10:30,550 827 | 谁叫我相信在座的大家可能作息时间 828 | 829 | 208 830 | 00:10:30,900 --> 00:10:32,100 831 | 都还挺不一样的 832 | 833 | 209 834 | 00:10:32,420 --> 00:10:37,320 835 | 比如说这个在座的可能有这种早睡早起的每天 836 | 837 | 210 838 | 00:10:37,320 --> 00:10:39,170 839 | 每天教廷我的不是道中 840 | 841 | 211 842 | 00:10:40,350 --> 00:10:42,870 843 | 最终我们叫做白领聊性的坐骑 844 | 845 | 212 846 | 00:10:43,150 --> 00:10:45,320 847 | 然后也会有晚睡晚起的 848 | 849 | 213 850 | 00:10:45,320 --> 00:10:47,870 851 | 每天最大的越王可能就是睡到十二点的 852 | 853 | 214 854 | 00:10:47,950 --> 00:10:49,850 855 | 这就毛佗硬性的做些 856 | 857 | 215 858 | 00:10:49,900 --> 00:10:51,300 859 | 就是我个人而言 860 | 861 | 216 862 | 00:10:51,370 --> 00:10:54,120 863 | 如果我不是我外界因素的干扰 864 | 865 | 217 866 | 00:10:54,120 --> 00:10:57,920 867 | 那我大概是凌晨三点睡到上午十点异性 868 | 869 | 218 870 | 00:10:58,170 --> 00:11:01,000 871 | 所以我也是一个典型的檐帽子型的 872 | 873 | 219 874 | 00:11:01,000 --> 00:11:02,460 875 | 毛陀硬性的做些 876 | 877 | 220 878 | 00:11:02,970 --> 00:11:06,650 879 | 从我们从小到大受的教育可能会觉得 880 | 881 | 221 882 | 00:11:06,720 --> 00:11:08,470 883 | 这种不同的作息制度 884 | 885 | 222 886 | 00:11:08,600 --> 00:11:10,870 887 | 跟你是情分还是懒惰 888 | 889 | 223 890 | 00:11:10,870 --> 00:11:13,600 891 | 你们有一个好的生活和学习习惯有关系 892 | 893 | 224 894 | 00:11:13,700 --> 00:11:16,320 895 | 但是其实也不一定吃这样 896 | 897 | 225 898 | 00:11:16,500 --> 00:11:21,220 899 | 在上个世纪的九十年代 900 | 901 | 226 902 | 00:11:21,450 --> 00:11:25,620 903 | 在美国有个犹他大学的睡眠尊属 904 | 905 | 227 906 | 00:11:25,670 --> 00:11:27,900 907 | 然后有一天有一位睡眠医生迎来 908 | 909 | 228 910 | 00:11:27,900 --> 00:11:31,600 911 | 艺声引来了一个老太太六十多岁老太太叫做代替 912 | 913 | 229 914 | 00:11:31,800 --> 00:11:34,610 915 | 这个白厅就跟着渭水边医生说 916 | 917 | 230 918 | 00:11:34,610 --> 00:11:37,500 919 | 他说卧床小到大都早睡早起 920 | 921 | 231 922 | 00:11:37,600 --> 00:11:39,020 923 | 然后这个沈湎医生说 924 | 925 | 232 926 | 00:11:39,020 --> 00:11:41,600 927 | 那不是挺好的吗早非早起身体好 928 | 929 | 233 930 | 00:11:41,970 --> 00:11:43,490 931 | 然后老太来说 932 | 933 | 234 934 | 00:11:43,650 --> 00:11:46,100 935 | 不是你想象那样早睡也早起 936 | 937 | 235 938 | 00:11:46,250 --> 00:11:50,370 939 | 我是每天晚上祁烈我就困了时睡觉了 940 | 941 | 236 942 | 00:11:50,500 --> 00:11:53,020 943 | 凌晨每天凌晨撕裂多就会醒来 944 | 945 | 237 946 | 00:11:53,120 --> 00:11:54,450 947 | 在我年轻的时候呢 948 | 949 | 238 950 | 00:11:54,450 --> 00:11:57,270 951 | 他说这个对我的生活造成了不小的困扰 952 | 953 | 239 954 | 00:12:00,320 --> 00:12:02,050 955 | 这我都没有办法才加 956 | 957 | 240 958 | 00:12:03,850 --> 00:12:06,750 959 | 然后他说不仅是他是这样 960 | 961 | 241 962 | 00:12:07,000 --> 00:12:10,500 963 | 他的母亲他的外祖父他的兄弟 964 | 965 | 242 966 | 00:12:10,500 --> 00:12:13,000 967 | 他的女儿甚至是她的外孙女儿 968 | 969 | 243 970 | 00:12:13,120 --> 00:12:14,250 971 | 都是这个样子 972 | 973 | 244 974 | 00:12:14,320 --> 00:12:16,670 975 | 他也为这个事情看过很多医生 976 | 977 | 245 978 | 00:12:16,920 --> 00:12:19,650 979 | 内些一身都跟他说他有精神问题 980 | 981 | 246 982 | 00:12:19,920 --> 00:12:21,570 983 | 所以他也挺困惑的 984 | 985 | 247 986 | 00:12:21,570 --> 00:12:23,320 987 | 因为他觉得子宇亲身挺正常 988 | 989 | 248 990 | 00:12:23,570 --> 00:12:26,150 991 | 这个睡眠也生听到了这个事情以后 992 | 993 | 249 994 | 00:12:26,320 --> 00:12:28,370 995 | 他想这个家族留这么多成员 996 | 997 | 250 998 | 00:12:28,370 --> 00:12:30,570 999 | 于是他就进行了一个系统的调查 1000 | 1001 | 251 1002 | 00:12:30,570 --> 00:12:33,650 1003 | 发现这个家族中确实有二十九过程远 1004 | 1005 | 252 1006 | 00:12:33,700 --> 00:12:36,620 1007 | 都有这种吸毒的早睡早起的现象 1008 | 1009 | 253 1010 | 00:12:36,920 --> 00:12:41,250 1011 | 其中他又让张国成员到她的歌睡眠中心的因为 1012 | 1013 | 254 1014 | 00:12:41,320 --> 00:12:42,450 1015 | 这个早非早起呢 1016 | 1017 | 255 1018 | 00:12:42,470 --> 00:12:44,950 1019 | 不是你说早而造情酒浓酸的 1020 | 1021 | 256 1022 | 00:12:45,020 --> 00:12:47,900 1023 | 对缺失的用脑电波去测量它的睡眠 1024 | 1025 | 257 1026 | 00:12:47,920 --> 00:12:49,670 1027 | 开始不是真的早睡早起了 1028 | 1029 | 258 1030 | 00:12:49,820 --> 00:12:52,600 1031 | 所以究竟写了用脑电波的对睡眠的测量 1032 | 1033 | 259 1034 | 00:12:52,650 --> 00:12:56,820 1035 | 然后发现这些人他们的睡眠确实如白婷诉说 1036 | 1037 | 260 1038 | 00:12:57,020 --> 00:13:01,070 1039 | 然后这个是比正常的人要造了带盖三个半到四个小时 1040 | 1041 | 261 1042 | 00:13:01,270 --> 00:13:04,620 1043 | 因为这个现象是这个家族都有 1044 | 1045 | 262 1046 | 00:13:04,820 --> 00:13:07,320 1047 | 所以你就是说它是一个可以溢出的现象 1048 | 1049 | 263 1050 | 00:13:07,520 --> 00:13:11,500 1051 | 这位睡眠一生的就决定进一步的去调查这个事情 1052 | 1053 | 264 1054 | 00:13:11,700 --> 00:13:13,620 1055 | 他和一位遗传学家 1056 | 1057 | 265 1058 | 00:13:13,620 --> 00:13:16,550 1059 | 也就是我在美国博士后的导师合作 1060 | 1061 | 266 1062 | 00:13:16,820 --> 00:13:18,350 1063 | 然后他们就发现了 1064 | 1065 | 267 1066 | 00:13:18,750 --> 00:13:21,450 1067 | 们这些特别早睡早起的人 1068 | 1069 | 268 1070 | 00:13:21,650 --> 00:13:24,300 1071 | 其实是带了一个罕见的基因变异 1072 | 1073 | 269 1074 | 00:13:24,500 --> 00:13:27,770 1075 | 这个变异发生在一个叫做裴瑞驰的基因里面 1076 | 1077 | 270 1078 | 00:13:27,950 --> 00:13:29,870 1079 | 然后这个编译器时就导致了 1080 | 1081 | 271 1082 | 00:13:29,870 --> 00:13:32,650 1083 | 胚乳球的点黑须那上有 1084 | 1085 | 272 1086 | 00:13:32,650 --> 00:13:34,150 1087 | 有一个阶级的改变 1088 | 1089 | 273 1090 | 00:13:34,320 --> 00:13:37,470 1091 | 后一个碱基的改变了导致他所编码的基因 1092 | 1093 | 274 1094 | 00:13:37,470 --> 00:13:40,800 1095 | 渴而除蛋白有一个案子酸的改变 1096 | 1097 | 275 1098 | 00:13:40,970 --> 00:13:42,450 1099 | 这么的一个改变 1100 | 1101 | 276 1102 | 00:13:42,450 --> 00:13:45,370 1103 | 因为科尔秋瑾是一个生物中的精 1104 | 1105 | 277 1106 | 00:13:45,570 --> 00:13:48,720 1107 | 所以这么一个改变就影响了这些人的生物钟 1108 | 1109 | 278 1110 | 00:13:48,950 --> 00:13:52,670 1111 | 生物钟我们可大家听说过都听说过名称 1112 | 1113 | 279 1114 | 00:13:55,420 --> 00:13:58,620 1115 | 他其实是我们体内的一种计时机制 1116 | 1117 | 280 1118 | 00:13:58,950 --> 00:14:02,600 1119 | 然后它会使我们的各种行为和生理过程 1120 | 1121 | 281 1122 | 00:14:02,620 --> 00:14:05,000 1123 | 表现出一种啊是四小时的戒律 1124 | 1125 | 282 1126 | 00:14:05,000 --> 00:14:07,170 1127 | 生活中不致影响我们所需时间 1128 | 1129 | 283 1130 | 00:14:07,400 --> 00:14:08,920 1131 | 还有我们的方方面面 1132 | 1133 | 284 1134 | 00:14:08,920 --> 00:14:11,550 1135 | 比如说我们的体温心率 1136 | 1137 | 285 1138 | 00:14:12,200 --> 00:14:13,420 1139 | 我们的这个血压 1140 | 1141 | 286 1142 | 00:14:14,670 --> 00:14:16,420 1143 | 都有二零四小时的戒律 1144 | 1145 | 287 1146 | 00:14:16,500 --> 00:14:18,750 1147 | 生物钟索取中我就重按十四小时在竭力 1148 | 1149 | 288 1150 | 00:14:18,750 --> 00:14:20,950 1151 | 我们把它称为今日戒律 1152 | 1153 | 289 1154 | 00:14:20,950 --> 00:14:24,070 1155 | 就是大约翌日大约二里四小时的个意思 1156 | 1157 | 290 1158 | 00:14:24,250 --> 00:14:26,450 1159 | 他还有一个更为同属 1160 | 1161 | 291 1162 | 00:14:26,450 --> 00:14:28,100 1163 | 但是不那么准确的称呼 1164 | 1165 | 292 1166 | 00:14:28,100 --> 00:14:29,120 1167 | 我叫做昼夜节律 1168 | 1169 | 293 1170 | 00:14:29,550 --> 00:14:32,100 1171 | 我们生物钟与今日戒律在地球上 1172 | 1173 | 294 1174 | 00:14:32,550 --> 00:14:35,070 1175 | 大概七十一年词可能就出现了 1176 | 1177 | 295 1178 | 00:14:35,120 --> 00:14:38,520 1179 | 从最肩带的意中人和代谢宝生物 1180 | 1181 | 296 1182 | 00:14:38,520 --> 00:14:39,370 1183 | 比如来细菌 1184 | 1185 | 297 1186 | 00:14:39,370 --> 00:14:41,100 1187 | 就是图上这个绿绿的东西 1188 | 1189 | 298 1190 | 00:14:41,200 --> 00:14:44,500 1191 | 一直到各种复杂的植物动物 1192 | 1193 | 299 1194 | 00:14:44,550 --> 00:14:46,720 1195 | 都能生物钟和今日戒律 1196 | 1197 | 300 1198 | 00:14:46,850 --> 00:14:50,320 1199 | 所以说它其实是一种比睡眠要古老得多的现象 1200 | 1201 | 301 1202 | 00:14:50,500 --> 00:14:53,170 1203 | 这个其实也挺合理挺容易理解的因为 1204 | 1205 | 302 1206 | 00:14:53,220 --> 00:14:55,280 1207 | 因睡眠只是生活中调控的 1208 | 1209 | 303 1210 | 00:14:55,600 --> 00:14:58,470 1211 | 帮户数个生命过程中间的一个 1212 | 1213 | 304 1214 | 00:14:59,670 --> 00:15:01,270 1215 | 在分子呈面道声中 1216 | 1217 | 305 1218 | 00:15:01,270 --> 00:15:05,070 1219 | 生物钟是有大概十几个基因组成的一个反馈环路 1220 | 1221 | 306 1222 | 00:15:05,300 --> 00:15:07,550 1223 | 去年的诺被生理医学奖 1224 | 1225 | 307 1226 | 00:15:07,550 --> 00:15:11,020 1227 | 就颁给了三位再过瘾克隆出 1228 | 1229 | 308 1230 | 00:15:11,020 --> 00:15:12,920 1231 | 除第一个生物中浸淫的科学家 1232 | 1233 | 309 1234 | 00:15:12,920 --> 00:15:15,050 1235 | 国营改天轮仅在哺乳动物 1236 | 1237 | 310 1238 | 00:15:15,050 --> 00:15:16,720 1239 | 动物包括我们人类便是由三个 1240 | 1241 | 311 1242 | 00:15:17,000 --> 00:15:20,270 1243 | 分别叫做平人玩味秋荷亭为思维 1244 | 1245 | 312 1246 | 00:15:20,270 --> 00:15:22,750 1247 | 这个就是我前面讲到的 1248 | 1249 | 313 1250 | 00:15:22,750 --> 00:15:26,370 1251 | 他的便也导致了大家出入的气度的早睡早起 1252 | 1253 | 314 1254 | 00:15:26,650 --> 00:15:30,450 1255 | 然后我们实验室研究的方向是这个可司机 1256 | 1257 | 315 1258 | 00:15:31,150 --> 00:15:34,470 1259 | 我们发现会碎金的汉奸便也 1260 | 1261 | 316 1262 | 00:15:34,570 --> 00:15:37,670 1263 | 爷爷可以捯饬人气度的早睡早起 1264 | 1265 | 317 1266 | 00:15:37,750 --> 00:15:39,100 1267 | 除了早睡早起 1268 | 1269 | 318 1270 | 00:15:39,100 --> 00:15:41,200 1271 | 他们还有一种情绪病 1272 | 1273 | 319 1274 | 00:15:41,370 --> 00:15:43,450 1275 | 叫做季节性情感障碍 1276 | 1277 | 320 1278 | 00:15:43,500 --> 00:15:45,020 1279 | 俗称东徙倚欲 1280 | 1281 | 321 1282 | 00:15:45,120 --> 00:15:47,620 1283 | 这个病的主要特征就是 1284 | 1285 | 322 1286 | 00:15:47,620 --> 00:15:52,550 1287 | 就是患者在每年的秋天会开始出现一些抑郁的症状 1288 | 1289 | 323 1290 | 00:15:52,720 --> 00:15:56,170 1291 | 然后到冬天冻气的时候是最严重的 1292 | 1293 | 324 1294 | 00:15:56,250 --> 00:15:58,970 1295 | 渠道每年十二月一月二月的时候是随眼中的 1296 | 1297 | 325 1298 | 00:15:58,970 --> 00:16:01,720 1299 | 然后到次年的春夏优惠此法的好准 1300 | 1301 | 326 1302 | 00:16:02,000 --> 00:16:05,060 1303 | 就是这一些性感障碍她在人群中的发病率 1304 | 1305 | 327 1306 | 00:16:05,120 --> 00:16:07,100 1307 | 并屡遇大概是百分之一到百分之十 1308 | 1309 | 328 1310 | 00:16:08,020 --> 00:16:10,950 1311 | 所以这些这个现象就提示我们 1312 | 1313 | 329 1314 | 00:16:10,950 --> 00:16:13,260 1315 | 我们生物钟和今日竭力的紊乱 1316 | 1317 | 330 1318 | 00:16:13,260 --> 00:16:16,000 1319 | 卵可能与精神疾病也有关联 1320 | 1321 | 331 1322 | 00:16:16,650 --> 00:16:18,500 1323 | 前面我给大家讲了两个都是 1324 | 1325 | 332 1326 | 00:16:18,500 --> 00:16:22,050 1327 | 两个都是这种白领聊性的扫雪早期的别一 1328 | 1329 | 333 1330 | 00:16:22,170 --> 00:16:26,500 1331 | 还有这种变异人是可以导致有夜猫子型的作息 1332 | 1333 | 334 1334 | 00:16:26,770 --> 00:16:29,410 1335 | 比如说美国的科研人员发现在这个叫做 1336 | 1337 | 335 1338 | 00:16:29,410 --> 00:16:33,170 1339 | 在这个叫做头颇不安的生活中基因里面的变异 1340 | 1341 | 336 1342 | 00:16:33,200 --> 00:16:35,550 1343 | 就可以逃至人嫉妒的顽石晚期 1344 | 1345 | 337 1346 | 00:16:36,000 --> 00:16:39,870 1347 | 其实人群中夜猫子型的作息是比白领狼性的要多的 1348 | 1349 | 338 1350 | 00:16:40,450 --> 00:16:42,320 1351 | 在这其中了有一部分事项 1352 | 1353 | 339 1354 | 00:16:42,370 --> 00:16:45,200 1355 | 带了个多矿完井便衣的人一样 1356 | 1357 | 340 1358 | 00:16:45,200 --> 00:16:47,570 1359 | 一样是因为一些起因变异导致的 1360 | 1361 | 341 1362 | 00:16:47,720 --> 00:16:50,750 1363 | 但是还有一些可能是为环境因素导致的 1364 | 1365 | 342 1366 | 00:16:50,750 --> 00:16:52,450 1367 | 比如说你晚上七时一定很困了 1368 | 1369 | 343 1370 | 00:16:52,670 --> 00:16:55,920 1371 | 但是还想玩有心想看片不想睡觉 1372 | 1373 | 344 1374 | 00:16:56,170 --> 00:16:59,550 1375 | 这也是这个椰汁晚睡晚起的檐帽的星座性 1376 | 1377 | 345 1378 | 00:16:59,550 --> 00:17:01,270 1379 | 作息但是并不是天生的 1380 | 1381 | 346 1382 | 00:17:01,400 --> 00:17:03,920 1383 | 虽然说生物钟天生的变异 1384 | 1385 | 347 1386 | 00:17:04,069 --> 00:17:07,299 1387 | 可以导致我们个体之间生活中的差异 1388 | 1389 | 348 1390 | 00:17:07,400 --> 00:17:10,650 1391 | 但是生活中的差异的也不全是天生的 1392 | 1393 | 349 1394 | 00:17:10,770 --> 00:17:11,950 1395 | 就是同一个人 1396 | 1397 | 350 1398 | 00:17:11,950 --> 00:17:14,070 1399 | 一人他在年轻和年老的时候 1400 | 1401 | 351 1402 | 00:17:14,069 --> 00:17:15,649 1403 | 后海的生活中也是不一样的 1404 | 1405 | 352 1406 | 00:17:16,020 --> 00:17:18,720 1407 | 新恋人特别是十几岁的青少年 1408 | 1409 | 353 1410 | 00:17:18,849 --> 00:17:22,249 1411 | 而这生物钟是更加倾向于晚睡晚起的 1412 | 1413 | 354 1414 | 00:17:22,250 --> 00:17:24,400 1415 | 由于也就是大家可能会想到的 1416 | 1417 | 355 1418 | 00:17:24,400 --> 00:17:27,850 1419 | 其实青少年他每天早上上学的时间还挺早的 1420 | 1421 | 356 1422 | 00:17:28,150 --> 00:17:31,000 1423 | 把电动稳婆的是七点半深圳市更早 1424 | 1425 | 357 1426 | 00:17:31,350 --> 00:17:34,650 1427 | 所以其实就是说现在目前我们这种上学的事 1428 | 1429 | 358 1430 | 00:17:34,650 --> 00:17:38,850 1431 | 事事要强薄衣裙夜猫子型天生的夜猫子型的青年人 1432 | 1433 | 359 1434 | 00:17:39,070 --> 00:17:41,300 1435 | 去要强过他们早学早七 1436 | 1437 | 360 1438 | 00:17:41,370 --> 00:17:43,320 1439 | 这对于他们其实是挺痛苦的 1440 | 1441 | 361 1442 | 00:17:43,320 --> 00:17:46,450 1443 | 而且对他们的健康也不是太有利 1444 | 1445 | 362 1446 | 00:17:46,770 --> 00:17:50,870 1447 | 所以现在国外的一些学校 1448 | 1449 | 363 1450 | 00:17:50,870 --> 00:17:57,970 1451 | 就是开始时请让中学更晚的开课的时间看是上课的这件更管 1452 | 1453 | 364 1454 | 00:17:58,170 --> 00:18:01,750 1455 | 他们认为这个可能会更有利于这些学生的健康 1456 | 1457 | 365 1458 | 00:18:01,820 --> 00:18:04,170 1459 | 以期他们的认知表现 1460 | 1461 | 366 1462 | 00:18:04,170 --> 00:18:05,620 1463 | 就是说他们在学习长街 1464 | 1465 | 367 1466 | 00:18:06,300 --> 00:18:10,470 1467 | 所以如果你的孩子在学校上课的时候谁笑了 1468 | 1469 | 368 1470 | 00:18:10,820 --> 00:18:12,020 1471 | 清理原谅他 1472 | 1473 | 369 1474 | 00:18:12,020 --> 00:18:14,050 1475 | 这个也不一定她就是不认真 1476 | 1477 | 370 1478 | 00:18:14,100 --> 00:18:16,650 1479 | 它也可能是因为他的生物钟中导致的 1480 | 1481 | 371 1482 | 00:18:16,700 --> 00:18:19,200 1483 | 到这里我就小结了一下 1484 | 1485 | 372 1486 | 00:18:19,200 --> 00:18:20,770 1487 | 我倒不亲卫一直讲的内容 1488 | 1489 | 373 1490 | 00:18:20,970 --> 00:18:24,420 1491 | 所以睡眠其实是主要通过两个同入 1492 | 1493 | 374 1494 | 00:18:24,420 --> 00:18:26,770 1495 | 或者说两股力量来调控的 1496 | 1497 | 375 1498 | 00:18:26,870 --> 00:18:28,600 1499 | 一个就是我们的生活中 1500 | 1501 | 376 1502 | 00:18:28,600 --> 00:18:30,850 1503 | 还有一个就是我前面提到了我太平衡 1504 | 1505 | 377 1506 | 00:18:31,050 --> 00:18:33,350 1507 | 生活种种决定的是我们什么时候睡 1508 | 1509 | 378 1510 | 00:18:33,370 --> 00:18:37,400 1511 | 而我太平和决定的是我们睡多久睡多深 1512 | 1513 | 379 1514 | 00:18:37,550 --> 00:18:40,220 1515 | 听到这里可能会有观众想 1516 | 1517 | 380 1518 | 00:18:40,420 --> 00:18:43,850 1519 | 试听了很多道理但是还是睡不了一个好觉 1520 | 1521 | 381 1522 | 00:18:44,270 --> 00:18:49,950 1523 | 所以就接下来的和大家聊一下一些广为流传的盖上 1524 | 1525 | 382 1526 | 00:18:49,950 --> 00:18:51,920 1527 | 改善或者促进睡眠的一些方法 1528 | 1529 | 383 1530 | 00:18:51,920 --> 00:18:53,320 1531 | 他们是不是真的有效 1532 | 1533 | 384 1534 | 00:18:54,600 --> 00:18:58,970 1535 | 大家可能都是听说过就是喝牛奶可以促进睡眠 1536 | 1537 | 385 1538 | 00:18:58,970 --> 00:19:01,650 1539 | 喝着来是不是真的可以促进睡眠呢 1540 | 1541 | 386 1542 | 00:19:01,750 --> 00:19:04,620 1543 | 牛奶以及其它的一切乳制品里面 1544 | 1545 | 387 1546 | 00:19:04,620 --> 00:19:06,700 1547 | 还有一种叫做四爱酸的物质 1548 | 1549 | 388 1550 | 00:19:07,020 --> 00:19:11,320 1551 | 后者中文字一点程度上是可以改善和促进睡眠的 1552 | 1553 | 389 1554 | 00:19:11,320 --> 00:19:13,520 1555 | 但是他不知纽带利率诶有 1556 | 1557 | 390 1558 | 00:19:13,620 --> 00:19:19,120 1559 | 在蛋类鱼类肉类打动类产品中也都富含色胺孙 1560 | 1561 | 391 1562 | 00:19:20,120 --> 00:19:23,550 1563 | 然后经典流行一种叫做水便溏的东东 1564 | 1565 | 392 1566 | 00:19:23,550 --> 00:19:25,650 1567 | 然后据说是可以促进睡眠 1568 | 1569 | 393 1570 | 00:19:25,970 --> 00:19:27,470 1571 | 这个睡眠唐诗什么的 1572 | 1573 | 394 1574 | 00:19:27,470 --> 00:19:30,950 1575 | 它的主要成分其实就是推诿苏 1576 | 1577 | 395 1578 | 00:19:31,170 --> 00:19:35,300 1579 | 然后推着此事当中我们条件生物钟的 1580 | 1581 | 396 1582 | 00:19:37,050 --> 00:19:39,420 1583 | 他可能以丁城都可以帮助改善睡眠 1584 | 1585 | 397 1586 | 00:19:39,550 --> 00:19:43,250 1587 | 但是它最主要的功效是保住我们倒时差 1588 | 1589 | 398 1590 | 00:19:43,700 --> 00:19:46,450 1591 | 而且这个效果也还是因人而低的 1592 | 1593 | 399 1594 | 00:19:46,500 --> 00:19:47,870 1595 | 在我们小的时候睡不消 1596 | 1597 | 400 1598 | 00:19:47,870 --> 00:19:50,570 1599 | 把妈妈都会说谁不知可以属羊 1600 | 1601 | 401 1602 | 00:19:50,650 --> 00:19:52,950 1603 | 数量神不是真的可以帮助你入睡的 1604 | 1605 | 402 1606 | 00:19:53,070 --> 00:19:55,400 1607 | 如果说你在熟料的过程中 1608 | 1609 | 403 1610 | 00:19:55,400 --> 00:19:57,270 1611 | 他确实会让你干变到更放松 1612 | 1613 | 404 1614 | 00:19:57,420 --> 00:19:59,100 1615 | 帮助你的肌肉放松 1616 | 1617 | 405 1618 | 00:20:01,420 --> 00:20:03,820 1619 | 它一定程度上是可以促进睡眠 1620 | 1621 | 406 1622 | 00:20:07,500 --> 00:20:11,200 1623 | 大家很多人是越数越兴奋 1624 | 1625 | 407 1626 | 00:20:11,200 --> 00:20:12,650 1627 | 或者说越数越焦虑 1628 | 1629 | 408 1630 | 00:20:12,750 --> 00:20:14,250 1631 | 来其实会侵犯作用 1632 | 1633 | 409 1634 | 00:20:15,200 --> 00:20:17,800 1635 | 然后还有一种大家都应该有听说过的 1636 | 1637 | 410 1638 | 00:20:17,800 --> 00:20:20,520 1639 | 可以改善睡眠的方法就是安眠药 1640 | 1641 | 411 1642 | 00:20:20,800 --> 00:20:23,450 1643 | 安眠药确实是可以改善我们的睡眠 1644 | 1645 | 412 1646 | 00:20:23,620 --> 00:20:26,200 1647 | 但是我在这里要提醒大家是 1648 | 1649 | 413 1650 | 00:20:26,200 --> 00:20:30,350 1651 | 使用安眠药的时候一定要小型精神 1652 | 1653 | 414 1654 | 00:20:33,200 --> 00:20:35,800 1655 | 因为常见的爱眠药都是作用于 1656 | 1657 | 415 1658 | 00:20:35,800 --> 00:20:37,920 1659 | 与我们脑内的神经递质系统 1660 | 1661 | 416 1662 | 00:20:38,150 --> 00:20:40,850 1663 | 然后这趟神经递质系统它却是调控睡眠 1664 | 1665 | 417 1666 | 00:20:42,520 --> 00:20:46,020 1667 | 但是他还负责执行我们闹的各种功能 1668 | 1669 | 418 1670 | 00:20:46,300 --> 00:20:49,450 1671 | 所以安眠药不仅会对你的睡眠产生影响 1672 | 1673 | 419 1674 | 00:20:49,670 --> 00:20:52,200 1675 | 他还会可能会影响我们的情绪 1676 | 1677 | 420 1678 | 00:20:52,270 --> 00:20:54,150 1679 | 认知功能包括学习基业 1680 | 1681 | 421 1682 | 00:20:54,220 --> 00:20:56,670 1683 | 还有我甚至是运动功能等等 1684 | 1685 | 422 1686 | 00:20:56,750 --> 00:20:59,670 1687 | 所以在使用来煤窑的时候一定要小型谨慎 1688 | 1689 | 423 1690 | 00:21:00,150 --> 00:21:03,000 1691 | 其实除了药物来改成睡眠还有一些 1692 | 1693 | 424 1694 | 00:21:03,070 --> 00:21:05,800 1695 | 认知行为疗法也可以改善睡眠 1696 | 1697 | 425 1698 | 00:21:05,800 --> 00:21:12,050 1699 | 比如说把你的睡眠和卧室以及创建里一个关联 1700 | 1701 | 426 1702 | 00:21:12,170 --> 00:21:16,300 1703 | 在卧室里在床上就进行睡眠这个事情 1704 | 1705 | 427 1706 | 00:21:19,000 --> 00:21:20,820 1707 | 就不在卧室和床上进行 1708 | 1709 | 428 1710 | 00:21:21,070 --> 00:21:23,320 1711 | 如能比较好地建立这个关联的话 1712 | 1713 | 429 1714 | 00:21:23,320 --> 00:21:24,950 1715 | 花当你进入到这个环境里 1716 | 1717 | 430 1718 | 00:21:25,050 --> 00:21:27,520 1719 | 就会能够比较容易睡着 1720 | 1721 | 431 1722 | 00:21:27,550 --> 00:21:28,870 1723 | 所有的科研问题 1724 | 1725 | 432 1726 | 00:21:28,870 --> 00:21:31,870 1727 | 我们不但有知其人我还要窒息所以然 1728 | 1729 | 433 1730 | 00:21:32,170 --> 00:21:37,650 1731 | 所以科学家们不带要研究睡眠如何产生的 1732 | 1733 | 434 1734 | 00:21:37,650 --> 00:21:40,050 1735 | 他们还想研究我们为什么要睡觉 1736 | 1737 | 435 1738 | 00:21:40,370 --> 00:21:41,920 1739 | 大家可能会觉得 1740 | 1741 | 436 1742 | 00:21:41,920 --> 00:21:44,600 1743 | 我们为什么要睡觉这个问题还需要也中文 1744 | 1745 | 437 1746 | 00:21:46,270 --> 00:21:49,100 1747 | 但是我你仔细想想睡眠这个事情的话 1748 | 1749 | 438 1750 | 00:21:49,100 --> 00:21:51,000 1751 | 他其实也不是那么理所当然 1752 | 1753 | 439 1754 | 00:21:51,070 --> 00:21:55,270 1755 | 因为未当动物进入到失眠的状态以后 1756 | 1757 | 440 1758 | 00:21:55,270 --> 00:21:57,770 1759 | 他是不能进食不能繁殖 1760 | 1761 | 441 1762 | 00:21:57,970 --> 00:21:59,900 1763 | 甚至是不能保护太子记得 1764 | 1765 | 442 1766 | 00:22:00,170 --> 00:22:01,420 1767 | 但是基本是这辆的 1768 | 1769 | 443 1770 | 00:22:01,420 --> 00:22:02,900 1771 | 这两根我又睡了记忆点的叫了 1772 | 1773 | 444 1774 | 00:22:02,950 --> 00:22:04,420 1775 | 这么说的话 1776 | 1777 | 445 1778 | 00:22:04,420 --> 00:22:06,570 1779 | 睡眠都不要付出那么大的代价 1780 | 1781 | 446 1782 | 00:22:08,820 --> 00:22:11,150 1783 | 所以睡眠应该是挺重要的 1784 | 1785 | 447 1786 | 00:22:11,620 --> 00:22:13,170 1787 | 对于我们人类 1788 | 1789 | 448 1790 | 00:22:13,170 --> 00:22:15,020 1791 | 如果一晚上的睡眠不足 1792 | 1793 | 449 1794 | 00:22:15,020 --> 00:22:17,220 1795 | 就会导致说认知功能在下降 1796 | 1797 | 450 1798 | 00:22:17,220 --> 00:22:19,020 1799 | 这个大家可能都有体会 1800 | 1801 | 451 1802 | 00:22:19,220 --> 00:22:21,820 1803 | 一晚上没睡好第二天就感觉笨笨的 1804 | 1805 | 452 1806 | 00:22:22,120 --> 00:22:23,920 1807 | 然后如果长期学教的话 1808 | 1809 | 453 1810 | 00:22:23,920 --> 00:22:26,950 1811 | 会增加你患多种疾病的风险包括 1812 | 1813 | 454 1814 | 00:22:26,970 --> 00:22:31,700 1815 | 肥胖症糖尿病癌症精神疾病等等 1816 | 1817 | 455 1818 | 00:22:32,070 --> 00:22:35,270 1819 | 如果把大鼠放在向右边的图里面 1820 | 1821 | 456 1822 | 00:22:35,270 --> 00:22:36,320 1823 | 里这样一个桩身里面 1824 | 1825 | 457 1826 | 00:22:36,320 --> 00:22:38,720 1827 | 对他进行持续的睡眠剥夺 1828 | 1829 | 458 1830 | 00:22:38,720 --> 00:22:40,920 1831 | 带来两周的世界大树就会死亡 1832 | 1833 | 459 1834 | 00:22:41,170 --> 00:22:43,500 1835 | 但是为什么会这样我们还不太清楚 1836 | 1837 | 460 1838 | 00:22:44,400 --> 00:22:48,100 1839 | 我前关于睡眠对脑的影响 1840 | 1841 | 461 1842 | 00:22:50,450 --> 00:22:54,000 1843 | 睡眠可以在睡眠过程中我们脑内迁 1844 | 1845 | 462 1846 | 00:22:54,000 --> 00:22:56,650 1847 | 那前面讲的是警员会得到一些修复 1848 | 1849 | 463 1850 | 00:22:56,920 --> 00:23:02,000 1851 | 这个是经人在我们脑内他会神经源直接会形成链结构 1852 | 1853 | 464 1854 | 00:23:02,000 --> 00:23:03,170 1855 | 结构成一个这样的网络 1856 | 1857 | 465 1858 | 00:23:03,320 --> 00:23:05,120 1859 | 在我们醒着的时候 1860 | 1861 | 466 1862 | 00:23:05,120 --> 00:23:07,900 1863 | 因为脑接收后大量来自外界的星系 1864 | 1865 | 467 1866 | 00:23:08,170 --> 00:23:13,150 1867 | 所以这些事警员的需要接受处理传递这些星系 1868 | 1869 | 468 1870 | 00:23:13,200 --> 00:23:15,250 1871 | 在这个过程中他们会发生了一些性 1872 | 1873 | 469 1874 | 00:23:15,250 --> 00:23:16,870 1875 | 写形态和功能上的改变 1876 | 1877 | 470 1878 | 00:23:17,150 --> 00:23:19,350 1879 | 然后当我们寻中睡眠以后呢 1880 | 1881 | 471 1882 | 00:23:19,400 --> 00:23:22,620 1883 | 这些形态和功能的改变可以得到一定的恢复 1884 | 1885 | 472 1886 | 00:23:23,120 --> 00:23:25,100 1887 | 这样一遍又我们再次醒来的时候 1888 | 1889 | 473 1890 | 00:23:25,370 --> 00:23:28,900 1891 | 这些神经元可以更高效就觉得处理性 1892 | 1893 | 474 1894 | 00:23:28,900 --> 00:23:31,750 1895 | 处理新的星系传递性的星系 1896 | 1897 | 475 1898 | 00:23:32,170 --> 00:23:33,700 1899 | 但是因为我前面说了 1900 | 1901 | 476 1902 | 00:23:33,700 --> 00:23:36,070 1903 | 身边不足对我们的危害是防卫免得 1904 | 1905 | 477 1906 | 00:23:36,170 --> 00:23:38,820 1907 | 所以水边的功能应该不止于此 1908 | 1909 | 478 1910 | 00:23:40,420 --> 00:23:43,850 1911 | 在升学与有一句广为流出来的话 1912 | 1913 | 479 1914 | 00:23:46,400 --> 00:23:48,150 1915 | 这句话原话是这样的 1916 | 1917 | 480 1918 | 00:23:48,300 --> 00:23:51,870 1919 | 那绯羽白熬了去梅瓶来都比我懂事 1920 | 1921 | 481 1922 | 00:23:52,100 --> 00:23:54,920 1923 | 大意就是说任何生物学的问题到 1924 | 1925 | 482 1926 | 00:23:54,920 --> 00:23:57,970 1927 | 都要从演化的交通去分析才有意义 1928 | 1929 | 483 1930 | 00:23:58,200 --> 00:24:00,540 1931 | 如果从演化了角度我们想一想 1932 | 1933 | 484 1934 | 00:24:00,540 --> 00:24:01,520 1935 | 为什么要睡觉 1936 | 1937 | 485 1938 | 00:24:01,670 --> 00:24:03,970 1939 | 为什么地球上东问你睡了几亿年了 1940 | 1941 | 486 1942 | 00:24:05,450 --> 00:24:07,650 1943 | 就如果从这个叫伦分析的话我 1944 | 1945 | 487 1946 | 00:24:07,650 --> 00:24:10,070 1947 | 我们可能会得到一些新的提示 1948 | 1949 | 488 1950 | 00:24:10,470 --> 00:24:14,420 1951 | 虽然涤纶尚东都大多数中午都需要睡觉 1952 | 1953 | 489 1954 | 00:24:14,470 --> 00:24:16,520 1955 | 他们的睡眠其实还挺不一样的 1956 | 1957 | 490 1958 | 00:24:16,970 --> 00:24:20,570 1959 | 比如说一种叫做野猴的动物 1960 | 1961 | 491 1962 | 00:24:20,570 --> 00:24:22,150 1963 | 他就需要睡的比较久 1964 | 1965 | 492 1966 | 00:24:22,150 --> 00:24:24,600 1967 | 他每天可能要睡大约十七个小时 1968 | 1969 | 493 1970 | 00:24:25,570 --> 00:24:28,670 1971 | 你的出五毛该来每天睡十二个半小时 1972 | 1973 | 494 1974 | 00:24:29,000 --> 00:24:32,450 1975 | 我们人类的一般是需要八个小时所有的睡眠 1976 | 1977 | 495 1978 | 00:24:32,600 --> 00:24:34,470 1979 | 而有一些动物就睡的比较少比如 1980 | 1981 | 496 1982 | 00:24:34,470 --> 00:24:37,100 1983 | 比如说山羊和马 1984 | 1985 | 497 1986 | 00:24:39,350 --> 00:24:41,670 1987 | 到这里大家可能会很好奇不 1988 | 1989 | 498 1990 | 00:24:41,670 --> 00:24:43,850 1991 | 或不还有动物睡得更少 1992 | 1993 | 499 1994 | 00:24:44,370 --> 00:24:45,950 1995 | 甚至是不用睡觉的 1996 | 1997 | 500 1998 | 00:24:46,220 --> 00:24:48,470 1999 | 也是可能有这样的动物的 2000 | 2001 | 501 2002 | 00:24:48,620 --> 00:24:52,700 2003 | 比如说一些水利生活的动物像海豚 2004 | 2005 | 502 2006 | 00:24:52,970 --> 00:24:55,000 2007 | 他从来不会出现 2008 | 2009 | 503 2010 | 00:24:55,100 --> 00:24:58,150 2011 | 新徽商的精致和觉醒阈值的身高 2012 | 2013 | 504 2014 | 00:24:58,250 --> 00:25:00,720 2015 | 就是我前面说的睡眠的定义 2016 | 2017 | 505 2018 | 00:25:00,900 --> 00:25:02,870 2019 | 然后脑电波的分析发现些 2020 | 2021 | 506 2022 | 00:25:05,600 --> 00:25:08,570 2023 | 其实是左半脑和右半脑交替星星的 2024 | 2025 | 507 2026 | 00:25:08,570 --> 00:25:11,410 2027 | 就是说他的两个闹得两个半球 2028 | 2029 | 508 2030 | 00:25:11,410 --> 00:25:13,550 2031 | 不会同时进入到睡眠的状态 2032 | 2033 | 509 2034 | 00:25:13,970 --> 00:25:17,050 2035 | 所以他就从来都会出现标准意义上的睡眠 2036 | 2037 | 510 2038 | 00:25:17,350 --> 00:25:20,470 2039 | 这些动物他们的睡眠的长度都不一样 2040 | 2041 | 511 2042 | 00:25:20,720 --> 00:25:23,200 2043 | 反映了他们的睡眠的需求是不一样的 2044 | 2045 | 512 2046 | 00:25:23,400 --> 00:25:24,920 2047 | 为什么会这样的 2048 | 2049 | 513 2050 | 00:25:24,920 --> 00:25:25,950 2051 | 我们就要想想 2052 | 2053 | 514 2054 | 00:25:25,950 --> 00:25:29,200 2055 | 或许只是因为他们的神村环境不一样 2056 | 2057 | 515 2058 | 00:25:29,200 --> 00:25:31,950 2059 | 他们为了去适应他们的生和环境 2060 | 2061 | 516 2062 | 00:25:32,520 --> 00:25:35,400 2063 | 为了要完成某些特殊的生命过程 2064 | 2065 | 517 2066 | 00:25:35,800 --> 00:25:38,500 2067 | 所以他们可能对睡眠的需求是不一样的 2068 | 2069 | 518 2070 | 00:25:38,500 --> 00:25:41,850 2071 | 假设有一些生病过程比水面还有重要的话 2072 | 2073 | 519 2074 | 00:25:41,850 --> 00:25:43,570 2075 | 但他们可能就会舍弃睡眠 2076 | 2077 | 520 2078 | 00:25:43,620 --> 00:25:46,120 2079 | 比如是我有一个朋友她就跟我说 2080 | 2081 | 521 2082 | 00:25:46,120 --> 00:25:48,150 2083 | 他每天只需要睡五个小时 2084 | 2085 | 522 2086 | 00:25:48,350 --> 00:25:49,820 2087 | 我凯申是不信的 2088 | 2089 | 523 2090 | 00:25:49,820 --> 00:25:51,320 2091 | 但是我前段试验区开会 2092 | 2093 | 524 2094 | 00:25:51,320 --> 00:25:52,750 2095 | 然后跟她住一个房间 2096 | 2097 | 525 2098 | 00:25:53,170 --> 00:25:54,480 2099 | 我就发现 2100 | 2101 | 526 2102 | 00:25:54,670 --> 00:25:57,750 2103 | 每天晚上我睡觉的时候她在看片 2104 | 2105 | 527 2106 | 00:25:57,970 --> 00:25:59,400 2107 | 后第二天呢 2108 | 2109 | 528 2110 | 00:25:59,420 --> 00:26:02,450 2111 | 他仍然可以神采奕奕地去做各种事情 2112 | 2113 | 529 2114 | 00:26:02,720 --> 00:26:04,500 2115 | 然后我还是会跟你们养 2116 | 2117 | 530 2118 | 00:26:04,620 --> 00:26:06,050 2119 | 听报告的时候会睡着 2120 | 2121 | 531 2122 | 00:26:06,650 --> 00:26:09,620 2123 | 所以我觉他每天汽油往深的井里工作 2124 | 2125 | 532 2126 | 00:26:09,800 --> 00:26:11,950 2127 | 然后还有世界可以娱乐 2128 | 2129 | 533 2130 | 00:26:11,950 --> 00:26:13,300 2131 | 让我非常的谢幕 2132 | 2133 | 534 2134 | 00:26:13,820 --> 00:26:17,350 2135 | 然后这种特质可能一定程度上是天生的 2136 | 2137 | 535 2138 | 00:26:17,550 --> 00:26:20,400 2139 | 比如说美国的科研人员就发现了有 2140 | 2141 | 536 2142 | 00:26:20,400 --> 00:26:23,570 2143 | 有一个家族其中有一对母女 2144 | 2145 | 537 2146 | 00:26:23,650 --> 00:26:26,700 2147 | 他们每天带盖就睡五个摆到六个小时从 2148 | 2149 | 538 2150 | 00:26:26,700 --> 00:26:28,220 2151 | 从我小到大都是这样 2152 | 2153 | 539 2154 | 00:26:28,300 --> 00:26:30,620 2155 | 比价之路里面正常的人要少的 2156 | 2157 | 540 2158 | 00:26:30,620 --> 00:26:32,050 2159 | 大概一个半到两个小时 2160 | 2161 | 541 2162 | 00:26:32,300 --> 00:26:35,300 2163 | 而且他们没有经历任何我前面讲到的 2164 | 2165 | 542 2166 | 00:26:35,350 --> 00:26:37,850 2167 | 因为缺角导致的内些负面影响 2168 | 2169 | 543 2170 | 00:26:38,050 --> 00:26:41,850 2171 | 不仅如此他们还精力旺盛动力十足 2172 | 2173 | 544 2174 | 00:26:42,100 --> 00:26:44,350 2175 | 然后遗传学家发现 2176 | 2177 | 545 2178 | 00:26:44,450 --> 00:26:46,550 2179 | 只是因为这一对母女 2180 | 2181 | 546 2182 | 00:26:46,570 --> 00:26:48,570 2183 | 他们携带了一个还藉遍野 2184 | 2185 | 547 2186 | 00:26:48,570 --> 00:26:50,420 2187 | 在一个叫做带愁的基因面 2188 | 2189 | 548 2190 | 00:26:50,900 --> 00:26:52,370 2191 | 然后我们把这样的一类人 2192 | 2193 | 549 2194 | 00:26:54,420 --> 00:26:57,070 2195 | 后这个是一个罕见的变异 2196 | 2197 | 550 2198 | 00:26:57,150 --> 00:26:59,120 2199 | 其实还有一些常见的变应 2200 | 2201 | 551 2202 | 00:27:02,720 --> 00:27:05,400 2203 | 我前面讲到的那个生物中仅以快速里 2204 | 2205 | 552 2206 | 00:27:05,400 --> 00:27:06,720 2207 | 也是我们研究的那个基因 2208 | 2209 | 553 2210 | 00:27:06,900 --> 00:27:11,850 2211 | 他有一段五十四姐姐对唱的这么一个电雷氏裂 2212 | 2213 | 554 2214 | 00:27:11,950 --> 00:27:14,700 2215 | 再由的人里面这段蓄水重复的五次 2216 | 2217 | 555 2218 | 00:27:14,850 --> 00:27:16,550 2219 | 有个人重复了四次 2220 | 2221 | 556 2222 | 00:27:16,750 --> 00:27:18,240 2223 | 我们在座的一些观众里面 2224 | 2225 | 557 2226 | 00:27:18,320 --> 00:27:20,200 2227 | 大多的书一页都是重复四次的 2228 | 2229 | 558 2230 | 00:27:20,200 --> 00:27:22,200 2231 | 但是又少说人充分五次的 2232 | 2233 | 559 2234 | 00:27:22,620 --> 00:27:25,720 2235 | 这些冲锋五次的人就比较不行了 2236 | 2237 | 560 2238 | 00:27:25,770 --> 00:27:28,490 2239 | 因为他们在睡眠剥夺的时候 2240 | 2241 | 561 2242 | 00:27:28,490 --> 00:27:29,900 2243 | 回个容易感到困 2244 | 2245 | 562 2246 | 00:27:30,170 --> 00:27:32,060 2247 | 然后他们也会因为缺觉人工 2248 | 2249 | 563 2250 | 00:27:34,470 --> 00:27:37,600 2251 | 然后再去交完了补缴的阶段他们会水的根深 2252 | 2253 | 564 2254 | 00:27:37,720 --> 00:27:41,050 2255 | 就提示说他们其实是积累了更多的睡眠压力 2256 | 2257 | 565 2258 | 00:27:41,470 --> 00:27:45,470 2259 | 我们可以把这样的一类人称为天然一捆这 2260 | 2261 | 566 2262 | 00:27:45,470 --> 00:27:50,050 2263 | 但是睡眠的多与少也不全是天生因素决定 2264 | 2265 | 567 2266 | 00:27:51,550 --> 00:27:54,150 2267 | 我们一个人在申明中不同的阶段 2268 | 2269 | 568 2270 | 00:27:54,150 --> 00:27:56,220 2271 | 我们的睡眠需求也是不一样的 2272 | 2273 | 569 2274 | 00:27:56,550 --> 00:27:58,800 2275 | 一般来说岁的年龄的增加 2276 | 2277 | 570 2278 | 00:27:58,800 --> 00:28:00,820 2279 | 我们的睡眠需求会逐渐的减少 2280 | 2281 | 571 2282 | 00:28:01,270 --> 00:28:03,200 2283 | 然后出了这个年龄的影响 2284 | 2285 | 572 2286 | 00:28:03,370 --> 00:28:06,870 2287 | 一些特殊的环境也可以影响我们的睡眠需求 2288 | 2289 | 573 2290 | 00:28:07,170 --> 00:28:08,920 2291 | 我就讲一个我自身的经历 2292 | 2293 | 574 2294 | 00:28:09,120 --> 00:28:10,620 2295 | 我高考的时候 2296 | 2297 | 575 2298 | 00:28:10,620 --> 00:28:11,920 2299 | 那个时候不还考三天 2300 | 2301 | 576 2302 | 00:28:12,070 --> 00:28:16,720 2303 | 然后高考的三天我完全没学一点中完全没合眼 2304 | 2305 | 577 2306 | 00:28:16,720 --> 00:28:18,050 2307 | 就以根本一点都睡不着 2308 | 2309 | 578 2310 | 00:28:18,270 --> 00:28:21,440 2311 | 然后第二天就是高考的白天的时候 2312 | 2313 | 579 2314 | 00:28:21,440 --> 00:28:22,600 2315 | 也没有觉得困 2316 | 2317 | 580 2318 | 00:28:22,850 --> 00:28:24,800 2319 | 然后也没有认知功能下降 2320 | 2321 | 581 2322 | 00:28:24,800 --> 00:28:26,620 2323 | 因为我不但没有考得比较差 2324 | 2325 | 582 2326 | 00:28:26,620 --> 00:28:28,680 2327 | 比较差我还超常发挥了 2328 | 2329 | 583 2330 | 00:28:28,680 --> 00:28:30,480 2331 | 毕竟长水平大概搞了三人多芬 2332 | 2333 | 584 2334 | 00:28:32,520 --> 00:28:34,970 2335 | 但而且高耗完了以后我也没有需要补交 2336 | 2337 | 585 2338 | 00:28:35,250 --> 00:28:38,250 2339 | 所以似乎从我们现在这个叫做来分析的话 2340 | 2341 | 586 2342 | 00:28:38,250 --> 00:28:40,600 2343 | 就是一堆三天应该是没有金轮睡眠压力随 2344 | 2345 | 587 2346 | 00:28:40,600 --> 00:28:42,150 2347 | 虽然一点叫做没有谁 2348 | 2349 | 588 2350 | 00:28:42,350 --> 00:28:45,670 2351 | 然后当现在我也没有办法解释这个现象 2352 | 2353 | 589 2354 | 00:28:46,100 --> 00:28:49,820 2355 | 然后我在美国做过时候的时候跟水边医生聊天 2356 | 2357 | 590 2358 | 00:28:50,000 --> 00:28:51,950 2359 | 她说她也遇到过一个案例 2360 | 2361 | 591 2362 | 00:28:52,050 --> 00:28:54,350 2363 | 就是有一个睡眠正常的人 2364 | 2365 | 592 2366 | 00:28:54,520 --> 00:28:56,970 2367 | 他在大概张立达一年的世界 2368 | 2369 | 593 2370 | 00:28:56,970 --> 00:28:59,800 2371 | 因为一些学习的需要还有工作的需要 2372 | 2373 | 594 2374 | 00:28:59,920 --> 00:29:02,100 2375 | 他每天就睡五个小时做一点 2376 | 2377 | 595 2378 | 00:29:03,700 --> 00:29:04,950 2379 | 但是这一点里面演 2380 | 2381 | 596 2382 | 00:29:04,950 --> 00:29:07,320 2383 | 他也没有经历因为学校到 2384 | 2385 | 597 2386 | 00:29:07,320 --> 00:29:09,600 2387 | 导致的各种负面影响 2388 | 2389 | 598 2390 | 00:29:09,750 --> 00:29:12,420 2391 | 所以似乎也没有我急了睡眠压力 2392 | 2393 | 599 2394 | 00:29:12,770 --> 00:29:14,270 2395 | 在动物的研究中 2396 | 2397 | 600 2398 | 00:29:14,270 --> 00:29:16,400 2399 | 其实也报道了一些类似的现象 2400 | 2401 | 601 2402 | 00:29:17,070 --> 00:29:20,170 2403 | 比如说研究显示这个 2404 | 2405 | 602 2406 | 00:29:20,470 --> 00:29:23,100 2407 | 皆可以抑制睡眠促进情形 2408 | 2409 | 603 2410 | 00:29:23,420 --> 00:29:26,650 2411 | 特别是比如说你要减肥然后晚上不吃玩这样 2412 | 2413 | 604 2414 | 00:29:26,970 --> 00:29:29,100 2415 | 就会到夜里会觉得饿得睡不消 2416 | 2417 | 605 2418 | 00:29:29,470 --> 00:29:31,870 2419 | 不但使人会这样动物也会 2420 | 2421 | 606 2422 | 00:29:34,050 --> 00:29:37,370 2423 | 然后过这个恶的水库叫挺有意思的 2424 | 2425 | 607 2426 | 00:29:37,420 --> 00:29:38,950 2427 | 左边这个主子就是 2428 | 2429 | 608 2430 | 00:29:39,300 --> 00:29:41,820 2431 | 如果过瘾正常的水便剥夺的话 2432 | 2433 | 609 2434 | 00:29:41,850 --> 00:29:43,450 2435 | 他是弯的需要补交的 2436 | 2437 | 610 2438 | 00:29:43,450 --> 00:29:45,820 2439 | 这个黑色的珠子显示了这个不叫的量 2440 | 2441 | 611 2442 | 00:29:46,000 --> 00:29:49,150 2443 | 如果是因为金额导致的睡眠减少 2444 | 2445 | 612 2446 | 00:29:49,420 --> 00:29:53,200 2447 | 这个国营他基本上不需要补交 2448 | 2449 | 613 2450 | 00:29:53,200 --> 00:29:54,620 2451 | 可以看到那个灰色的主子基本 2452 | 2453 | 614 2454 | 00:29:57,550 --> 00:30:00,670 2455 | 正常的水元波都会导致过瘾学习能力的下降 2456 | 2457 | 615 2458 | 00:30:00,670 --> 00:30:03,320 2459 | 但是因为饥饿导致的睡眠减少骨 2460 | 2461 | 616 2462 | 00:30:05,050 --> 00:30:06,370 2463 | 所以就是提示我们提 2464 | 2465 | 617 2466 | 00:30:06,370 --> 00:30:08,000 2467 | 我们接到出的睡眠减少好像也 2468 | 2469 | 618 2470 | 00:30:08,000 --> 00:30:09,770 2471 | 好像也没有积累睡眠压力 2472 | 2473 | 619 2474 | 00:30:10,520 --> 00:30:11,620 2475 | 还有一个例子就是 2476 | 2477 | 620 2478 | 00:30:11,620 --> 00:30:13,370 2479 | 就是一种叫做纪要的鸟 2480 | 2481 | 621 2482 | 00:30:13,370 --> 00:30:14,450 2483 | 就是这个图上的 2484 | 2485 | 622 2486 | 00:30:14,720 --> 00:30:17,600 2487 | 这种鸟他在翻自己的时候 2488 | 2489 | 623 2490 | 00:30:20,970 --> 00:30:22,850 2491 | 然后他不睡着了这些事件 2492 | 2493 | 624 2494 | 00:30:26,150 --> 00:30:29,270 2495 | 来完成它的求偶的活动 2496 | 2497 | 625 2498 | 00:30:29,350 --> 00:30:31,050 2499 | 所以极端的一个例子就是由 2500 | 2501 | 626 2502 | 00:30:31,050 --> 00:30:33,650 2503 | 有一只熊只要他可以连续十九天 2504 | 2505 | 627 2506 | 00:30:33,770 --> 00:30:35,600 2507 | 每天睡不超过一个小时 2508 | 2509 | 628 2510 | 00:30:35,870 --> 00:30:37,420 2511 | 然后他们在这个过程中 2512 | 2513 | 629 2514 | 00:30:37,420 --> 00:30:39,270 2515 | 他们的认知功能是不下降的 2516 | 2517 | 630 2518 | 00:30:39,500 --> 00:30:41,070 2519 | 然后进一步的也就还发现水的 2520 | 2521 | 631 2522 | 00:30:41,070 --> 00:30:43,650 2523 | 睡得越少的手机要产的后代越多 2524 | 2525 | 632 2526 | 00:30:43,900 --> 00:30:45,320 2527 | 所以越有竞争优势 2528 | 2529 | 633 2530 | 00:30:45,820 --> 00:30:49,300 2531 | 所以就是说反正需求似乎也可以指水面而且 2532 | 2533 | 634 2534 | 00:30:49,300 --> 00:30:51,270 2535 | 而且没有气垒明显的睡眠压力 2536 | 2537 | 635 2538 | 00:30:51,570 --> 00:30:55,320 2539 | 这一系列大量存在的特例 2540 | 2541 | 636 2542 | 00:30:55,320 --> 00:30:58,600 2543 | 其实告诉我们有没有办法侵蚀这些特例告诉我们 2544 | 2545 | 637 2546 | 00:30:58,850 --> 00:31:03,200 2547 | 其实我们对于睡眠的认识还是非常的少 2548 | 2549 | 638 2550 | 00:31:03,200 --> 00:31:06,070 2551 | 水便是一个古老又日常的现象 2552 | 2553 | 639 2554 | 00:31:06,070 --> 00:31:09,820 2555 | 但是我们到现在我们也没有一个很好的大关 2556 | 2557 | 640 2558 | 00:31:09,820 --> 00:31:11,250 2559 | 关于我们为什么i要睡觉 2560 | 2561 | 641 2562 | 00:31:11,500 --> 00:31:15,420 2563 | 假如有一天我们可以能够很好的回答这个问题 2564 | 2565 | 642 2566 | 00:31:15,820 --> 00:31:18,270 2567 | 可以比较好地认清睡眠的功能 2568 | 2569 | 643 2570 | 00:31:18,270 --> 00:31:21,070 2571 | 我们可能能正正了解睡眠的本质 2572 | 2573 | 644 2574 | 00:31:21,450 --> 00:31:23,950 2575 | 我们可以到洞大开的想像一下 2576 | 2577 | 645 2578 | 00:31:23,970 --> 00:31:26,550 2579 | 假如有一天我们发现睡眠的需求 2580 | 2581 | 646 2582 | 00:31:26,550 --> 00:31:30,020 2583 | 其实就是某些生物化学物资的增加 2584 | 2585 | 647 2586 | 00:31:30,020 --> 00:31:31,370 2587 | 甲和某水物质的减少 2588 | 2589 | 648 2590 | 00:31:31,620 --> 00:31:33,600 2591 | 当然我认为这可能是对于睡眠去求一个 2592 | 2593 | 649 2594 | 00:31:33,620 --> 00:31:34,950 2595 | 一个过于简单的假设 2596 | 2597 | 650 2598 | 00:31:34,950 --> 00:31:36,000 2599 | 我就是举个例子 2600 | 2601 | 651 2602 | 00:31:36,020 --> 00:31:37,220 2603 | 如果是这样的话 2604 | 2605 | 652 2606 | 00:31:37,220 --> 00:31:39,620 2607 | 我或许每天可以服用一律要玩 2608 | 2609 | 653 2610 | 00:31:39,770 --> 00:31:42,220 2611 | 然后把这个多的无耻给减少 2612 | 2613 | 654 2614 | 00:31:42,320 --> 00:31:43,900 2615 | 霸少的物质给补充 2616 | 2617 | 655 2618 | 00:31:44,170 --> 00:31:46,850 2619 | 这样子就可能满足龙每天人睡眠需求我 2620 | 2621 | 656 2622 | 00:31:48,470 --> 00:31:50,000 2623 | 或者至少不用每天睡觉 2624 | 2625 | 657 2626 | 00:31:50,300 --> 00:31:51,750 2627 | 如果是这样的话 2628 | 2629 | 658 2630 | 00:31:51,850 --> 00:31:55,400 2631 | 我们的人生是不是多了三分之一的时间 2632 | 2633 | 659 2634 | 00:31:55,470 --> 00:31:57,550 2635 | 是不是就变相的长寿了 2636 | 2637 | 660 2638 | 00:31:58,070 --> 00:32:00,870 2639 | 你或许会觉得这个听起来不可私也 2640 | 2641 | 661 2642 | 00:32:01,050 --> 00:32:03,200 2643 | 连科幻电影都不带这么演的 2644 | 2645 | 662 2646 | 00:32:03,400 --> 00:32:08,350 2647 | 但是我们在进行是求实的科学研究的同时 2648 | 2649 | 663 2650 | 00:32:08,470 --> 00:32:12,600 2651 | 也可以由以这种看是不靠谱不交掉的想象 2652 | 2653 | 664 2654 | 00:32:12,850 --> 00:32:16,650 2655 | 毕竟爱云斯坦都说过想享乐比知识更重要 2656 | 2657 | 665 2658 | 00:32:17,020 --> 00:32:21,170 2659 | 最后我就大家再想睡觉的时候都种睡个好觉 2660 | 2661 | 666 2662 | 00:32:21,350 --> 00:32:23,870 2663 | 再不想睡觉的时候都可以不用睡觉 2664 | 2665 | 667 2666 | 00:32:24,000 --> 00:32:25,170 2667 | 谢大家 2668 | --------------------------------------------------------------------------------