2016年7月31日 星期日

[Android] 實作IBM Bluemix雲端平台的Speech To Text功能


這邊開發在android平台上使用IBM Bluemix的Speech To Text (STT)功能,此篇文章簡單介紹IBM STT的申請流程,程式請看文章底部的範例

使用心得 :  英文的語音辨識個人覺得蠻準的,但中文(辨識結果是回傳簡體中文)的語音辨識還可以在改善

申請流程如下 :
  • IBMBluemix雲端平台註冊後,提供免費使用1個月的天數,看到下圖提供很多認知運算的功能,這裡要申請使用Speech To Text的功能

  • 選擇Speech To Text後,顯示如下畫面,確認右邊的資料後點建立

*IBM能辨識的語言有8種,且提供前1千分鐘免費
  • 建立成功後會看到下圖,點畫面左邊的服務認證會看到urlpasswordusername的資料,這些資料會再寫程式時用到

2016年7月30日 星期六

Android與mBot機器人藍芽連線並透過藍芽傳送訊息

此範例檔的藍芽連線,需事先在手機做好與藍芽裝置的配對,android再指定對方藍芽裝置的MAC位置進行連線
*此範例是與mBot的藍芽裝置連線,若是藍芽裝置接麵包板可能要設定pin腳,不適用本範例,但可參考android藍芽連線


Android部分
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN" />

建立一個類別檔叫AsClientConnectBT
public class AsClientConnectBT {
    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothSocket socket;
    BluetoothDevice device;
    InputStream inStream;
    OutputStream outStream;
    UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb")//固定的字串
    byte[] msgBuffer;

    public AsClientConnectBT(){
        device = mBtAdapter.getRemoteDevice("00:0D:19:03:17:D5")//對方藍芽裝置MAC位置
        try {
            socket = device.createRfcommSocketToServiceRecord(MY_UUID);
            inStream = socket.getInputStream();     //接收傳來的資料
            outStream = socket.getOutputStream();   //傳送資料給arduino
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void run(){
        try {
            socket.connect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void cancel(){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void SendMsg(){
        try {
            outStream = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        msgBuffer = "0".getBytes()//傳送0

        try {
            outStream.write(msgBuffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

MainActivity檔案
public class MainActivity extends AppCompatActivity {
    AsClientConnectBT clientCon = new AsClientConnectBT();
    TextView tv;
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textview);
        btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(btnClick);
        clientCon.run();
    }

    public Button.OnClickListener btnClick = new Button.OnClickListener(){
        @Override
        public void onClick(View v) {
            clientCon.SendMsg();
        }
    };
}

Arduino部分


範例檔案

紀錄Arduino IDE載入函式庫方法

& 0xFF的意思

只取後面8bit的意思

int 的長度是 4Bytes & and 運算子,就是將
每個位元拿來進行 and 運算,根據 and 運算的規則
只有兩者皆為 true (1) 的結果才為 1

舉例: 
假設這個 i 12345 => 0x3039 (Hex)
i & 0xFF

0x3039=>0011000000111001(Bin)
0xFF  =>0000000011111111
____________________________
結果:0000000000111001

由於前面的 bits 都是 0 ,所以實際上有用的只有後面的 8 bits

此紀錄是因為在實作用android透過藍芽傳資料給Arduino時,在Arduino收到資料後用&0xFF將資料還原,因為android須將資料轉成byte(十進制),才可以送給Arduino

資料來源 : http://morred.blogspot.tw/2014/03/0xff.html

[Android] 透過PHP網頁存取MySQL資料庫的資料

網頁部分
安裝架站伺服器XAMPP (https://www.apachefriends.org/zh_tw/index.html)
安裝完成後,找到在此路徑下C:\xampp\htdocs放要執行SQL語法的網頁,如下:此範例圖示.php的檔案內容,內容是新增一筆資料到MySQL資料庫,完成後將檔案儲存在C:\xampp\htdocs底下

Android部分
Step 1: 開啟AndroidManifest.xml檔案加入
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
允許android裝置透過網路存取資料
Step 2: 將附件的org.apache.http.legacy.jar檔案放到./自己的android專案名稱/app/libs底下
Step 3: 開啟附件裡的原始碼專案將JSONAlterMysqlJSONDeleteMysqlJSONInsertMysql檔案複製(如下圖)貼到自己的專案
注意JSONAlterMysqlJSONDeleteMysqlJSONInsertMysql檔案裡的values.add()函數的參數部分,下圖紅色框起來的字串要跟.php檔案裡的$_POST[‘string’],單引號內的字串一樣如此才可以將兩邊的變數相連
Step 4: 在自己的專案輸入如下圖紅色框起來的程式碼,即完成資料庫的操作
程式範例

[WPF] Microsoft Translator - Text Translation

使用Text Translation之前,先到Microsoft Azure Marketplace註冊Text Translation,取得Text Translation使用權限
連結到Microsoft Azure Marketplace網站,申請一個帳號,申請完成後登入
Step 1:  登入後,點選資料標籤,然後再點選要使用的功能,會進入到Step 2的頁面
Step 2: 右邊選擇想要的付費方案,然後點註冊(已註冊過會顯示取消)
Step 3: 註冊完想使用的功能後,點我的帳戶,左邊點選開發人員,會看到Step 4頁面
Step 4: 點選註冊
Step 5: 在註冊應用程式的頁面,除了用戶端密碼會自動填好,其餘欄位要自己填,填完後按建立。之後在開發應用程式會用到用戶端識別碼用戶端密碼的資料
Step 6: 完成應用程式的註冊頁面
支援翻譯的語言
範例下載 (Text Translation的功能參考範例裡的TextTranslation.cs檔案)

2016年7月8日 星期五

[WPF] 錄音,麥克風音量條, Google Speech To Text

此篇文章主要紀錄如何錄製音檔,然後將錄製好的音檔傳到google的雲端伺服器做語音轉文字的功能,下圖是將錄製音檔的程式邏輯以流程圖的方式呈現

錄製音檔步驟


範例檔程式包含Speech To Text、Text To Speech、錄音功能

[WPF]XML資料與WPF控制項連結

讓WPF的控制項來與XML檔案的資料做連結的好處是在日後如果要新增資料,不用動到程式碼,直接修改XML檔案內的資料,程式就會根據XML檔案的修改來更新顯示的資料.

範例(此篇文章最底下)提供的程式是修改XML的語言資料來更新google語音辨識的語言.

綁定XML資料的實現步驟

以下兩張圖是實作程式碼,要存取Xml檔必須先加入System.Xml函式庫


2016年7月7日 星期四

[WPF] Text To Speech

此範例會使用到兩個函式庫System.Speech.SynthesisNAudio.Wave


選擇男生或女生發音是決定於自己的系統有沒有安裝男生或女生發音,以我的電腦只有女生發音(如下圖English只有名子叫Zira女性的聲音),所以沒有男生的發音,即使VoiceGender可以選male,也只有女生的聲音.

範例檔包含Speech To Text和Text To Speech範例 範例檔下載

2016年7月6日 星期三

google speech-to-text API 申請

Step 1: 申請google speech API之前,要先加入google Chromium-dev,如下頁面


Step 2: 搜尋google API console,連結到如下google API管理頁面,進入後搜尋Speech API,就會看到Speech API的選項,點進去會出現Step 3的畫面

Step 3: 回答google的問題,建立Speech API的使用憑證

Step 4: 憑證建立完後,輸入需要的資料,然後即可獲得申請的API金鑰

Step 5: 完成畫面

P.S.,
a. google Speech API 一天限制只能使用50次,無法申請更多使用次數
b. 辨識方式是先錄製音檔,再將音檔轉成byte丟到google雲端去做語音辨識。
c. 音檔格式限制.wav.flac
d. 如果是要開發android的speech to text 可以不用申請speech api, google有android版的speech to text的開發函式,可以直接呼叫函式使用。
e.  音檔使用.flac並把採樣率設小一點,轉換成文字的速度會快很多