国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

這篇具有很好參考價(jià)值的文章主要介紹了【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

系統(tǒng):Win10
Java:1.8.0_333
IDEA:2020.3.4
Gitee:https://gitee.com/lijinjiang01/SpeechRecognition

1.項(xiàng)目前言

最近在做一個(gè)鬼畜視頻的時(shí)候,需要處理大量語(yǔ)音文件,全部都是 wav 格式的,然后我想把這些語(yǔ)音轉(zhuǎn)成文字,不過這些語(yǔ)音有幾千條,這時(shí)候我就想能不能用 Java 實(shí)現(xiàn)。
不過現(xiàn)在主流的語(yǔ)音識(shí)別像百度。訊飛好像都不支持 Java 離線版,在查找一些資料后,我準(zhǔn)備使用 Vosk

2.Vosk介紹

Vosk 官網(wǎng):https://alphacephei.com/vosk/
Vosk 是言語(yǔ)識(shí)別工具包,Vosk 最大的優(yōu)點(diǎn)是:

  1. 支持二十+種語(yǔ)言 - 中文,英語(yǔ),印度英語(yǔ),德語(yǔ),法語(yǔ),西班牙語(yǔ),葡萄牙語(yǔ),俄語(yǔ),土耳其語(yǔ),越南語(yǔ),意大利語(yǔ),荷蘭人,加泰羅尼亞語(yǔ),阿拉伯, 希臘語(yǔ), 波斯語(yǔ), 菲律賓語(yǔ),烏克蘭語(yǔ), 哈薩克語(yǔ), 瑞典語(yǔ), 日語(yǔ), 世界語(yǔ), 印地語(yǔ), 捷克語(yǔ), 波蘭語(yǔ)
  2. 移動(dòng)設(shè)備上脫機(jī)工作-Raspberry Pi,Android,iOS
  3. 使用簡(jiǎn)單的 pip3 install vosk 安裝
  4. 每種語(yǔ)言的手提式模型只有是 50Mb, 但還有更大的服務(wù)器模型可用
  5. 提供流媒體 API,以提供最佳用戶體驗(yàn)(與流行的語(yǔ)音識(shí)別 python 包不同)
  6. 還有用于不同編程語(yǔ)言的包裝器-java / csharp / javascript等
  7. 可以快速重新配置詞匯以實(shí)現(xiàn)最佳準(zhǔn)確性
  8. 支持說話人識(shí)別

至于選擇 Vosk 的原因,我想大概因?yàn)樗麄兪?Apache-2.0 開源項(xiàng)目吧,而且他們還提供了中文模型,這省了很多事不是么

3.項(xiàng)目開發(fā)

3.1 項(xiàng)目準(zhǔn)備

這里的項(xiàng)目準(zhǔn)備只做一個(gè) wav 語(yǔ)音識(shí)別,能夠供自己使用就行了
首先,我們需要新建一個(gè) Maven Java 項(xiàng)目,然后導(dǎo)入相關(guān)的依賴

<!-- 獲取音頻信息 -->
<dependency>
    <groupId>org</groupId>
    <artifactId>jaudiotagger</artifactId>
    <version>2.0.3</version>
</dependency>

<!-- 語(yǔ)音識(shí)別 -->
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.7.0</version>
</dependency>
<dependency>
    <groupId>com.alphacephei</groupId>
    <artifactId>vosk</artifactId>
    <version>0.3.32</version>
</dependency>

這里除了 vosk 相關(guān)依賴,我還導(dǎo)入了 jaudiotagger 這個(gè)獲取音頻信息的依賴,因?yàn)榈葧?huì)我們需要自動(dòng)獲取音頻的采樣率(SampleRate),有興趣的小伙伴可以看一下我另一篇文章:Java獲取Wav文件的采樣率SampleRate

那么為什么我需要獲取音頻的采樣率呢?這里我們看下 Vosk 官方給的示例代碼:
https://github.com/alphacep/vosk-api/blob/master/java/demo/src/main/java/org/vosk/demo/DecoderDemo.java

package org.vosk.demo;

import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;

import org.vosk.LogLevel;
import org.vosk.Recognizer;
import org.vosk.LibVosk;
import org.vosk.Model;

public class DecoderDemo {

    public static void main(String[] argv) throws IOException, UnsupportedAudioFileException {
        LibVosk.setLogLevel(LogLevel.DEBUG);

        try (Model model = new Model("model");
                    InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("../../python/example/test.wav")));
                    Recognizer recognizer = new Recognizer(model, 16000)) {

            int nbytes;
            byte[] b = new byte[4096];
            while ((nbytes = ais.read(b)) >= 0) {
                if (recognizer.acceptWaveForm(b, nbytes)) {
                    System.out.println(recognizer.getResult());
                } else {
                    System.out.println(recognizer.getPartialResult());
                }
            }

            System.out.println(recognizer.getFinalResult());
        }
    }
}

這個(gè)示例代碼里有兩個(gè)重要點(diǎn):

  1. model:也就是 new Model(“model”) 這里,這里需要我們指定模型位置
  2. sampleRate:也就是 new Recognizer(model, 16000) 這里,他這里的示例代碼寫死了 sampleRate 為 16000 Hz,不過每個(gè)音頻的采樣率不可能都一樣,我需要識(shí)別的音頻采樣率基本都是 44100 Hz,所以這里我們需要將他改為自動(dòng)識(shí)別

3.2 model 準(zhǔn)備

我們需要實(shí)現(xiàn)離線語(yǔ)音識(shí)別,那么就得將模型下載到本地電腦。下載地址為官網(wǎng)的 Models 模塊:https://alphacephei.com/vosk/models
我們直接找到 Chinese 分類,這里有 2 個(gè)模型,上面較小的 40 多M的是輕量級(jí)模型,適用于手機(jī)等移動(dòng)設(shè)備;下面 1 個(gè)多G的適用于服務(wù)器的,很明顯模型越大識(shí)別語(yǔ)音正確率越高
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字
這里我們兩個(gè)都下載,等會(huì)對(duì)比下正確率和速率,下載下來是兩個(gè)壓縮包,直接解壓到 D 盤,等會(huì)選擇路徑方便(怎么方便怎么來)。
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字
解壓之后如下
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

3.3 測(cè)試音頻準(zhǔn)備

音頻下載地址:https://download.csdn.net/download/qq_35132089/86723883
測(cè)試音頻已經(jīng)上傳到 CSDN 的資源庫(kù),設(shè)置下載積分為0,有興趣的小伙伴可以下載測(cè)試玩玩
這里一共準(zhǔn)備了 8 段音頻,共 62 個(gè)字

01.wav: 保家衛(wèi)國(guó)
02.wav: 這個(gè)世界需要希望
03.wav: 我們的勇氣絕對(duì)不能動(dòng)搖
04.wav: 德瑪西亞
05.wav: 正義要靠法律要么靠武力
06.wav: 為了那些不能作戰(zhàn)的人而戰(zhàn)
07.wav: 勇往直前
08.wav: 生命不息戰(zhàn)斗不止

3.4 代碼實(shí)現(xiàn)

捋清楚思路,接下來實(shí)現(xiàn)就比較簡(jiǎn)單了,我這里寫一個(gè) Swing 的項(xiàng)目,準(zhǔn)備到時(shí)候選擇 wav 文件直接語(yǔ)音識(shí)別,或者選擇一個(gè)文件夾,解析該目錄下所有的 wav 音頻文件
關(guān)鍵代碼:

import com.lijinjiang.beautyeye.ch3_button.BEButtonUI;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.wav.WavFileReader;
import org.vosk.Model;
import org.vosk.Recognizer;
import javax.sound.sampled.AudioSystem;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;
import java.awt.*;
import java.io.*;

public class MainFrame {
    private JFrame mainFrame; // 主界面
    private final JPanel contentPanel = new JPanel(null); // 內(nèi)容面板
    private String modelPath; // 模型位置
    private File chooseFile; // 選擇的文件夾或文件
    private JTextField pathField; // 模型位置文本框
    private JTextField fileField; // 文件路徑文本框
    private JTextArea displayArea; // 展示區(qū)域

    private JLabel timeLabel; // 顯示耗時(shí)標(biāo)簽

    public MainFrame() {
        modelPath = System.getProperty("user.dir") + "/src/main/resources/vosk-model-small-cn-0.22"; // 初始化模型
        System.out.println(modelPath);
        createFrame();
    }

    /**
     * 創(chuàng)建主窗口
     */
    private void createFrame() {
        mainFrame = new JFrame();
        mainFrame.setTitle("語(yǔ)音識(shí)別");
        createOperatePanel();
        createDisplayPane();
        createTimeLabel();
        mainFrame.add(contentPanel);
        mainFrame.setSize(new Dimension(800, 600));
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
    }

    /**
     * 創(chuàng)建操作面板
     */
    private void createOperatePanel() {
        JButton pathBtn = new JButton("選擇模型");
        pathBtn.setLocation(10, 10);
        pathBtn.setSize(new Dimension(80, 36));
        pathBtn.setFocusable(false); // 不繪制焦點(diǎn)
        pathBtn.addActionListener(e -> showChoosePathDialog());


        pathField = new JTextField();
        pathField.setEditable(false);
        pathField.setLocation(100, 10);
        pathField.setSize(new Dimension(250, 36));


        JButton fileBtn = new JButton("選擇文件");
        fileBtn.setFocusable(false); // 不繪制焦點(diǎn)
        fileBtn.addActionListener(e -> showChooseFileDialog());
        fileBtn.setLocation(360, 10);
        fileBtn.setSize(new Dimension(80, 36));


        fileField = new JTextField();
        fileField.setEditable(false);
        fileField.setLocation(450, 10);
        fileField.setSize(new Dimension(250, 36));

        // 開始執(zhí)行按鈕
        JButton startBtn = new JButton("執(zhí)行");
        startBtn.addActionListener(e -> execute());
        startBtn.setUI(new BEButtonUI().setNormalColor(BEButtonUI.NormalColor.green));
        startBtn.setFocusable(false); // 不繪制焦點(diǎn)
        startBtn.setLocation(710, 10);
        startBtn.setSize(new Dimension(70, 36));


        contentPanel.add(pathBtn);
        contentPanel.add(pathField);
        contentPanel.add(fileBtn);
        contentPanel.add(fileField);
        contentPanel.add(startBtn);
    }

    /**
     * 創(chuàng)建展示面板
     */
    private void createDisplayPane() {
        JScrollPane scrollPane = new JScrollPane();
        displayArea = new JTextArea();
        scrollPane.setViewportView(displayArea);
        displayArea.setEditable(false);
        displayArea.setBorder(null);
        scrollPane.setSize(new Dimension(775, 480));
        scrollPane.setLocation(8, 56);
        contentPanel.add(scrollPane);
    }

    private void createTimeLabel() {
        timeLabel = new JLabel();
        timeLabel.setHorizontalAlignment(SwingConstants.RIGHT); // 文本靠右對(duì)齊
        timeLabel.setSize(new Dimension(100, 36));
        timeLabel.setLocation(680, 530);
        contentPanel.add(timeLabel);
    }

    /**
     * 選擇模型位置
     */
    private void showChoosePathDialog() {
        JFileChooser fileChooser = new JFileChooser(); // 初始化一個(gè)文件選擇器
        String pathValue = pathField.getText().trim();
        if (pathValue.length() == 0) {
            FileSystemView fsv = fileChooser.getFileSystemView(); // 獲取文件系統(tǒng)網(wǎng)關(guān)
            fileChooser.setCurrentDirectory(fsv.getHomeDirectory()); // 設(shè)置桌面為當(dāng)前文件路徑
        } else {
            // 設(shè)置上一次選擇路徑為當(dāng)前文件路徑
            File file = new File(pathValue);
            File parentFile = file.getParentFile();
            if (parentFile == null) {
                fileChooser.setCurrentDirectory(file);
            } else {
                fileChooser.setCurrentDirectory(parentFile);
            }
        }
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 可選文件夾和文件
        fileChooser.setMultiSelectionEnabled(false); // 設(shè)置可多選
        int result = fileChooser.showOpenDialog(mainFrame);
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            modelPath = file.getAbsolutePath();
            pathField.setText(modelPath); // 將選擇的文件路徑寫入到文本框
        }
    }

    /**
     * 選擇需要轉(zhuǎn)換成文字的文件夾或者文件
     * 文件夾:表示該目錄下一層所有 wav 都需要轉(zhuǎn)成文字
     * 文件:表示只需要將該文件轉(zhuǎn)換成文字即可
     */
    private void showChooseFileDialog() {
        JFileChooser fileChooser = new JFileChooser(); // 初始化一個(gè)文件選擇器
        String fileValue = fileField.getText().trim();
        if (fileValue.length() == 0) {
            FileSystemView fsv = fileChooser.getFileSystemView();
            fileChooser.setCurrentDirectory(fsv.getHomeDirectory()); // 設(shè)置桌面為當(dāng)前文件路徑
        } else {
            // 設(shè)置上一次選擇路徑為當(dāng)前文件路徑
            File file = new File(fileValue);
            File parentFile = file.getParentFile();
            if (parentFile == null) {
                fileChooser.setCurrentDirectory(file);
            } else {
                fileChooser.setCurrentDirectory(parentFile);
            }
        }
        fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 可選文件夾和文件
        fileChooser.setMultiSelectionEnabled(false); // 設(shè)置可多選
        fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter()); // 不顯示所有文件的下拉選
        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("wav", "wav"));
        int result = fileChooser.showOpenDialog(mainFrame);
        if (result == JFileChooser.APPROVE_OPTION) {
            chooseFile = fileChooser.getSelectedFile();
            fileField.setText(chooseFile.getAbsolutePath()); // 將選擇的文件路徑寫入到文本框
        }
    }

    /**
     * 開始執(zhí)行操作
     */
    private void execute() {
        displayArea.setText(""); // 執(zhí)行后清空顯示面板
        if (modelPath == null || 0 == modelPath.length()) {
            JOptionPane.showMessageDialog(mainFrame, "模型位置不能為空", "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);
            return;
        }
        if (chooseFile == null) {
            JOptionPane.showMessageDialog(mainFrame, "未選擇文件夾或者音頻文件", "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);
            return;
        }
        long startTime = System.currentTimeMillis();

        // 用于測(cè)試進(jìn)度條的線程
        Thread thread = new Thread() {

            public void run() {
                if (chooseFile.isDirectory()) { // 如果是文件夾,則遍歷里面每個(gè)文件
                    File[] files = chooseFile.listFiles(pathname -> pathname.getName().endsWith(".wav"));
                    if (files != null) {
                        for (File childFile : files) processFile(childFile);
                    }
                } else {
                    processFile(chooseFile);
                }

            }

        };
        //顯示進(jìn)度條測(cè)試對(duì)話框
        ProgressBar.show((Frame) null, thread, "語(yǔ)音正在識(shí)別中,請(qǐng)稍后...", "執(zhí)行結(jié)束", "取消");
        // 否則直接處理該文件
        long endTime = System.currentTimeMillis();
        String msg = "耗時(shí):" + (endTime - startTime) + "ms";
        timeLabel.setText(msg);
    }

    /**
     * 處理文件:語(yǔ)音轉(zhuǎn)文字
     */
    private void processFile(File file) {
        try (Model model = new Model(modelPath);//該段是模型地址
             InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(file))); //該段是要轉(zhuǎn)的語(yǔ)言文件,僅支持wav
             Recognizer recognizer = new Recognizer(model, getSampleRate(file))) { //該段中12000是語(yǔ)言頻率(Hz),需要大于8000,可以自行調(diào)整

            int bytes;
            byte[] b = new byte[4096];
            while ((bytes = ais.read(b)) >= 0) {
                recognizer.acceptWaveForm(b, bytes);
            }
            displayArea.append(file.getName() + " ");
            displayArea.append(recognizer.getFinalResult() + System.lineSeparator());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(mainFrame, e.getMessage(), "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }

    /**
     * 獲取音頻文件的采樣率
     */
    private Float getSampleRate(File file) throws Exception {
        WavFileReader fileReader = new WavFileReader();
        AudioFile audioFile = fileReader.read(file);
        String sampleRate = audioFile.getAudioHeader().getSampleRate();
        return Float.parseFloat(sampleRate);
    }
}

4.效果演示

4.1 界面效果

界面效果就是如下圖所示

  1. 點(diǎn)擊選擇模型,就可以指定模型文件夾路徑
  2. 點(diǎn)擊選擇文件,就可以指定需要識(shí)別的語(yǔ)音或文件夾
  3. 最后點(diǎn)擊執(zhí)行即可開始語(yǔ)音識(shí)別
  4. 識(shí)別成功,會(huì)將對(duì)應(yīng)音頻文件名和識(shí)別的文字寫在下面的文本域中
  5. 最后還會(huì)將使用時(shí)間顯示在界面右下角

【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

4.2 單個(gè)文件語(yǔ)音識(shí)別

4.2.1 輕量模型

這里選擇模型選擇輕量模型,文件只識(shí)別第一個(gè)文件
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

4.2.2 通用模型

這里模型替換為了通用模型,語(yǔ)音文件不變,然后執(zhí)行
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

4.2.3 兩者對(duì)比

單個(gè)文件語(yǔ)音識(shí)別 輕量模型 通用模型
正確率 100% 100%
消耗時(shí)間 2021 ms 21093 ms
這里我們可以發(fā)現(xiàn)同一個(gè)文件,輕量模型只用了 1/10 的時(shí)間就識(shí)別完成,且成功率均為 100%,不過這也存在這段語(yǔ)言比較簡(jiǎn)單的原因

4.3 多個(gè)語(yǔ)音文件識(shí)別

4.3.1 輕量模型

這里的模型還是選擇輕量模型,語(yǔ)音文件選擇整個(gè)語(yǔ)音文件夾
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

4.3.2 通用模型

這里模型替換為了通用模型,語(yǔ)音文件不變,然后執(zhí)行;因?yàn)檫@里耗費(fèi)時(shí)間太長(zhǎng)了,GIF 做了抽幀處理
【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字

4.3.3 兩者對(duì)比

多個(gè)文件語(yǔ)音識(shí)別 輕量模型 通用模型
正確率 71.43% 84.12%
消耗時(shí)間 14332 ms 176040 ms
這里我們可以發(fā)現(xiàn)同一個(gè)文件,輕量模型只用了 8% 的時(shí)間就識(shí)別完成,不過這里的正確率只有 71% 左右,通用模型的正確率卻有 84% 左右,當(dāng)然因?yàn)槠渲写嬖谝恍S忻~如德瑪西亞,兩次都沒有識(shí)別出來

5.項(xiàng)目總結(jié)

綜合比較下來我們基本可以得出結(jié)論:如果對(duì)正確率要求沒那么高的情況下,輕量模型完全符合我們的要求;而且通用模型的時(shí)間消耗確實(shí)太大了,可能需要一些方法來減少時(shí)間的消耗。文章來源地址http://www.zghlxwxcb.cn/news/detail-443058.html

到了這里,關(guān)于【項(xiàng)目管理】Java離線版語(yǔ)音識(shí)別-語(yǔ)音轉(zhuǎn)文字的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java版工程項(xiàng)目管理系統(tǒng)源碼+系統(tǒng)管理+系統(tǒng)設(shè)置+項(xiàng)目管理+合同管理+二次開發(fā)em

    java版工程項(xiàng)目管理系統(tǒng)源碼+系統(tǒng)管理+系統(tǒng)設(shè)置+項(xiàng)目管理+合同管理+二次開發(fā)em

    ?? ?鴻鵠工程項(xiàng)目管理系統(tǒng) Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分離構(gòu)建工程項(xiàng)目管理系統(tǒng) 1. 項(xiàng)目背景 一、隨著公司的快速發(fā)展,企業(yè)人員和經(jīng)營(yíng)規(guī)模不斷壯大。為了提高工程管理效率、減輕勞動(dòng)強(qiáng)度、提高信息處理速度和準(zhǔn)確性,公司對(duì)內(nèi)部工程管理的提升提出了

    2024年02月13日
    瀏覽(30)
  • 企業(yè)工程項(xiàng)目管理系統(tǒng)源碼-專注項(xiàng)目數(shù)字化管理-Java工程管理-二次開發(fā)

    企業(yè)工程項(xiàng)目管理系統(tǒng)源碼-專注項(xiàng)目數(shù)字化管理-Java工程管理-二次開發(fā)

    ????工程項(xiàng)目各模塊及其功能點(diǎn)清單 一、系統(tǒng)管理 ? ? 1、數(shù)據(jù)字典:實(shí)現(xiàn)對(duì)數(shù)據(jù)字典標(biāo)簽的增刪改查操作 ? ? 2、編碼管理:實(shí)現(xiàn)對(duì)系統(tǒng)編碼的增刪改查操作 ? ? 3、用戶管理:管理和查看用戶角色 ? ? 4、菜單管理:實(shí)現(xiàn)對(duì)系統(tǒng)菜單的增刪改查操作 ? ? 5、角色管理:管理

    2024年02月07日
    瀏覽(98)
  • Java版spring cloud 本工程項(xiàng)目管理系統(tǒng)源碼-全面的工程項(xiàng)目管理

    Java版spring cloud 本工程項(xiàng)目管理系統(tǒng)源碼-全面的工程項(xiàng)目管理

    ????工程項(xiàng)目各模塊及其功能點(diǎn)清單 一、系統(tǒng)管理 ????1、數(shù)據(jù)字典:實(shí)現(xiàn)對(duì)數(shù)據(jù)字典標(biāo)簽的增刪改查操作 ????2、編碼管理:實(shí)現(xiàn)對(duì)系統(tǒng)編碼的增刪改查操作 ????3、用戶管理:管理和查看用戶角色 ????4、菜單管理:實(shí)現(xiàn)對(duì)系統(tǒng)菜單的增刪改查操作 ????5、角色管

    2024年02月15日
    瀏覽(27)
  • JAVA項(xiàng)目--銀行管理系統(tǒng)

    JAVA項(xiàng)目--銀行管理系統(tǒng)

    1、項(xiàng)目描述 銀行管理系統(tǒng):實(shí)現(xiàn)登錄、注冊(cè),登錄后的用戶可以進(jìn)行存款、取款、轉(zhuǎn)賬、查詢余額操作 2、分析 創(chuàng)建銀行類Bank:用于存儲(chǔ)銀行卡信息,并創(chuàng)建銀行系統(tǒng)的主窗體 創(chuàng)建銀行卡類BankCard:初始化銀行卡信息 創(chuàng)建用戶操作類User:進(jìn)行存款、取款、轉(zhuǎn)賬、查詢余額

    2024年02月11日
    瀏覽(22)
  • 【Java】學(xué)生管理系統(tǒng)項(xiàng)目演示

    目錄 學(xué)生管理系統(tǒng) 學(xué)生管理系統(tǒng)代碼思路分析 nextLine()?和 nextInt() 區(qū)別 需求:實(shí)現(xiàn)對(duì)學(xué)生的增刪改查功能,學(xué)生(學(xué)號(hào),姓名,年齡,地址)字段 定義學(xué)生 Student 實(shí)體類 成員屬性 (學(xué)號(hào),姓名,年齡,地址); 定義容器(ArrayList) 集合存入對(duì)象; 定義StudentManage 對(duì) Stu

    2024年02月07日
    瀏覽(17)
  • Java版本的工程項(xiàng)目管理系統(tǒng)源代碼之工程項(xiàng)目管理系統(tǒng)面臨的挑戰(zhàn)

    Java版本的工程項(xiàng)目管理系統(tǒng)源代碼之工程項(xiàng)目管理系統(tǒng)面臨的挑戰(zhàn)

    ? ?工程項(xiàng)目管理系統(tǒng)是指從事工程項(xiàng)目管理的企業(yè)(以下簡(jiǎn)稱工程項(xiàng)目管理企業(yè))受業(yè)主委托,按照合同約定,代表業(yè)主對(duì)工程項(xiàng)目的組織實(shí)施進(jìn)行全過程或若干階段的管理和服務(wù)。 ?系統(tǒng)定義 工程項(xiàng)目管理企業(yè)不直接與該工程項(xiàng)目的總承包企業(yè)或勘察、設(shè)計(jì)、供貨、施

    2024年02月03日
    瀏覽(24)
  • 23基于java教師科研項(xiàng)目管理系統(tǒng)

    23基于java教師科研項(xiàng)目管理系統(tǒng)

    目前許多人仍將傳統(tǒng)的紙質(zhì)工具作為信息管理的主要工具,而網(wǎng)絡(luò)技術(shù)的應(yīng)用只是起到輔助作用。在對(duì)網(wǎng)絡(luò)工具的認(rèn)知程度上,較為傳統(tǒng)的office軟件等仍是人們使用的主要工具,而相對(duì)全面且專業(yè)的信息管理軟件仍沒有得到大多數(shù)人的了解或認(rèn)可。本選題則旨在通過標(biāo)簽分類

    2024年02月02日
    瀏覽(92)
  • 【功能超全】基于OpenCV車牌識(shí)別停車場(chǎng)管理系統(tǒng)軟件開發(fā)【含python源碼+PyqtUI界面+功能詳解】-車牌識(shí)別python 深度學(xué)習(xí)實(shí)戰(zhàn)項(xiàng)目

    【功能超全】基于OpenCV車牌識(shí)別停車場(chǎng)管理系統(tǒng)軟件開發(fā)【含python源碼+PyqtUI界面+功能詳解】-車牌識(shí)別python 深度學(xué)習(xí)實(shí)戰(zhàn)項(xiàng)目

    摘要: 車牌識(shí)別系統(tǒng)(Vehicle License Plate Recognition,VLPR) 是指能夠檢測(cè)到受監(jiān)控路面的車輛并自動(dòng)提取車輛牌照信息(含漢字字符、英文字母、阿拉伯?dāng)?shù)字及號(hào)牌顏色)進(jìn)行處理的技術(shù)。車牌識(shí)別是現(xiàn)代智能交通系統(tǒng)中的重要組成部分之一,應(yīng)用十分廣泛。本文詳細(xì)介紹了 車牌

    2024年02月09日
    瀏覽(27)
  • Java版本工程管理系統(tǒng)源碼&企業(yè)工程項(xiàng)目管理系統(tǒng)簡(jiǎn)介

    Java版本工程管理系統(tǒng)源碼&企業(yè)工程項(xiàng)目管理系統(tǒng)簡(jiǎn)介

    ???? ?一、立項(xiàng)管理 1、招標(biāo)立項(xiàng)申請(qǐng) 功能點(diǎn):招標(biāo)類項(xiàng)目立項(xiàng)申請(qǐng)入口,用戶可以保存為草稿,提交。 2、非招標(biāo)立項(xiàng)申請(qǐng) 功能點(diǎn):非招標(biāo)立項(xiàng)申請(qǐng)入口、用戶可以保存為草稿、提交。 3、采購(gòu)立項(xiàng)列表 功能點(diǎn):對(duì)草稿進(jìn)行編輯,駁回的立項(xiàng)編輯,在途流程查看。 二、項(xiàng)

    2024年02月15日
    瀏覽(27)
  • 基于java的項(xiàng)目管理平臺(tái)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    基于java的項(xiàng)目管理平臺(tái)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 研究背景: 隨著企業(yè)業(yè)務(wù)的不斷擴(kuò)張和復(fù)雜化,項(xiàng)目管理工作成為了企業(yè)運(yùn)營(yíng)過程中不可或缺的一部分。傳統(tǒng)的項(xiàng)目管理方式通常依賴于手工管理和紙質(zhì)文檔,存在著信息傳遞不及時(shí)、項(xiàng)目管理效率低下、資源利用率不高等問題。為了

    2024年02月02日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包