1. 程式人生 > >Python神技之利用百度AI聲控電腦關機

Python神技之利用百度AI聲控電腦關機

Python神技之利用百度AI聲控電腦關機
這次我們來看看如何利用百度AI來聲控電腦關機。首先需要安裝百度AI的Python SDK,並且建立語音識別的應用,獲取AppID、API Key、Secret Key這三項內容,以便在我們寫的程式裡使用,詳情可見上上篇文章,這裡就不贅述了。
在這裡插入圖片描述
Python神技之利用百度AI聲控電腦關機

完整程式碼如下:

1# coding: utf-8
2"""
[email protected]: Kevin Wong
[email protected]: python實現的錄音及語音識別程式
[email protected]

: 2018/11/15 23:14
6"""
7import os
8import wave
9import numpy as np
10from pyaudio import PyAudio, paInt16
11from aip import AipSpeech
12import os
13
14
15class Recorder(object):
16 def init(self):
17 # pyaudio內建緩衝大小
18 self.num_samples = 2000
19 # 取樣頻率
20 self.sampling_rate = 8000
21 # 聲音儲存的閾值
22 self.level = 1500
23 # count_num個取樣之內出現COUNT_NUM個大於LEVEL的取樣則記錄聲音
24 self.count_num = 20
25 # 聲音記錄的最小長度:save_length * num_samples 個取樣
26 self.save_length = 8
27 # 錄音時間,單位s
28 self.time_count = 8
29 self.voice_string = []
30
31 # 儲存為音訊檔案
32 def save_wav(self, filename):
33 wf = wave.open(filename, ‘wb’)
34 wf.setnchannels(1)
35 wf.setsampwidth(2)
36 wf.setframerate(self.sampling_rate)
37 wf.writeframes(np.array(self.voice_string).tostring())
38 wf.close()
39
40 # 讀取音訊
41 def recorder(self):
42 pa = PyAudio()
43 stream = pa.open(format=paInt16, channels = 1, rate = self.sampling_rate, input = True, frames_per_buffer = self.num_samples)
44 save_count = 0
45 save_buffer = []
46 time_count = self.time_count
47 while True:
48 time_count -= 1
49 # 讀入num_samples個取樣
50 string_audio_data = stream.read(self.num_samples)
51 # 將讀入的資料轉換為陣列
52 audio_data = np.fromstring(string_audio_data, dtype = np.short)
53 # 計算大於 level 的取樣的個數
54 large_sample_count = np.sum(audio_data > self.level)
55 print(np.max(audio_data)), “large_sample_count=>”, large_sample_count
56 # 如果個數大於COUNT_NUM,則至少儲存SAVE_LENGTH個塊
57 if large_sample_count > self.count_num:
58 save_count = self.save_length
59 else:
60 save_count -=1
61 if save_count < 0:
62 save_count = 0
63 if save_count > 0:
64 save_buffer.append(string_audio_data)
65 else:
66 if len(save_buffer) > 0:
67 self.voice_string = save_buffer
68 save_buffer = []
69 print(“Recode a piece of voice successfully!”)
70 return True
71 if time_count == 0:
72 if len(save_buffer) > 0:
73 self.voice_string = save_buffer
74 save_buffer = []
75 print(“Recode a piece of voice successfully!”)
76 return True
77 else:
78 return False
79 return True
80
81
82# 讀取本地音訊檔案
83def get_file_content(filePath):
84 with open(filePath, ‘rb’) as fp:
85 return fp.read()
86
87if name
== ‘main’:
88 “”" 你的 APPID AK SK “”"
89 APP_ID = ‘14810929’
90 API_KEY = ‘hD1sGacRqCWybF9lBqumMriS’
91 SECRET_KEY = ‘zKtG8uv3mv4tKqC5avL1ua9YGM38YAAG’
92 client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
93
94 while True:
95 recorder = Recorder()
96 # 開始錄音
97 recorder.recorder()
98 # 儲存音訊檔案
99 recorder.save_wav(“01.wav”)
100 # 識別本地檔案
101 res = client.asr(get_file_content(‘01.wav’), ‘wav’, 8000, {
102 ‘dev_pid’: 1536,
103 })
104 print(res[‘result’][0])
105 try:
106 if “計算器” == res[‘result’][0]:
107 os.system(“calc”)
108 elif “關機” == res[‘result’][0]:
109 os.system(“shutdown -s -t 300”)
110 elif “取消關機” == res[‘result’][0]:
111 os.system(“shutdown -a”)
112 elif “退出程式” == res[‘result’][0]:
113 break
114 except:
115 pass
這裡採用了面向物件的程式設計風格,第15-79行定義了一個Recorder類,其主要功能是對音訊檔案進行處理,包括將程式執行後將使用者的聲音以二進位制流的形式讀取並儲存為wav格式的音訊檔案, 第82行到第85行讀取生成的音訊檔案,並返回檔案內容。第87行是主執行緒入口,只要使用者沒有對電腦說“退出程式”,就會一直執行while迴圈讀取使用者的聲音,將音訊檔案交給百度AI的語音識別介面,並返回識別的文字內容。根據識別的內容,呼叫Python的os庫執行相應的操作。

執行程式後,對電腦說一聲“關機”,執行結果如下:

Python神技之利用百度AI聲控電腦關機
完結,撒花,ye~