聊天機器人(基於android)


1.本人最近寫了一個小項目關於語音聊天的,采用訊飛語音引擎和數據,看看效果

 

2.項目名稱叫小秘書,它可以和你進行交互,可以通過語音聊天,蠻有意思的,聊天內容你也可以定制

3.如果想做這款應用,先看看我前面寫的語音識別

http://www.cnblogs.com/huipengbo/p/7043384.html

4.先看清單文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.chat"
    android:versionCode="1"
    android:versionName="1.0" >
       <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/login_user_selected"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

5.在看布局

主界面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <ListView 
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
    <LinearLayout android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:background="@drawable/detail_btn_bg_normal">
        <Button android:layout_width="wrap_content"
            android:onClick="click"
            android:layout_height="wrap_content"
            android:background="@drawable/bt_selector"
            android:text="開始和小秘對話"
            android:padding="5dp"
            />
    </LinearLayout>


</LinearLayout>

item布局展示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="5dp" >

    <LinearLayout
        android:id="@+id/ll_up"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="2dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/category_mama01"
            android:gravity="center_vertical"
            android:padding="4dp"
            android:text="貂蟬"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/tv1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="哈魯kljflgjdljgdlf"
            android:textColor="#008"
            android:textSize="18sp" />
                <ImageView 
            android:id="@+id/iv"
            android:layout_width="wrap_content"
            android:src="@drawable/logo"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/ll_down"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp">

        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:drawableRight="@drawable/app_icon"
            android:gravity="center_vertical"
            android:padding="4dp"
            android:textColor="#000"
            android:text="我"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/tv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/tv2"
            android:textColor="#080"
            android:textSize="18sp" />

    </RelativeLayout>

</LinearLayout>

6.資源配置和資產配置,資產配置參考語音識別那節隨筆

 

 7.上源代碼,有三個文件

@1MainActivity文件

package com.example.chat;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.example.chat.VoiceBean.WS;
import com.google.gson.Gson;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

import android.app.Activity;
import android.os.Bundle;
import android.provider.Telephony.Sms.Conversations;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity {
    
    StringBuffer strbuf;
    ListView mlv;
    private List<TalkBean> lists;
    MyAdapter adapter;
    
    private String[] answers = new String[]{"約嗎?","想我嗎?","我漂亮嗎","喜歡我嗎?","有沒有做飯的想法啊","來不來?","你女朋友有我漂亮嗎?","想吃我做的菜嗎?",
            "看見我有沒有年輕的沖動","來嘛,人家要玩游戲啊","帥哥,我受不了你神經的樣子","看我的身材好不","我胸豐滿不","哥哥,你快點把水拿過來","晚上請我看電影,好嗎?","最近有沒有回家嗎?"};

    private int []imges = new int[]{R.drawable.m1,R.drawable.m2,R.drawable.m3,R.drawable.m4,R.drawable.m5,
                            R.drawable.m6,R.drawable.m7,R.drawable.m8,R.drawable.m9,R.drawable.m10,
                            R.drawable.m11,R.drawable.m12,R.drawable.m13,R.drawable.m14,R.drawable.m15,R.drawable.after19};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化語音配置對象,必須,這樣才能使用MSC語音服務
        SpeechUtility.createUtility(this, SpeechConstant.APPID+"=59454d78");
        mlv = (ListView) findViewById(R.id.lv);
        lists = new ArrayList<TalkBean>();
        
        adapter = new MyAdapter();
        
        mlv.setAdapter(adapter);
        
        
    }
    
       public void click(View view){
            //創建語音識別對話框
            RecognizerDialog rd = new RecognizerDialog(this,null);
            //設置參數accent,language等參數
            rd.setParameter(SpeechConstant.LANGUAGE,"zh_cn");//中文
            rd.setParameter(SpeechConstant.ACCENT,"mandarin");//普通話
            strbuf = new StringBuffer();
            //設置回調接口
            rd.setListener(new RecognizerDialogListener() {
                
                @Override
                public void onResult(RecognizerResult arg0, boolean arg1) {
                    // TODO Auto-generated method stub
                    String  result = arg0.getResultString();
                    String data = parseJsonData(result);
                    Log.e("data",data);
                  
                    strbuf.append(data);
                    if(arg1){//回話結束
                        String voice = strbuf.toString();
                        Log.e("result",voice);
                        //初始化提問對象
                        TalkBean tb = new TalkBean(voice, -1, true);
                        lists.add(tb);
                        String ans = "沒聽清楚,哥哥";
                        int imgid = -1;
                        if(voice.contains("你好")){
                            ans = "你好啊";
                        }else if(voice.contains("你是")){
                            ans = "我是穿越來的貂蟬";
                        }else if(voice.contains("美女")|| voice.contains("我想你")){
                            //隨機回答
                            ans = answers [(int) (Math.random()*answers.length)];
                            imgid = imges[(int) (Math.random()*imges.length)];
                        }else if(voice.contains("照片")){
                            ans ="這個就是我本人,漂亮吧";
                            imgid = imges[(int) (Math.random()*imges.length)];
                        }else if(voice.contains("天王蓋地虎")){
                            ans = "寶塔鎮河妖";
                            imgid =R.drawable.logo;
                        }else if(voice.contains("漂亮")){
                            ans = "謝謝哥哥誇獎";
                        }else if(voice.contains("干")){
                            ans = "來吧,干杯吧";
                            imgid = imges[(int) (Math.random()*imges.length)];
                        }
                        TalkBean tbans = new TalkBean(ans, imgid, false);
                        lists.add(tbans);
                        
                        
                        
                        //數據改變刷新適配器listview
                        adapter.notifyDataSetChanged();
                        
                        //讓listview始終顯示最后一個
                        mlv.setSelection(lists.size()-1);
                        //將要說的話讀出來
                        read(ans);
                    }
                    
                    
                }
                
                @Override
                public void onError(SpeechError arg0) {
                    // TODO Auto-generated method stub
                    
                }
            });
            //顯示對話框
            rd.show();
        }
        /**
         * 解析json串
         * @param result
         */
        protected String parseJsonData(String json) {
        // 使用Gson來解析Json串
            Gson gson = new Gson();
            VoiceBean bean = gson.fromJson(json, VoiceBean.class);
            ArrayList<WS> ws = bean.ws;
            StringBuffer sb = new StringBuffer();
            for (WS ws2 : ws) {
                String info = ws2.cw.get(0).w;
                sb.append(info);
            }
            return sb.toString();
    }

        /**
         * 語音合成
         * @param view
         */
        public void read(String text){
            //創建合成器對象
            SpeechSynthesizer ss = SpeechSynthesizer.createSynthesizer(this, null);
            //設置參數
            ss.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");//設置發音人
            ss.setParameter(SpeechConstant.SPEED, "30");//語速設置
            ss.setParameter(SpeechConstant.VOLUME, "80");//設置音量
            ss.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//設置為雲端類型
            //ss.setParameter(SpeechConstant.TTS_AUDIO_PATH, "/mnt/sdcard/if.pcm");//設置音頻保存路徑,不用則注釋
      
            //開始合成語音
            ss.startSpeaking(text, null);
            
        }
        
        class MyAdapter extends BaseAdapter{

            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return lists.size();
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return lists.get(position);
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder vh = null;
                if(convertView == null){
                    convertView = View.inflate(getApplicationContext(), R.layout.list_item, null);
                    vh = new ViewHolder();
                    vh.ll_answer = (LinearLayout)convertView.findViewById(R.id.ll_up);
                    vh.tvanswer =  (TextView)convertView.findViewById(R.id.tv1);
                    vh.ivanswer = (ImageView) convertView.findViewById(R.id.iv);
                    
                    vh.rl_ask = (RelativeLayout)convertView. findViewById(R.id.ll_down);
                    vh.tvask = (TextView) convertView.findViewById(R.id.tv3);
                    
                    
                    convertView.setTag(vh);
                }else{
                    vh = (ViewHolder) convertView.getTag();
                }
                TalkBean tb = (TalkBean) getItem(position);
                
                if(tb.isAsk){//如果是問,則不顯示回答的一方
                    vh.ll_answer.setVisibility(View.GONE);
                    vh.rl_ask.setVisibility(View.VISIBLE);
                    vh.tvask.setText(tb.text);
                }else{//如果是回答,則不顯示問的一方
                    vh.ll_answer.setVisibility(View.VISIBLE);
                    vh.rl_ask.setVisibility(View.GONE);
                    vh.tvanswer.setText(tb.text);
                    //圖片
                    if(tb.imageId>0){
                        vh.ivanswer.setVisibility(View.VISIBLE);
                        vh.ivanswer.setImageResource(tb.imageId);
                    }else{
                        vh.ivanswer.setVisibility(View.GONE);
                    }
                }
                
                return convertView;
            }

    
            
        }
        
        static class ViewHolder{
            public LinearLayout ll_answer;
            public TextView tvanswer;
            public ImageView ivanswer;
            
            public RelativeLayout rl_ask;
            public TextView tvask;
        
        }
}

@2問答數據封裝類

package com.example.chat;
/*
 * 提問與回答的bean
 */
public class TalkBean {
    
    public String text;
    public int imageId;
    public boolean isAsk;
    
    public TalkBean(String text, int imageId, boolean isAsk) {
        super();
        this.text = text;
        this.imageId = imageId;
        this.isAsk = isAsk;
    }

}

@3返回的json數據封裝類

package com.example.chat;

import java.util.ArrayList;

public class VoiceBean {
    
    public ArrayList<WS> ws;
    
    
    public class WS{
        public ArrayList<CW> cw;
        
    }
    
    public class CW{
        public String w;//說話的文字信息
    }

}

8.引用的庫如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM