语音播报_语音播报模块 - CSDN
精华内容
参与话题
  • Android语音播报的两种简单实现

    万次阅读 2018-11-22 13:28:29
    1、Android自带的语音播报(老版本手机Android6.0以下,不支持中文) 2、讯飞语音播报封装(直接用) b、具体实现 一、Android自带的语音播报 查看手机是否支持中文语音播报,在测试的设备中打开‘设置’ --&...

     a、两种方案

    1、Android自带的语音播报(老版本手机Android6.0以下,不支持中文)

    2、讯飞语音播报封装(直接用)

    b、具体实现

    一、Android自带的语音播报

    查看手机是否支持中文语音播报,在测试的设备中打开‘设置’ -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文。

    public class AndroidTTSActivity extends AppCompatActivity implements View.OnClickListener {
    
    
        private TextToSpeech textToSpeech = null;//创建自带语音对象
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.android_tts_layout);
            findViewById(R.id.btn0).setOnClickListener(this);
            initTTS();
        }
    
        private void initTTS() {
            //实例化自带语音对象
            textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {
                    if (status == textToSpeech.SUCCESS) {
                        // Toast.makeText(MainActivity.this,"成功输出语音",
                        // Toast.LENGTH_SHORT).show();
                        // Locale loc1=new Locale("us");
                        // Locale loc2=new Locale("china");
    
                        textToSpeech.setPitch(1.0f);//方法用来控制音调
                        textToSpeech.setSpeechRate(1.0f);//用来控制语速
    
                        //判断是否支持下面两种语言
                        int result1 = textToSpeech.setLanguage(Locale.US);
                        int result2 = textToSpeech.setLanguage(Locale.
                                SIMPLIFIED_CHINESE);
                        boolean a = (result1 == TextToSpeech.LANG_MISSING_DATA || result1 == TextToSpeech.LANG_NOT_SUPPORTED);
                        boolean b = (result2 == TextToSpeech.LANG_MISSING_DATA || result2 == TextToSpeech.LANG_NOT_SUPPORTED);
    
                        Log.i("zhh_tts", "US支持否?--》" + a +
                                "\nzh-CN支持否》--》" + b);
    
                    } else {
                        Toast.makeText(AndroidTTSActivity.this, "数据丢失或不支持", Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
        }
    
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.btn0) {
                startAuto("big sea");
            }
    
        }
    
        private void startAuto(String data) {
            // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
            textToSpeech.setPitch(1.0f);
            // 设置语速
            textToSpeech.setSpeechRate(0.3f);
            textToSpeech.speak(data,//输入中文,若不支持的设备则不会读出来
                    TextToSpeech.QUEUE_FLUSH, null);
    
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            textToSpeech.stop(); // 不管是否正在朗读TTS都被打断
            textToSpeech.shutdown(); // 关闭,释放资源
        }
    
    
    }

    补充工具类

    /**
     * Created by RongGuang on 2014-11-21.
     * 中文朗读
     */
    public class ChineseToSpeech {
        private TextToSpeech textToSpeech;
    
        public ChineseToSpeech() {
            this.textToSpeech = new TextToSpeech(Application.getContext(), new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {
                    if (status == TextToSpeech.SUCCESS) {
                        int result = textToSpeech.setLanguage(Locale.CHINA);
                        if (result == TextToSpeech.LANG_MISSING_DATA
                                || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                            new CoolToast(Application.getContext()).show("不支持朗读功能");
                        }
                    }
                }
            });
        }
    
        public void speech(String text) {
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
        }
    
        public void destroy() {
            if (textToSpeech != null) {
                textToSpeech.stop();
                textToSpeech.shutdown();
            }
        }
    }

    二、讯飞语音播报封装(直接用)

    1.接入项目前准备:

    1.申请APPID(步骤):

    I.登录讯飞官网-->创建应用-->创建完成在''我的应用"中即可看见自己新建的项目&APPID-->

     

    II.添加需要开通的服务:这里选择在线语音合成+sdk下载(so+jar文件),注意:so文件必须用你对应的项目的,用别人so文件,会导致与你的APPID不匹配,

    2.使用说明+接入高频易发问题:

    • 语音次数是有限制的,提高次数需要实名认证+上传项目
    • 引入的so文件必须是你项目所对应的
    • 不可多次初始化合成对象

    3.接入项目(AndroidStudio):

     I.相关sdk文件引入,如图(再次说明:so文件用的是你新建项目的so文件,不要用他人so):

    II.初始化语音播报(API>=23需要授权,所以先授权,再初始化,如下:)

    public class StartActivity extends AppCompatActivity {
    
    
        private List<String> permissionList = null;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SystemClock.sleep(1000);//延时加载
            requestPermissions();
        }
    
        private void openActivity(Class<? extends AppCompatActivity> clazz) {
            initTTS();
            startActivity(new Intent(this, clazz));
            finish();
        }
    
        //权限申请
        private void requestPermissions() {
            // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                addListPermission();
                boolean isGranted = false;//是否全部授权
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                Iterator<String> iterator = permissionList.iterator();
                while (iterator.hasNext()) {
                    // 检查该权限是否已经获取
                    int granted = ContextCompat.checkSelfPermission(this, iterator.next());
                    if (granted == PackageManager.PERMISSION_GRANTED) {
                        iterator.remove();//已授权则remove
                    }
                }
                if (permissionList.size() > 0) {
                    // 如果没有授予该权限,就去提示用户请求
                    //将List转为数组
                    String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                    // 开始提交请求权限
                    ActivityCompat.requestPermissions(this, permissions, 0x10);
                } else {
                    Log.i("zhh", "权限已申请");
                    openActivity(MainActivity.class);
                }
    
            } else {
                openActivity(MainActivity.class);
            }
        }
    
        //初始化语音合成
        private void initTTS() {
            //讯飞语音播报平台
            SpeechUtility.createUtility(this, "appid=");//=号后面写自己应用的APPID
            Setting.setShowLog(true); //设置日志开关(默认为true),设置成false时关闭语音云SDK日志打印
            TTSUtils.getInstance().init(); //初始化工具类
        }
    
    
        /**
         * 权限申请返回结果
         *
         * @param requestCode  请求码
         * @param permissions  权限数组
         * @param grantResults 申请结果数组,里面都是int类型的数
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 0x10:
                    if(grantResults.length>0&&ifGrantResult(grantResults)){
                        Toast.makeText(this, "同意权限申请", Toast.LENGTH_SHORT).show();
                        openActivity(MainActivity.class);
                    }else{
                        Toast.makeText(this, "权限被拒绝了", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                    break;
                default:
                    break;
            }
    
        }
    
        private boolean ifGrantResult(int[] grants) {
            boolean isGrant = true;
            for (int grant : grants) {
                if (grant == PackageManager.PERMISSION_DENIED) {
                    isGrant = false;
                    break;
                }
            }
            return isGrant;
        }
    
    
        //敏感权限添加
        private void addListPermission() {
            if (null == permissionList) {
                permissionList = new ArrayList<>();
                permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                permissionList.add(Manifest.permission.READ_PHONE_STATE);
                permissionList.add(Manifest.permission.RECORD_AUDIO);
            }
        }
    
    }

     

    III.语音播报封装(部分代码)

    public class TTSUtils implements InitListener, SynthesizerListener {
    
        private static volatile TTSUtils instance = null;
        private boolean isInitSuccess = false;
        private SpeechSynthesizer mTts;
    
        //单例模式
        public static TTSUtils getInstance() {
            if (instance == null) {
                synchronized (TTSUtils.class) {
                    if (instance == null) {
                        instance = new TTSUtils();
                    }
                }
            }
            return instance;
        }
    
        public TTSUtils() {
    
        }
    
        // 初始化合成对象
        public void init() {
            //判断进程是否已启动,初始化多次会报错
            //个人遇到问题:极光推送引入后,不加该条件回报错
            if (CourseUtils.resultProcess("com.zhanghai.ttsapp")) {
    
                mTts = SpeechSynthesizer.createSynthesizer(App.getContext(), this);
                // 清空参数
                mTts.setParameter(SpeechConstant.PARAMS, null);
                // 设置在线云端
                mTts.setParameter(SpeechConstant.ENGINE_TYPE,
                        SpeechConstant.TYPE_CLOUD);
    
                // 设置发音人--发音人选择--具体见values-string
                mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");
    
                // 设置发音语速
                mTts.setParameter(SpeechConstant.SPEED, "50");
                // 设置音调
                mTts.setParameter(SpeechConstant.PITCH, "50");
                // 设置合成音量
                mTts.setParameter(SpeechConstant.VOLUME, "100");
                // 设置播放器音频流类型
                mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
                // 设置播放合成音频打断音乐播放,默认为true
                mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
                // 设置音频保存路径,需要申请WRITE_EXTERNAL_STORAGE权限,如不需保存注释该行代码
    //        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");
                Log.i("zhh", "--初始化成完成-");
            }
    
        }
    
        //开始合成
        public void speak(String msg) {
            if (isInitSuccess) {
                if (mTts.isSpeaking()) {
                    stop();
                }
                mTts.startSpeaking(msg, this);
            } else {
                init();
            }
        }
    }

    IV:调用实例

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private static final String TAG = MainActivity.class.getSimpleName();
        private EditText et = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            et = findViewById(R.id.et);
            findViewById(R.id.btn0).setOnClickListener(this);
            findViewById(R.id.btn1).setOnClickListener(this);
            findViewById(R.id.btn2).setOnClickListener(this);
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn0:
                    TTSUtils.getInstance().speak("bigsea是大海");
                    break;
                case R.id.btn1:
                    String msg = et.getText().toString();
                    TTSUtils.getInstance().speak(TextUtils.isEmpty(msg) ? "输入信息为空" : msg);
                    break;
                case R.id.btn2:
                    startActivity(new Intent(this, AndroidTTSActivity.class));
                    break;
                default:
                    break;
            }
        }
    
        @Override
        protected void onResume() {
            //移动数据统计分析--不用可不用加入
            FlowerCollector.onResume(MainActivity.this);
            FlowerCollector.onPageStart(TAG);
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            //移动数据统计分析
            FlowerCollector.onPageEnd(TAG);
            FlowerCollector.onPause(MainActivity.this);
            super.onPause();
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            TTSUtils.getInstance().release();//释放资源
        }
    
    }

    完!!!

    原文地址:http://www.cnblogs.com/xxdh/p/9303377.html

    下载地址:https://github.com/seastoneard/TTSApp

     

     

    展开全文
  • Android studio开发,使用讯飞SDK实现在线语音播报,通过输入的文字转换成语音播报出来,可以设置发音人,可以识别英语,中文等等语言。
  • YS-M3语音播报模块使用手册YS-M3语音播报模块使用手册YS-M3语音播报模块使用手册YS-M3语音播报模块使用手册YS-M3语音播报模块使用手册YS-M3语音播报模块使用手册YS-M3语音播报模块使用手册
  • android安卓语音播报功能开发,实现语音播报功能,严格按照官方开发文档来写的,简单易懂,亲测不会有任何问题,导入就可以允许,所有的jar包,.so包都是最新的
  • H5的语音播报功能

    千次阅读 2019-02-20 14:55:01
    //语音播报2 H5  var num = 0;  var va ;  function speckText(str){  va = setInterval(function(){  if(num==2){  clearInterval(va);  return num ...


        //语音播报2 H5
        var num = 0;
        var va ;
        function speckText(str){
            va = setInterval(function(){
                if(num==2){
                     clearInterval(va);
                     return num = 0;
                 }
                var msg = new SpeechSynthesisUtterance(str);
                msg.rate=0.5;
                msg.lang='zh-CN';
               // msg.lang='en-US';
                console.log(window.speechSynthesis.getVoices())
                window.speechSynthesis.speak(msg);
                num+=1;
             },2000);
        }

    展开全文
  • 一款简单的语音播报app

    千次阅读 2018-02-27 21:52:32
    这是一款可以语音播报多功能的app。。。下面说说实现代码吧先看一下效果图:首先先弄好界面xml代码&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android...

    这是一款可以语音播报多功能的app。。。下面说说实现代码吧

    先看一下效果图:


    首先先弄好界面xml代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="match_parent" tools:context="com.example.myapplication.MainActivity"
        android:orientation="vertical"
        android:background="@drawable/bei">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="选择语言"
            android:textColor="#c6b821"
            android:textSize="30dp"/>
        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/spinner"></Spinner>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="输入需要朗读的文字"
            android:textSize="30dp"
            />
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edt"
            android:background="@drawable/edt"
            />
        <Button
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="播放"
            android:textColor="#fff"
            android:textSize="30dp"
            android:id="@+id/btn"
            android:background="@drawable/loing_btns"/>
        <Button
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="结束"
            android:textColor="#fff"
            android:textSize="30dp"
            android:background="@drawable/loing_btns"
            android:id="@+id/btn1"/>
        <Button
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="循环播放"
            android:textColor="#fff"
            android:textSize="30dp"
            android:background="@drawable/loing_btns"
            android:id="@+id/btn2"/>
    </LinearLayout>
    

    然后Mainactivity.java里面

    package com.example.myapplication;
    
    import android.content.DialogInterface;
    import android.speech.tts.TextToSpeech;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.CompoundButton;
    import android.widget.EditText;
    import android.widget.SimpleAdapter;
    import android.widget.Spinner;
    import android.widget.ToggleButton;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    
    
    public class MainActivity extends AppCompatActivity {
        private TextToSpeech textToSpeech = null; //TTS
        private Spinner spinner ; //下拉列表框
        private EditText editText;
        private Button button;
        private String[] langs;//下拉列表款里面的选项
        private String curLang;
        private List<String> list = new ArrayList<String>();
        private ArrayAdapter<String> arrayAdapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            langs = getResources().getStringArray(R.array.languages);
            spinner = (Spinner)findViewById(R.id.spinner);
            editText = (EditText)findViewById(R.id.edt);
            button = (Button)findViewById(R.id.btn);
             Button button1 = (Button)findViewById(R.id.btn1);
            Button button2 = (Button)findViewById(R.id.btn2);
            for (int i = 0;i<langs.length;i++){
                list.add(langs[i]);
            }
            langs = getResources().getStringArray(R.array.languages);
            ArrayAdapter arrayAdapter = new ArrayAdapter(this,R.layout.support_simple_spinner_dropdown_item,langs);
            spinner.setAdapter(arrayAdapter);
            spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { //下拉列表框点击事件
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    curLang = (String)spinner.getAdapter().getItem((int)l);
                    if(textToSpeech!=null){
                        textToSpeech.stop();
                        textToSpeech.shutdown();
                        textToSpeech = null;
                    }
                    textToSpeech = new TextToSpeech(MainActivity.this,new TTSListener()); //给定一个TTS语音
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> adapterView) {
    
                }
            });
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    textToSpeech.speak(editText.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
                }
            });
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    textToSpeech.stop();
                }
            });
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    for(int i = 0;i<10;i++) {
                        textToSpeech.speak(editText.getText().toString(), TextToSpeech.QUEUE_ADD, null);
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
        }
    
        private  int SetLanguage(String lang){
            int result = 0;
            if (lang.equals("中文")){
                result = textToSpeech.setLanguage(Locale.CHINESE);
            }
            else if (lang.equals("英文")){
                result = textToSpeech.setLanguage(Locale.ENGLISH);
            }
            else if (lang.equals("日语")){
                result = textToSpeech.setLanguage(Locale.JAPANESE);
            }
            else if (lang.equals("韩语")){
                result = textToSpeech.setLanguage(Locale.KOREAN);
            }
            else if (lang.equals("法语")){
                result = textToSpeech.setLanguage(Locale.FRENCH);
            }
            else if (lang.equals("意大利语")){
                result = textToSpeech.setLanguage(Locale.ITALIAN);
            }
            return result;
        }
        private class TTSListener implements TextToSpeech.OnInitListener{
            @Override
            public void onInit(int i) {
                if (i == TextToSpeech.SUCCESS){
                    int result = SetLanguage(curLang);
                    if(result==TextToSpeech.LANG_MISSING_DATA||result ==TextToSpeech.LANG_NOT_SUPPORTED) {
                        textToSpeech.speak("你输入的不是该国语言", TextToSpeech.QUEUE_FLUSH, null);
                    }
                }
            }
        }
    
    }
    

    如果有不懂得spinner下拉列表框的使用可参考我的上一篇博客里面有详细的介绍,最后祝大家生活愉快,谢谢观看。。。

    展开全文
  • 语音播报

    2020-04-29 18:43:30
  • 语音播报功能总结:

    2019-01-08 11:04:24
    //设置说话语速 语音朗读速度,取值范围为-10到+10。数值越大,速度越快 voiceObj.Rate=?; //设置说话音量 取值范围为0到100。数值越大,音量越大。 voiceObj.Volume=?; //表示发音类型,相当于进行朗读的人,我们可...
  • vue做语音播报功能

    千次阅读 2019-04-24 18:02:39
    <template> <div> <div> <input type="text" id="ttsText"> <input type="button" id="tts_btn" @click="myplay()" value="播放">...div id="bdtts_div...
  • C# 语音播报

    千次阅读 2016-12-07 19:38:43
    添加引用COM中添加Microsoft Speech Object Library...简单代码实现SpeechVoiceSpeakFlags flag= SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice voice = new SpVoice(); string voice_txt ="苟利国家生死以,岂因祸福
  • java实现语音播报功能

    万次阅读 多人点赞 2017-06-21 10:58:29
    需要做的工作: 1、下载jacob-1.17-M2.rar 2、解压jacob-1.17-M2.rar 3、向工程里导入jacob.jar 4、将jacob-1.17-M2-x86.dll拷贝到jdk的bin目录和windows/system32目录 5、源代码如下 ... // 创建与微软应用程序...
  • WebSpeech前端语音播报简单实现

    千次阅读 2018-09-21 13:35:30
    //首先导入该js &lt;script type='text/javascript' src='/pcQuery/js/WebSpeech.js'&gt;&lt;/script&gt; //第二步:在你需要读取的地方执行就ok &lt;... WebSpeech.ser...
  • 用Python实现语音播报

    万次阅读 2018-02-27 11:37:46
    以下内容为带着儿子一起学Python的实现记录,为自己保存下来,也希望对其他学习者有用!1. 确保已经安装python,本例使用python,操作系统为:Windows 10 专业版;2. 设置环境变量,设置两个path路径。...
  • 如何将推送到手机的消息通知转换成语音自动播放出来?典型的应用场景是,顾客支付成功后,收银员的手机自动播放支付到账语音。要实现这个需求,一是需要语音合成API,可使用百度的语音合成API,另外就是手机收到消息...
  • Android语音播报、后台播报、语音识别

    万次阅读 多人点赞 2015-06-05 17:43:44
    Android语音播报、后台播报、语音识别 本文介绍使用讯飞语音实现语音播报、语音识别功能。 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序效果图: 简单的XML布局 ...
  • python实现文字转语音播报

    千次阅读 2020-08-13 12:57:57
    文字是最优美的事物,但是大量的文字看起来就是略显枯燥,通过几行简单的代码就能实现文字转化...# 语音播报模块 import pyttsx3 # 模块初始化 engine = pyttsx3.init() print('准备开始语音播报...') # 设...
  • 买了2种语音模块,一个龙邱SYN7318,一个讯飞的离线语音模块,今天先记录下移植SYN7318,讯飞的还没搞 这个是已经移植到正点原子F1开发板的程序,下载地址:...
  • 下方图片是我自己写的demo,可以实现一次性的短文本语音播报,于是按这个思路想实现长文本的语音播报,可是出了点问题想不出怎么解决。望大佬指点迷津。 ![图片说明]...
  • H5 语音合成播报功能

    万次阅读 热门讨论 2018-09-29 11:13:58
    采用的 SpeechSynthesisUtterance实现语音播报功能,参考资料: ONE、TWO实现效果图:语法介绍1、speechSynthesis.getVoices()getVoices()的方法SpeechSynthesis接口返回的列表SpeechSynthesisVoice对象代表当前设备...
  • 说到小程序自动语音播报功能,不得不提到官方的一款小程序“收款小账本”,当收到一笔款后,就能语音提醒。 这是在收款小程序的应用,再举2个例子! ▍外卖 店家做了一个简单的外卖小程序,一来尝试互联网...
1 2 3 4 5 ... 20
收藏数 5,524
精华内容 2,209
关键字:

语音播报