讯飞离线语音合成接入

讯飞离线语音合成接入:

文字转语音的方法

1.Google TextToSpeech + 中文语音引擎

Google提供了原生的方法TextToSpeech,但是不支持中文,sad…

不过可以用第三方的语音引擎,eg,讯飞,百度…

详情参考:

Android 文字转语音(中文) TextToSpeech+科大讯飞语音引擎3.0

Android文字转语音引擎(TTS)简单比较及下载

个人项目可以尝试用,如果上线项目总不能让用户去下载语音引擎吧

2.第三方语音服务商(讯飞,百度)

接入的是讯飞离线语音SDK

  • 注册讯飞开放平台账号

​ 创建新应用-SDK下载-选择你需要的功能/服务

  • SDK下载/导入
    在这里插入图片描述
    有readme文件,这个必须要读,

sample文件夹里,就是Demo代码,主要包含以下功能

在这里插入图片描述

因为他的demo缺少了很多配置文件,并不能跑起来,所以不仅要配置app目录,project的build.gradle等,还要按照readme提示,添加文件

从讯飞下载的Demo中,是自带APPID的,没有的话需要自己添加

讯飞初始化的地方放在了应用的Application的onCreate中

StringBuffer param = new StringBuffer();
param.append("appid="+getString(R.string.app_id));
param.append(",");
// 设置使用v5+
param.append(SpeechConstant.ENGINE_MODE+"="+SpeechConstant.MODE_MSC);
SpeechUtility.createUtility(SpeechApp.this, param.toString());

我们需要的功能是离线语音合成,点击体验语音合成进入页面
在这里插入图片描述

就可以操作了

封装了一个类处理SpeechSynthesizer

public class TtsManager {private SpeechSynthesizer mTts;private static final String TAG = TtsManager.class.getSimpleName();// 默认云端发音人public static String voicerCloud="xiaoyan";// 默认本地发音人public static String voicerLocal="xiaoyan";private Context mContext;public TtsManager(Context context) {mContext = context;Log.d(TAG,mTtsInitListener+"");mTts = SpeechSynthesizer.createSynthesizer(mContext, mTtsInitListener);Log.d(TAG,"SUCCESS");}// 初始化成功,之后可以调用startSpeaking方法// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,// 正确的做法是将onCreate中的startSpeaking调用移至这里InitListener mTtsInitListener = new InitListener() {@Overridepublic void onInit(int code) {Log.d(TAG, "InitListener init() code = " + code);if (code != ErrorCode.SUCCESS) {if (onTtsInitListener != null) {onTtsInitListener.initError();}Log.d(TAG, "初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");} else {// 初始化成功,之后可以调用startSpeaking方法// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,// 正确的做法是将onCreate中的startSpeaking调用移至这里if (onTtsInitListener != null) {Log.d(TAG, "开始播放");onTtsInitListener.initSpeak();}Log.d(TAG, "初始化成功,开始播放");}}};private OnTtsInitListener onTtsInitListener;public void setOnTtsInitListener(OnTtsInitListener ttsInitListener){this.onTtsInitListener = ttsInitListener;}public interface OnTtsInitListener{void initError();void initSpeak();}private SynthesizerListener mTtsListener = new SynthesizerListener() {@Overridepublic void onSpeakBegin() { //开始播放}@Overridepublic void onSpeakPaused() { //暂停播放}@Overridepublic void onSpeakResumed() { //继续播放}@Overridepublic void onBufferProgress(int i, int i1, int i2, String s) {//合成进度}@Overridepublic void onSpeakProgress(int i, int i1, int i2) {//播放进度}@Overridepublic void onCompleted(SpeechError speechError) {//播放完成}@Overridepublic void onEvent(int i, int i1, int i2, Bundle bundle) {// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因// 若使用本地能力,会话id为null// if (SpeechEvent.EVENT_SESSION_ID == eventType) {//    String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);//    Log.d(TAG, "session id =" + sid);// }//实时音频流输出参考/*if (SpeechEvent.EVENT_TTS_BUFFER == eventType) {byte[] buf = obj.getByteArray(SpeechEvent.KEY_EVENT_TTS_BUFFER);Log.e("MscSpeechLog", "buf is =" + buf);}*/}};/*** 默认本地* @param text* @return*/public int startLocalSpeaking(String text){setParam(SpeechConstant.TYPE_LOCAL,voicerLocal);return  mTts.startSpeaking(text,mTtsListener);}//开始合成/播放public int startSpeaking(String text,String type,String voicer){setParam(type,voicer);return  mTts.startSpeaking(text,mTtsListener);}//停止播放public void stopSpeaking(){if( null != mTts ) {mTts.stopSpeaking();}}//暂停播放public void pauseSpeaking(){mTts.pauseSpeaking();}public void destroySpeaking(){if( null != mTts ){mTts.stopSpeaking();// 退出时释放连接mTts.destroy();}}//继续播放private void resumeSpeaking(){mTts.resumeSpeaking();}private HashMap<String,String> getTtsParam(){HashMap<String,String> hashMap = new HashMap();hashMap.put(SpeechConstant.SPEED,"50");设置合成语速hashMap.put(SpeechConstant.PITCH,"50");//   //设置合成音调hashMap.put(SpeechConstant.VOLUME,"50");//   //设置合成音量hashMap.put(SpeechConstant.STREAM_TYPE,"3");//   //  //设置播放器音频流类型hashMap.put(SpeechConstant.KEY_REQUEST_FOCUS,"50");//   设置播放合成音频打断音乐播放,默认为truehashMap.put(SpeechConstant.AUDIO_FORMAT,"wav");//  设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限hashMap.put(SpeechConstant.TTS_AUDIO_PATH,Environment.getExternalStorageDirectory()+"/msc/tts.wav");return hashMap;/* //设置合成音调mTts.setParameter(SpeechConstant.PITCH, TtsSpUtils.getInstance().getString("pitch_preference", "50"));//设置合成音量mTts.setParameter(SpeechConstant.VOLUME, TtsSpUtils.getInstance().getString("volume_preference", "50"));//设置播放器音频流类型mTts.setParameter(SpeechConstant.STREAM_TYPE, TtsSpUtils.getInstance().getString("stream_preference", "3"));// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");*/}private void setTtsParam(String key,String value){HashMap<String,String> hashMap = getTtsParam();if (key!= null) {hashMap.put(key, value);}for (String mkey:hashMap.keySet()) {mTts.setParameter(mkey,hashMap.get(mkey));}}private void setLocalParam(){// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);//设置使用本地引擎mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);//设置发音人资源路径mTts.setParameter(ResourceUtil.TTS_RES_PATH,getResourcePath());//设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME,voicerLocal);//mTts.setParameter(SpeechConstant.TTS_DATA_NOTIFY,"1");//支持实时音频流抛出,仅在synthesizeToUri条件下支持//设置合成语速mTts.setParameter(SpeechConstant.SPEED, TtsSpUtils.getInstance().getString("speed_preference", "50"));}private void setParam(String mEngineType,String voicer){// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);//设置合成if(mEngineType.equals(SpeechConstant.TYPE_CLOUD)){//设置使用云端引擎mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME,   voicer == null?voicerCloud:voicer);}else {//设置使用本地引擎mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);//设置发音人资源路径mTts.setParameter(ResourceUtil.TTS_RES_PATH,getResourcePath());//设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME,voicer == null?voicerLocal:voicer);}//mTts.setParameter(SpeechConstant.TTS_DATA_NOTIFY,"1");//支持实时音频流抛出,仅在synthesizeToUri条件下支持//设置合成语速mTts.setParameter(SpeechConstant.SPEED, TtsSpUtils.getInstance().getString("speed_preference", "50"));//设置合成音调mTts.setParameter(SpeechConstant.PITCH, TtsSpUtils.getInstance().getString("pitch_preference", "50"));//设置合成音量mTts.setParameter(SpeechConstant.VOLUME, TtsSpUtils.getInstance().getString("volume_preference", "50"));//设置播放器音频流类型mTts.setParameter(SpeechConstant.STREAM_TYPE, TtsSpUtils.getInstance().getString("stream_preference", "3"));// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");}//获取发音人资源路径private String getResourcePath(){StringBuffer tempBuffer = new StringBuffer();//合成通用资源tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet"));tempBuffer.append(";");//发音人资源tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/"+voicerLocal+".jet"));return tempBuffer.toString();}}

还有一个SharedPreferences工具类:

public class TtsSpUtils {private static final String NAME = "Tts";private static TtsSpUtils instance = null;private SharedPreferences sp;public static TtsSpUtils getInstance() {synchronized (TtsSpUtils.class) {if (null == instance) {instance = new TtsSpUtils();}}return instance;}private TtsSpUtils() {}public void init(Context context){init(context,NAME);}public void init(Context context,String spName){sp = context.getApplicationContext().getSharedPreferences(spName,Context.MODE_PRIVATE);}/*** SP 中写入 String** @param key   键* @param value 值*/public void put(@NonNull final String key, @NonNull final String value) {put(key, value, false);}/*** SP 中写入 String** @param key      键* @param value    值* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void put(@NonNull final String key, @NonNull final String value, final boolean isCommit) {if (isCommit) {sp.edit().putString(key, value).commit();} else {sp.edit().putString(key, value).apply();}}/*** SP 中读取 String** @param key 键* @return 存在返回对应值,不存在返回默认值{@code ""}*/public String getString(@NonNull final String key) {return getString(key, "");}/*** SP 中读取 String** @param key          键* @param defaultValue 默认值* @return 存在返回对应值,不存在返回默认值{@code defaultValue}*/public String getString(@NonNull final String key, @NonNull final String defaultValue) {return sp.getString(key, defaultValue);}/*** SP 中写入 int** @param key   键* @param value 值*/public void put(@NonNull final String key, final int value) {put(key, value, false);}/*** SP 中写入 int** @param key      键* @param value    值* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void put(@NonNull final String key, final int value, final boolean isCommit) {if (isCommit) {sp.edit().putInt(key, value).commit();} else {sp.edit().putInt(key, value).apply();}}/*** SP 中读取 int** @param key 键* @return 存在返回对应值,不存在返回默认值-1*/public int getInt(@NonNull final String key) {return getInt(key, -1);}/*** SP 中读取 int** @param key          键* @param defaultValue 默认值* @return 存在返回对应值,不存在返回默认值{@code defaultValue}*/public int getInt(@NonNull final String key, final int defaultValue) {return sp.getInt(key, defaultValue);}/*** SP 中写入 long** @param key   键* @param value 值*/public void put(@NonNull final String key, final long value) {put(key, value, false);}/*** SP 中写入 long** @param key      键* @param value    值* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void put(@NonNull final String key, final long value, final boolean isCommit) {if (isCommit) {sp.edit().putLong(key, value).commit();} else {sp.edit().putLong(key, value).apply();}}/*** SP 中读取 long** @param key 键* @return 存在返回对应值,不存在返回默认值-1*/public long getLong(@NonNull final String key) {return getLong(key, -1L);}/*** SP 中读取 long** @param key          键* @param defaultValue 默认值* @return 存在返回对应值,不存在返回默认值{@code defaultValue}*/public long getLong(@NonNull final String key, final long defaultValue) {return sp.getLong(key, defaultValue);}/*** SP 中写入 float** @param key   键* @param value 值*/public void put(@NonNull final String key, final float value) {put(key, value, false);}/*** SP 中写入 float** @param key      键* @param value    值* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void put(@NonNull final String key, final float value, final boolean isCommit) {if (isCommit) {sp.edit().putFloat(key, value).commit();} else {sp.edit().putFloat(key, value).apply();}}/*** SP 中读取 float** @param key 键* @return 存在返回对应值,不存在返回默认值-1*/public float getFloat(@NonNull final String key) {return getFloat(key, -1f);}/*** SP 中读取 float** @param key          键* @param defaultValue 默认值* @return 存在返回对应值,不存在返回默认值{@code defaultValue}*/public float getFloat(@NonNull final String key, final float defaultValue) {return sp.getFloat(key, defaultValue);}/*** SP 中写入 boolean** @param key   键* @param value 值*/public void put(@NonNull final String key, final boolean value) {put(key, value, false);}/*** SP 中写入 boolean** @param key      键* @param value    值* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void put(@NonNull final String key, final boolean value, final boolean isCommit) {if (isCommit) {sp.edit().putBoolean(key, value).commit();} else {sp.edit().putBoolean(key, value).apply();}}/*** SP 中读取 boolean** @param key 键* @return 存在返回对应值,不存在返回默认值{@code false}*/public boolean getBoolean(@NonNull final String key) {return getBoolean(key, false);}/*** SP 中读取 boolean** @param key          键* @param defaultValue 默认值* @return 存在返回对应值,不存在返回默认值{@code defaultValue}*/public boolean getBoolean(@NonNull final String key, final boolean defaultValue) {return sp.getBoolean(key, defaultValue);}/*** SP 中写入 String 集合** @param key    键* @param values 值*/public void put(@NonNull final String key, @NonNull final Set<String> values) {put(key, values, false);}/*** SP 中写入 String 集合** @param key      键* @param values   值* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void put(@NonNull final String key, @NonNull final Set<String> values, final boolean isCommit) {if (isCommit) {sp.edit().putStringSet(key, values).commit();} else {sp.edit().putStringSet(key, values).apply();}}/*** SP 中读取 StringSet** @param key 键* @return 存在返回对应值,不存在返回默认值{@code Collections.<String>emptySet()}*/public Set<String> getStringSet(@NonNull final String key) {return getStringSet(key, Collections.<String>emptySet());}/*** SP 中读取 StringSet** @param key          键* @param defaultValue 默认值* @return 存在返回对应值,不存在返回默认值{@code defaultValue}*/public Set<String> getStringSet(@NonNull final String key, @NonNull final Set<String> defaultValue) {return sp.getStringSet(key, defaultValue);}/*** SP 中获取所有键值对** @return Map 对象*/public Map<String, ?> getAll() {return sp.getAll();}/*** SP 中是否存在该 key** @param key 键* @return {@code true}: 存在<br>{@code false}: 不存在*/public boolean contains(@NonNull final String key) {return sp.contains(key);}/*** SP 中移除该 key** @param key 键*/public void remove(@NonNull final String key) {remove(key, false);}/*** SP 中移除该 key** @param key      键* @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void remove(@NonNull final String key, final boolean isCommit) {if (isCommit) {sp.edit().remove(key).commit();} else {sp.edit().remove(key).apply();}}/*** SP 中清除所有数据*/public void clear() {clear(false);}/*** SP 中清除所有数据** @param isCommit {@code true}: {@link SharedPreferences.Editor#commit()}<br>*                 {@code false}: {@link SharedPreferences.Editor#apply()}*/public void clear(final boolean isCommit) {if (isCommit) {sp.edit().clear().commit();} else {sp.edit().clear().apply();}}private static boolean isSpace(final String s) {if (s == null) return true;for (int i = 0, len = s.length(); i < len; ++i) {if (!Character.isWhitespace(s.charAt(i))) {return false;}}return true;}}

使用方式:

​ Application中的onCreate()中

  TtsSpUtils.getInstance().init(this);

在需要用的的Activity或者BaseActivity中

private TtsManager ttsManager;
/*** 开始语音播放.必须调该方法*/
public  void initSpeech(String speakText){initSpeech(speakText,true);
}
public void initSpeech(String speakText,boolean isSpeak){if (!isSpeak) return;ttsManager = new TtsManager(this);ttsManager.setOnTtsInitListener(new TtsManager.OnTtsInitListener() {@Overridepublic void initError() {}@Overridepublic void initSpeak() {ttsManager.startLocalSpeaking(speakText);}});}

Note: APPID 和 资源文件必须匹配,否则Log会提示错误

DEMO/Lib下载地址

1.使用下载的Demo,需要替换libs和assets的所有资源文件以及appid,考虑layout中的文件是否替换

2.如果依赖module,和上面一样需要替换资源文件,必须把libs中的libmsc.so文件放入 主项目的src/main/jniLibs/armeabi-v7a中

如果放在libs中,你必须sourceSet指明libs文件夹

把下面的maven地址放在Project的build.gradle里

 allprojects {repositories {// Msc.jar线上maven地址maven{url 'http://libmsc.xfyun.cn/repository/maven-releases/'}jcenter()mavenCentral()}}

别忘了Application中的讯飞初始化

题外:目前讯飞1137版本在rk3399平台上初始化不成功,卡在初始方法上
参考:
科大讯飞在线语音合成
科大讯飞语音合成实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50492.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何高效Prompt?

优先声明&#xff0c;本文来自转载&#xff0c;来源为稀土掘金的腾讯云开发者 的个人主页 - 动态 - 掘金 本文原文来自我问了鹅厂程序员&#xff1a;你们工作中怎么用ChatGPT&#xff1f;如何高效Prompt&#xff1f; - 掘金 如有侵权冒犯&#xff0c;联系立删。 &#x1f44…

解决Mac电脑连接校园网不弹出登陆窗口问题汇总

1.查看你的DNS有没有改过&#xff0c;把自己改过的DNS全部删除&#xff0c;变更为默认的就好。 2.有使用梯子的同学&#xff0c;记得把梯子暂时先关闭一下&#xff0c;然后在连接校园网Wi-Fi。 3.你有登录页面的网址吗&#xff1f;没有的话&#xff0c;让同学复制给你&#xf…

python毕业设计 基于django框架校园鲜花水果商城毕业设计设计与实现

商城功能概要 首页、分类、商品详情页面&#xff0c;包含加入购物车、收藏商品、立即购买、用户登录、订单管理、地址管理&#xff1b;完整的购物流程&#xff0c;商品的加入、编辑、删除、批量选择&#xff0c;收货地址的选择&#xff0c;下单、会员中心&#xff08;订单、收…

基于Java+SpringBoot+Vue前后端分离校园闲置物品交易网站

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

案例26:基于Springboot校园社团管理系统开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

基于Java+Vue+uniapp微信小程序实现餐厅校园订餐平台

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅&#x1f447;&#x1f…

校园网不能建立到远程计算机,校园网已拒绝远程连接是什么问题及如何解决

校园网已拒绝远程连接是什么问题及如何解决你知道吗&#xff1f;对于正常日常生活中的我们在需要远程进行办公或学习的时候出现这种问题最让人头大了&#xff0c;可是面对这样的问题我们应该如何更好的解决呢&#xff1f;一般出现校园网无法远程连接的原因有太多&#xff0c;这…

天翼校园网连接不上服务器无响应,天翼校园网dns解析出错怎么办

摘要 腾兴网为您分享:苹果手机&#xff0c;芒果tv&#xff0c;闲聊app&#xff0c;爱奇艺视频&#xff0c;步步高等知识经验教程&#xff0c;欢迎大家关注腾兴网。 很多大学生都是用的天翼校园网&#xff0c;在学校办理的便宜好用&#xff0c;不过有在使用中会碰到各种问题&…

天翼校园网连接不上服务器无响应,使用天翼校园客户端提示登陆失败应该怎么处理?...

对于学生党来说&#xff0c;很多人在学校里上网都是使用校园网&#xff0c;校园网要求必须要使用天翼校园客户端才能连接&#xff0c;但是使用这个软件进行连接的时候&#xff0c;有时候我们会遇到“网络异常12006&#xff0c;请求登陆失败”这样的报错&#xff0c;这时候应该怎…

12星座的出生年月日性格_12星座的出生年月以及性格分析 复制的也可以

12星座的出生年月以及性格分析 复制的也可以 12星座的出生年月以及性格分析 复制的也可以 发布时间&#xff1a;2020-12-18 11:51:48 是水瓶座。农历2001年正月初二是公历2001年1月25日。星座按公历(阳历)出生日期算白羊座(3月21日-4月20日)金牛座(4月21日-5月21日)双子座(5月2…

推荐5个神仙软件,个个让你爱不释手

最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧时间整理出几个好用的软件&#xff0c;希望可以帮到大家。 1.视频抓取——硕鼠 一个非常好用的FLV视频下载工具&#xff0c;提供80多个平台的音视频批量下载&#xff0c;而且还支持多线程同时下载&#xff0c;下载速…

赚钱软件哪个赚钱多又容易?资深用户推荐人人都可以赚钱的APP

最近两年&#xff0c;网上的赚钱软件可谓是越来越多了&#xff0c;仅仅是我知道的软件就有好几百款&#xff01;如此之多的软件&#xff0c;到底哪一个赚钱多又快呢&#xff1f;经过我长时间的测试&#xff0c;最后终于找到了一款赚钱多又快的软件&#xff0c;接下来我就会将这…

能把爱情当游戏玩的星座,无敌!

冠军&#xff08;天秤座&#xff1a;他们喜欢扑朔迷离的恋情&#xff09;亚军&#xff08;天蝎座&#xff09;、季军&#xff08;双鱼座&#xff09; 第四名&#xff08;射手座&#xff09; 第五名&#xff08;水瓶座&#xff09; 第六名&#xff08;摩羯座&#xff09; 第…

摘星-上升篇

学识有限&#xff0c;纯属爱好。以下内容均来自阳光占星&#xff0c;如有冒犯&#xff0c;告知删除&#xff01; 上升金牛——歌者的哼唱 有这么一类人&#xff0c;可能有着细致柔和的五官&#xff0c;容易发胖的体质以及坚定的眼神。有点害羞与腼腆&#xff1b;喜欢哼唱着小曲…

占星术合理吗?各个星座最喜欢用的表情是什么?

本文转载自 读芯术 图源&#xff1a;unsplash 通过分析数千条推文&#xff0c;我们找到了热门的星座推特账号&#xff0c;利用机器学习Bertmoticon包来分析预测每个星座的表情。结果让我们大吃一惊&#xff01; 首先&#xff0c;我们在推特上进行搜索&#xff0c;通过粉丝的数…

DragGAN图像生成原理与实现

DragGAN图像生成原理与实现 DragGAN模型是什么呢1. DragGAN背景介绍2. 模型方法2.1 算法原理2.1.1 Motion Supervision2.1.2 点跟踪 3. 实现部署步骤3.1 安装PyTorch3.2 安装 DragGAN3.3 运行 DragGAN Demo3.4 功能介绍 项目地址&#xff1a;https://github.com/Zeqiang-Lai/Dr…

实验六 UML建模工具应用

一、实验目的 1.掌握面向对象开发思想及实现机制 2.理解并掌握UML常用图&#xff08;重点&#xff1a;类、对象图、用例图&#xff09; 3.掌握并常见UML建模工具&#xff0c;并绘制UML各种图 二、实验准备与要求 1.StarUML(简称SU)&#xff0c;是一种创建UML类图&#xff0c…

【Android项目开发】聊天功能-主界面设计(对标企业需求)

文章目录 一、引言二、详细设计1、解决需求&#xff08;1&#xff09;图形问题&#xff08;2&#xff09;文本长度问题&#xff08;3&#xff09;时间转换问题 2、UI设计&#xff08;1&#xff09;主界面&#xff08;2&#xff09;适配器 3、Adapter适配器4、测试参数 三、附录…

软件建模概述 UML模型图

软件建模 什么是软件建模 将想法通过模型可视化地表达出来&#xff0c;方便记忆和进一步分析&#xff0c;方便团队/同事交流&#xff0c;口语交流容易失真。 软件建模体现了软件设计的思想&#xff0c;在需求和实现之间架起了一座桥梁&#xff0c;通过模型指导软件系统的具体…

ChatGPT-4竟已经学会说谎——聪明又危险的AI

时间回到2023年3月&#xff0c;OpenAI正式发表GPT-4的最新模型&#xff0c;除了展示聊天机器人如何完成各种任务&#xff0c;还在官网发了一份90多页报告&#xff0c;提及各项特性与可能存在的风险。同时&#xff0c;OpenAI为了检测它可能带来的“潜在的威胁”&#xff0c;而让…