如何从PHP运行用于孤立口语词识别的MATLAB代码?

如何从PHP运行用于孤立口语词识别的MATLAB代码?,php,matlab,matlab-deployment,Php,Matlab,Matlab Deployment,正如标题所示,我有用于孤立口语词识别的MATLAB代码,出于某种目的,我希望能够将此项目与另一个使用PHP制作的项目集成 我以前从未处理过这样的问题。换句话说,这是我第一次需要集成PHP和MATLAB,所以我真的不知道从哪里开始,如何开始 我读过几篇文章,但我不能使它有效 我有PHP5.4.9、MatlabR2012A和Windows7。 可以看到MATLAB项目文件。一个快速的方法是将MATLAB代码编译成一个文件,然后使用PHP的shell\u exec() 困难的部分是调整您的MATLAB

正如标题所示,我有用于孤立口语词识别的MATLAB代码,出于某种目的,我希望能够将此项目与另一个使用PHP制作的项目集成

我以前从未处理过这样的问题。换句话说,这是我第一次需要集成PHP和MATLAB,所以我真的不知道从哪里开始,如何开始

我读过几篇文章,但我不能使它有效

我有PHP5.4.9、MatlabR2012A和Windows7。
可以看到MATLAB项目文件。

一个快速的方法是将MATLAB代码编译成一个文件,然后使用PHP的
shell\u exec()

困难的部分是调整您的MATLAB代码(对不起,我没有读过),使之:

  • 它将以命令行界面样式接收输入(如
    char
    strings)
  • 它将其结果作为文本输出到标准输出(MATLAB中的文件id#1)

  • 然后只需将MATLAB输出解析回PHP…

    就可以帮助OP从PHP网页运行系统命令,这是相关的(复制如下)

    我们一直都在这样做。我称之为巫毒页面。下面是一些工作代码:

    <?php
        $command="uptime"; $output; $retval; $errors="";
        exec ($command, &$output, &$retval);
        echo $output[0] . "\n";
        unset($output);
    ?>
    
    我在下面的评论中添加了补充说明:
    相对路径与绝对路径可能是一种痛苦
    $command
    可能需要是
    /usr/bin/uptime
    ,或者另一个可能是
    /usr/bin/ls/home/chris/ftp
    。通常,脚本的工作目录是它们在文件系统中的所在位置。MATLAB是一个windows程序,是吗?我的经验是,程序和作为参数传递的任何文件都需要绝对路径,例如:
    $command=“c:\\matlab\\matlab.exe c:\\www\\somefile.wav”
    ,然后愚蠢的NTFS名称需要单引号,TAB命令行完成对于示例来说效果很好。或者使用正确的8.3名称,并在名称中加上~。

    我的答案将分为两部分:

  • 如何从终端运行MATLAB脚本? 我将给出一些关于从终端运行MATLAB脚本的示例:

    matlab -nojvm -nodesktop -r "run <the-script>.m"
    matlab -nojvm -nodesktop -r "<the-script>"
    matlab -nojvm -nodesktop -r "run <the/path>/<the-script>.m"
    
  • 如何从PHP执行terminal命令? 我认为前面的答案很好,没有必要重复

  • 更多说明:

  • 注意你的安全。您可能很容易被
    XSS
    'ed
  • 抽象代码并对其进行改进,以将参数和输出保存到数据库。在中运行代码 或队列管理器。您可以创建一个服务
  • 单元测试
  • 使用Linux。它更强大

  • 您在这里有几个选项:

    • 如果MATLAB安装在部署PHP应用程序的服务器上(不是您当前的开发环境),您可以像其他任何程序一样直接调用它(
      MATLAB-r“…”
      ),使用PHP中与
      EXECUTE
      命令等效的任何命令。以下是一些资源(请确保也签出链接的问题):

      其他人对如何在PHP和MATLAB脚本之间传递输入/输出进行了评论。例如,您可以设计MATLAB函数以接收WAV文件的路径作为输入,对其进行处理并将生成的任何图像保存到磁盘:

      function myFunc(filename)
          [y,Fs] = audioread(filename);
          img = my_process_func(y, FS);
          imwrite(img, 'out.png');
      end
      
      它从PHP调用为:

      % Of course you have to make sure "myFunc" is available on the MATLAB path.
      % Think: "addpath(..)" or just "cd(..)" into the directory first
      matlab -wait -nodisplay -r "myFunc('audio.wav'); quit;"
      
      然后可以在PHP应用程序中读取输出图像

    • 如果没有,您有哪些与部署相关的工具箱?以及相关的工具箱,如和

      它们将分别将您的程序编译成可执行文件/.NET Assembly/JAR文件,并且所有这些文件都需要安装免费提供的。换句话说,可执行文件不需要在目标机器上安装完整的MATLAB,只需要在MCR运行时安装即可

      您将以与以前相同的方式运行可执行文件

      另一个产品是将MATLAB代码转换成C++程序的产品。编译后,它可以在没有任何外部要求的情况下运行

      MathWorks的一个新产品是。我个人对此一无所知:)

    • 另一种选择是使用TCP/IP在PHP和MATLAB之间进行通信。服务器将在MATLAB端运行,使用以CMEX文件或Java类编写的套接字编程。见:

      客户端是您的PHP应用程序。其思想是让MATLAB监听连接,读取客户端提供的任何输入,
      eval
      it,然后返回结果。这比其他选项更复杂,因为您必须处理序列化和其他事情,如并发性。优点是MATLAB可以在单独的服务器上运行,甚至可以在云上的多个服务器上运行(请参阅)

    所以,首先,决定哪种方法最适合您的项目,然后回答特定的问题会更容易。。。只要始终先查阅文档,MATLAB工具箱都有很好的文档,通常包含许多示例。以下是一些特定于MATLAB编译器产品系列的更多资源:


    注意,它们主要关注ASP.NET和JavaJSP/servlet应用程序。在您的情况下,PHP应用程序将与运行使用上述两个选项之一构建的web服务的中间层通信(或者简单地设计一个类似CGI的站点,运行前面解释的使用MATLAB编译器构建的普通可执行文件)。

    感谢您的回复,问题是输入是
    .wav
    格式,输出是图像和字符串。。。这是否有效?如果我尝试Matlab可执行文件的方式,我会将path+filename.wav作为参数传递给Matlab可执行文件,程序将输出2个字符串(例如,用新行分隔):一个是您需要的字符串,另一个是path+filename.png。还有一件事——这里是另一个Stackoverflow条目,处理将参数传递给Matlab可执行文件的问题:注意安全问题
    function myFunc(filename)
        [y,Fs] = audioread(filename);
        img = my_process_func(y, FS);
        imwrite(img, 'out.png');
    end
    
    % Of course you have to make sure "myFunc" is available on the MATLAB path.
    % Think: "addpath(..)" or just "cd(..)" into the directory first
    matlab -wait -nodisplay -r "myFunc('audio.wav'); quit;"