Android apps 拍立知-功能实现(百度tts语音合成使用)

上回分解,拍立知其中一个功能就是利用文字转成语音再播放出来,这期写一下如何使用。

(在开始之前,强烈建议仔细阅读 百度语音-语音合成-SDK开发文档  能减少90%开发时候遇到的问题。  

结合官方demo阅读效果更佳  

首先,从百度ai上download下百度tts的sdk包(http://ai.baidu.com/sdk)。

下载解压后是个完整的工程,里面已经有几个完整的demo了,而且介绍也是十分的详细,操作之前可以都尝试一下有什么效果。

SynthActivity: 合成demo。含在线和离线,没有纯离线功能。 根据网络状况优先走在线,在线时访问服务器失败后转为离线。
MiniActivity:精简版合成。
SaveFileActivity :保存合成后的音频。

接下来先看一下我的项目文件,control、listener、util三个文件夹可以在 百度tts语音合成示例中找到,移植过来这边,还有一个MainHandlerConstant文件。(根据你们的实际要求适当增减,这个是以我的示例为例)


三个Activity就是主要的工程文件,MainActivity是进入界面后的处理,startActivity是进入的旋转页面,ViewActiviy作为主界面的跳转。

 

接下来介绍MainActivity里面实现功能,首先从页面看起,页面布局如下:

百度tts语音合成用武之地就在语音播放这里。

我们看一下百度tts语音合成MainActivity位于的设计:

一、首先定义必要的调用信息:

protected String appId = "你的百度appId";
protected String appKey = "你的百度appKey ";
protected String secretKey = "你的百度secretKey";
private TtsMode ttsMode = TtsMode.ONLINE;//设置TTS模式,这是仅在线

protected SpeechSynthesizer mSpeechSynthesizer;//初始化SpeechSynthesizer 
String Speck_TEXT="尚未有识别项目,请识别后点击。";//这个是保存Text显示的内容

private Button mSpeak;//这些控件可以自行定义,还有一些就不全部展示
private Button mStop;
private TextView mShowText;

 二、精简其函数(这里我只用了在线的模式,所以大部分代码可以裁剪)

这个初始化的initTTs函数(在onCreate里面初始化一下),好像音量(男/女)、声音、语速这些,在https://ai.baidu.com/docs#/TTS-Android-SDK/top下有详细的变量解释。

private void initTTs() {
        LoggerProxy.printable(true);
        SpeechSynthesizerListener listener = new UiMessageListener(mainHandler);
        // 1. 获取实例
        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        mSpeechSynthesizer.setContext(this);
        // 2. 设置listener
        mSpeechSynthesizer.setSpeechSynthesizerListener(listener);
        // 3. 设置appId,appKey.secretKey
        int result = mSpeechSynthesizer.setAppId(appId);
        checkResult(result, "setAppId");
        result = mSpeechSynthesizer.setApiKey(appKey, secretKey);
        checkResult(result, "setApiKey");

        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "3");
        // 设置合成的音量,0-9 ,默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");
        // 设置合成的语速,0-9 ,默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "3");
        // 设置合成的语调,0-9 ,默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");

        mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);
        Map<String, String> params = new HashMap<>();
        InitConfig initConfig =  new InitConfig(appId, appKey, secretKey, ttsMode, params, listener);

        result = mSpeechSynthesizer.initTts(ttsMode);
        checkResult(result, "initTts");
    }

  一个speak(),一个stop()定义事件。


    private void speak() {
        if (mSpeechSynthesizer == null) {
            print("[ERROR], 初始化失败");
            return;
        }
        mShowText.setText("");
        mShowText.setText(Speck_TEXT);
        Toast.makeText(getApplicationContext(),"正在连接播放...请稍等",Toast.LENGTH_LONG).show();
        int result = mSpeechSynthesizer.speak("播放开始"+Speck_TEXT+"语音播放播放完成");//speak 在这
        checkResult(result, "speak");//获取错误代码
    }
    private void stop() {
        print("停止播放!");//停止合成引擎
        int result = mSpeechSynthesizer.stop();
        checkResult(result, "stop");
    }
    

initView()在于监听是否有onClick, checkResult这个是回传结果,如果有错误会回传错误代码。

//  下面是UI部分
    private void initView() {
        mSpeak = (Button) this.findViewById(R.id.start);
        mStop = (Button) this.findViewById(R.id.pause);
        mShowText = (TextView) this.findViewById(R.id.showText);
        View.OnClickListener listener = new View.OnClickListener() {
            public void onClick(View v) {
                int id = v.getId();
                switch (id) {
                    case R.id.start:
                        speak();
                        break;
                    case R.id.pause:
                        stop();
                        break;
                    default:
                        break;
                }
            }
        };
        mSpeak.setOnClickListener(listener);
        mStop.setOnClickListener(listener);
        mainHandler = new Handler() {

            // @param msg

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.obj != null) {
                    //print(msg.obj.toString());//调试作用
                }
            }

        };
    }
    private void print(String message) {
        Log.i(TAG, message);
        mShowText.append(message + "\n");
    }
    @Override
    protected void onDestroy() {
        if (mSpeechSynthesizer != null) {
            mSpeechSynthesizer.stop();
            mSpeechSynthesizer.release();
            mSpeechSynthesizer = null;
            print("释放资源成功");
        }
        super.onDestroy();
    }
    private void checkResult(int result, String method) {
        if (result != 0) {
            print("error code :" + result + " method:" + method + ", 错误码文档:http://yuyin.baidu.com/docs/tts/122 ");
        }
        System.out.println("错误参数:"+result);
        if(result == -15 )
        {
            Toast.makeText(getApplicationContext(),"语音请求超时,请重新点击播放或切换网络环境。",Toast.LENGTH_LONG).show();
        }
    }

下面就是一个对于权限的获取,后面调用相机应用也需要某些权限,所以这里申请。

private void initPermission() {
        String[] permissions = {
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.MODIFY_AUDIO_SETTINGS,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_SETTINGS,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.CHANGE_WIFI_STATE
        };

        ArrayList<String> toApplyList = new ArrayList<String>();

        for (String perm : permissions) {
            if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
                toApplyList.add(perm);
                // 进入到这里代表没有权限.
            }
        }
        String[] tmpList = new String[toApplyList.size()];
        if (!toApplyList.isEmpty()) {
            ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
        }
    }

对应的, AndroidManifest.xml也要做权限的注册。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

 

 以上就是百度tts语音合成使用在MainActivity中的简单调用,通过修改Speck_TEXT修改播放内容。

播放是函数speak()方法,做处理的是函数下这句

mSpeechSynthesizer.speak("播放开始"+Speck_TEXT+"语音播放播放完成")

 

下一节,介绍相机功能的调用和百度图像识别功能的调用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值