Recherche avancée

Médias (91)

Autres articles (70)

  • Websites made ​​with MediaSPIP

    2 mai 2011, par

    This page lists some websites based on MediaSPIP.

  • Creating farms of unique websites

    13 avril 2011, par

    MediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
    This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

Sur d’autres sites (11116)

  • pyqt5 gui dependent on ffmpeg compiled with pyinstaller doesn't run on other machines ?

    19 octobre 2022, par Soren

    I am trying to create a simple Pyqt5 GUI for Windows 10 that uses OpenAI's model Whisper to transcribe a sound file and outputting the results in an Excel-file. It works on my own computer where I have installed the necessary dependencies for Whisper as stated on their github i.e. FFMEG. I provide a minimal example of my code below :

    


    # Import library
import whisper
import os
from PyQt5 import QtCore, QtGui, QtWidgets
import pandas as pd
import xlsxwriter


class Ui_Dialog(QtWidgets.QDialog):
    
    
    # Define functions to use in GUI
   
    # Define function for selecting input files
    def browsefiles(self, Dialog):
      
       
       # Make Dialog box and save files into tuple of paths
       files = QtWidgets.QFileDialog().getOpenFileNames(self, "Select soundfiles", os.getcwd(), "lyd(*mp2 *.mp3 *.mp4 *.m4a *wma *wav)")
       
       self.liste = []
       for url in range(len(files[0])):
           self.liste.append(files[0][url])   

    
    def model_load(self, Dialog):
               
        # Load picked model
        self.model = whisper.load_model(r'C:\Users\Søren\Downloads\Whisper_gui\models' + "\\" + self.combo_modelSize.currentText() + ".pt") ##the path is set to where the models are on the other machine
        
    
    def run(self, Dialog):
                
        # Make list for sound files
        liste_df = []
        
        
        # Running loop for interpreting and encoding sound files
        for url in range(len(self.liste)):
                          
            # Make dataframe
            df = pd.DataFrame(columns=["filename", "start", "end", "text"])
            
            # Run model
            result = self.model.transcribe(self.liste[url])
                            
            # Extract results
            for i in range(len(result["segments"])):
                start = result["segments"][i]["start"]
                end = result["segments"][i]["end"]
                text = result["segments"][i]["text"]
                
                df = df.append({"filename": self.liste[url].split("/")[-1],
                            "start": start, 
                            "end": end, 
                            "text": text}, ignore_index=True)
            
            # Add detected language to dataframe
            df["sprog"] = result["language"]
            
            
            liste_df.append(df)
        
        
        
        # Make excel output
        
        # Concatenate list of dfs
        dataframe = pd.concat(liste_df)
        
        
        # Create a Pandas Excel writer using XlsxWriter as the engine.
        writer = pd.ExcelWriter(self.liste[0].split(".")[0] + '_OUTPUT.xlsx', engine='xlsxwriter')
        writer_wrap_format = writer.book.add_format({"text_wrap": True, 'num_format': '@'})


        # Write the dataframe data to XlsxWriter. Turn off the default header and
        # index and skip one row to allow us to insert a user defined header.
        dataframe.to_excel(writer, sheet_name="Output", startrow=1, header=False, index=False)

        # Get the xlsxwriter workbook and worksheet objects.
        #workbook = writer.book
        worksheet = writer.sheets["Output"]

        # Get the dimensions of the dataframe.
        (max_row, max_col) = dataframe.shape

        # Create a list of column headers, to use in add_table().
        column_settings = [{'header': column} for column in dataframe.columns]

        # Add the Excel table structure. Pandas will add the data.
        worksheet.add_table(0, 0, max_row, max_col - 1, {'columns': column_settings})

        # Make the columns wider for clarity.
        worksheet.set_column(0, max_col - 1, 12)
        
        in_col_no = xlsxwriter.utility.xl_col_to_name(dataframe.columns.get_loc("text"))
        
        worksheet.set_column(in_col_no + ":" + in_col_no, 30, writer_wrap_format)

        # Close the Pandas Excel writer and output the Excel file.
        writer.save()
        writer.close()
    
    
    ## Design setup
    
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(730, 400)
        
        self.select_files = QtWidgets.QPushButton(Dialog)
        self.select_files.setGeometry(QtCore.QRect(40, 62, 81, 31))
        font = QtGui.QFont()
        font.setPointSize(6)
        self.select_files.setFont(font)
        self.select_files.setObjectName("select_files")
        
    
               
        
        self.combo_modelSize = QtWidgets.QComboBox(Dialog)
        self.combo_modelSize.setGeometry(QtCore.QRect(40, 131, 100, 21))
        font = QtGui.QFont()
        font.setPointSize(6)
        self.combo_modelSize.setFont(font)
        self.combo_modelSize.setObjectName("combo_modelSize")
               
        
        self.runButton = QtWidgets.QPushButton(Dialog)
        self.runButton.setGeometry(QtCore.QRect(40, 289, 71, 21))
        font = QtGui.QFont()
        font.setPointSize(6)
        self.runButton.setFont(font)
        self.runButton.setObjectName("runButton")
        
        
       

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        
        
        
        modelSize_options = ['Chose model', 'tiny', 'base', 'small', 'medium', 'large']
        self.combo_modelSize.addItems(modelSize_options)
        
        # Do an action!
        self.select_files.clicked.connect(self.browsefiles)
        self.combo_modelSize.currentIndexChanged.connect(self.model_load)
        self.runButton.clicked.connect(self.run)
        
        
        
    

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.runButton.setText(_translate("Dialog", "Go!"))
        self.select_files.setText(_translate("Dialog", "Select"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())


    


    I compile this app with pyinstaller using the following code. I had some issues to begin with so I found other with similar problems and ended up with this :

    


    pyinstaller --onedir --hidden-import=pytorch --collect-data torch --copy-metadata torch --copy-metadata tqdm --copy-metadata tokenizers --copy-metadata importlib_metadata --hidden-import="sklearn.utils._cython_blas" --hidden-import="sklearn.neighbors.typedefs" --hidden-import="sklearn.neighbors.quad_tree" --hidden-import="sklearn.tree" --hidden-import="sklearn.tree._utils" --copy-metadata regex --copy-metadata requests --copy-metadata packaging --copy-metadata filelock --copy-metadata numpy --add-data "./ffmpeg/*;./ffmpeg/" --hidden-import=whisper --copy-metadata whisper --collect-data whisper minimal_example_whisper.py

    


    When I take the outputtet dist directory and try to run the app on another Windows machine without FFMPEG installed (or Whisper or any other things), I get the following error from the terminal as I push the "run" button in the app (otherwise the app does run).

    


    C:\Users\Søren>"G:\minimal_example_whisper\minimal_example_whisper.exe"
whisper\transcribe.py:70: UserWarning: FP16 is not supported on CPU; using FP32 instead
Traceback (most recent call last):
  File "minimal_example_whisper.py", line 45, in run
  File "whisper\transcribe.py", line 76, in transcribe
  File "whisper\audio.py", line 111, in log_mel_spectrogram
  File "whisper\audio.py", line 42, in load_audio
  File "ffmpeg\_run.py", line 313, in run
  File "ffmpeg\_run.py", line 284, in run_async
  File "subprocess.py", line 951, in __init__
  File "subprocess.py", line 1420, in _execute_child
FileNotFoundError: [WinError 2] Den angivne fil blev ikke fundet


    


    I suspect this has something to do with FFMPEG not being installed on the other machines system ? Does anyone have an automatic solution for this when compiling the app or can it simply only run on machines that has FFMPEG installed ?

    


    Thanks in advance !

    


  • Trying to redirect binary stdout of ffmpeg to NeroAacEnc stdin

    2 mai 2017, par Ben

    I am trying to write a program in C# 2010 that converts mp3 files to an audio book in m4a format via ffmpeg.exe and NeroAACenc.exe.
    For doing so I redirect stdout of ffmpeg to stdin of the Nero encoder within my application using the build in Diagnostics.Process class.

    Everything seems to work as expected but for some reason StandardOutput.BaseStream
    of ffmpeg stops receiving data at some time. The process does not exit and the ErrorDataReceived event is also not getting raised.
    The produced output m4a file has always a length of 2 minutes. The same applies if I just encode the mp3 file to a temp wav file without feeding Nero.

    I tried the same via the command line and this works without any problem.

    ffmpeg -i test.mp3 -f wav - | neroAacEnc -ignorelength -if - -of test.m4a

    Can anyone please tell me what I am doing wrong here ?
    Thanks in advance.

    class Encoder
    {
       private byte[] ReadBuffer = new byte[4096];
       private Process ffMpegDecoder = new Process();
       private Process NeroEncoder = new Process();
       private BinaryWriter NeroInput;

       //Create WAV temp file for testing
       private Stream s = new FileStream("D:\\test\\test.wav", FileMode.Create);
       private BinaryWriter outfile;

       public void Encode()
       {
           ProcessStartInfo ffMpegPSI = new ProcessStartInfo("ffmpeg.exe", "-i D:\\test\\test.mp3 -f wav -");
           ffMpegPSI.UseShellExecute = false;
           ffMpegPSI.CreateNoWindow = true;
           ffMpegPSI.RedirectStandardOutput = true;
           ffMpegPSI.RedirectStandardError = true;
           ffMpegDecoder.StartInfo = ffMpegPSI;

           ProcessStartInfo NeroPSI = new ProcessStartInfo("neroAacEnc.exe", "-if - -ignorelength -of D:\\test\\test.m4a");
           NeroPSI.UseShellExecute = false;
           NeroPSI.CreateNoWindow = true;
           NeroPSI.RedirectStandardInput = true;
           NeroPSI.RedirectStandardError = true;
           NeroEncoder.StartInfo = NeroPSI;

           ffMpegDecoder.Exited += new EventHandler(ffMpegDecoder_Exited);
           ffMpegDecoder.ErrorDataReceived += new DataReceivedEventHandler(ffMpegDecoder_ErrorDataReceived);
           ffMpegDecoder.Start();

           NeroEncoder.Start();
           NeroInput = new BinaryWriter(NeroEncoder.StandardInput.BaseStream);

           outfile = new BinaryWriter(s);

           ffMpegDecoder.StandardOutput.BaseStream.BeginRead(ReadBuffer, 0, ReadBuffer.Length, new AsyncCallback(ReadCallBack), null);

       }

       private void ReadCallBack(IAsyncResult asyncResult)
       {
           int read = ffMpegDecoder.StandardOutput.BaseStream.EndRead(asyncResult);
           if (read > 0)
           {

               NeroInput.Write(ReadBuffer);
               NeroInput.Flush();

               outfile.Write(ReadBuffer);
               outfile.Flush();

               ffMpegDecoder.StandardOutput.BaseStream.Flush();

               ffMpegDecoder.StandardOutput.BaseStream.BeginRead(ReadBuffer, 0, ReadBuffer.Length, new AsyncCallback(ReadCallBack), null);
           }
           else
           {
               ffMpegDecoder.StandardOutput.BaseStream.Close();
               outfile.Close();
           }

       }

       private void ffMpegDecoder_Exited(object sender, System.EventArgs e)
       {
           Console.WriteLine("Exit");
       }

       private void ffMpegDecoder_ErrorDataReceived(object sender, DataReceivedEventArgs errLine)
       {
           Console.WriteLine("Error");
       }

    }
  • How to write unit tests for your plugin – Introducing the Piwik Platform

    17 novembre 2014, par Thomas Steur — Development

    This is the next post of our blog series where we introduce the capabilities of the Piwik platform (our previous post was How to verify user permissions). This time you’ll learn how to write unit tests in Piwik. For this tutorial you will need to have basic knowledge of PHP, PHPUnit and the Piwik platform.

    When is a test a unit test ?

    There are many different opinions on this and it can be sometimes hard to decide. At Piwik we consider a test as a unit test if only a single method or class is being tested and if a test does not have a dependency to the filesystem, web, config, database or to any other plugin.

    If a test is slow it can be an indicator that it is not a unit test. “Slow” is of course a bit vague. We will cover how to write other type of tests, such as integration tests, in one of our next blog posts.

    Getting started

    In this post, we assume that you have already installed Piwik 2.9.0 or later via git, set up your development environment and created a plugin. If not, visit the Piwik Developer Zone where you’ll find the tutorial Setting up Piwik and other Guides that help you to develop a plugin.

    Let’s create a unit test

    We start by using the Piwik Console to create a new unit test :

    ./console generate:test --testtype unit

    The command will ask you to enter the name of the plugin the created test should belong to. I will use the plugin name “Insights”. Next it will ask you for the name of the test. Here you usually enter the name of the class you want to test. I will use “Widgets” in this example. There should now be a file plugins/Insights/tests/Unit/WidgetsTest.php which contains already an example to get you started easily :

    1. /**
    2.  * @group Insights
    3.  * @group WidgetsTest
    4.  * @group Plugins
    5.  */
    6. class WidgetsTest extends \PHPUnit_Framework_TestCase
    7. {
    8.  
    9.     public function testSimpleAddition()
    10.     {
    11.         $this->assertEquals(2, 1+1);
    12.     }
    13.  
    14. }

    Télécharger

    We don’t want to cover how you should write your unit test. This is totally up to you. If you have no experience in writing unit tests yet, we recommend to read articles on the topic, or a book, or to watch videos or anything else that will help you learn best.

    Running a test

    To run a test we will use the command tests:run which allows you to execute a test suite, a specific file or a group of tests.

    To verify whether the created test works we will run it as follows :

    ./console tests:run WidgetsTest

    This will run all tests having the group WidgetsTest. As other tests can use the same group you might want to pass the path to your test file instead :

    ./console tests:run plugins/Insights/tests/Unit/Widgets.php

    If you want to run all tests within your plugin pass the name of your plugin as an argument :

    ./console tests:run insights

    Of course you can also define multiple arguments :

    ./console tests:run insights WidgetsTest

    This will execute all tests within the insights plugin having the group WidgetsTest. If you only want to run unit tests within your plugin you can do the following :

    ./console tests:run insights unit

    Advanced features

    Isn’t it easy to create a unit test ? We never even created a file ! You can accomplish even more if you want : You can generate other type of tests, you can run tests on Amazon’s AWS and more. Unfortunately, not everything is documented yet so we recommend to discover more features by executing the commands ./console list tests and ./console help tests:run.

    If you have any feedback regarding our APIs or our guides in the Developer Zone feel free to send it to us.