カテゴリー
PHP

PHP コーディング規約

コーディング規約ってやっぱりあった方がいいですよね。できるだけ多くの人が馴染みやすいのがいいですよね。

PHPのコーディングで参考になるものはと見つけたのが PEAR (PHP Extension and Application Repository) の標準コーディング規約です。

https://pear.php.net/manual/en/standards.php

PEAR ライブラリを使ってなくても、このような標準コーディングが公開されていることは大変参考になります。

カテゴリー
PHP VBA

ドメインが利用可能かチェックするPHPスクリプト

ドメイン名が利用可能かチェックするのに dns_get_record 関数を使います。
パラメータには url か domain.com のようなドメイン名
結果はテキストで OK か NG を返します。

<?php
$url = $_GET["url"];
$res = parse_url($url);
$name = "";

if (isset($res['host'])) {
    $name = $res['host'];
} else if (isset($res['path'])) {
    $name = $res['path'];
}

header('Content-type: plain/text');
if (!empty($name)) {
    $result = dns_get_record($name);
    if ($result === false || empty($result)) {
        echo 'NG';
    } else {
        echo 'OK';
    }
} else {
    echo 'ERR';
}
exit;
?>

このPHPスクリプトをエクセルVBAから呼び出す例:

'
' ドメインチェック WebAPI
'
'   URL: https://www.northwind.mydns.jp/samples/webservice/checkdomain.php
'   パラメータ: url
'   レスポンス:
'        OK: 利用可能
'        NG: 利用不可
'
' Ex.
'  IsDomainAvailable("northwind.mydns.jp")        = True
'
'
Function IsDomainAvailable(DomainUrl As String) As Boolean
    On Error GoTo ErrHandler

    Dim Request As Object
    Dim checkerUrl As String

    IsDomainAvailable = False
    checkerUrl = "https://www.northwind.mydns.jp/samples/webservice/checkdomain.php"

    Set Request = CreateObject("WinHttp.WinHttpRequest.5.1")

    With Request
      .Open "GET", checkerUrl & "?url=" & DomainUrl, False
      .send

        If .StatusText = "OK" And .ResponseText = "OK" Then
            IsDomainAvailable = True
        End If
    End With

    Set Request = Nothing
    
    Exit Function
ErrHandler:
    Debug.Print Err.Number & ": " & Err.Description
End Function

Sub Test()

    Debug.Print IsDomainAvailable("northwind.mydns.jp")

End Sub
カテゴリー
Linux PHP

CentOS7 をPHP7.0 インストール

CentOS7 の PHP を PHP7.0 にしてたら、結構ハマってしまった。

結局、思考錯誤の結果、一度全部 PHP を削除:
# yum remove php*

そして、PHP7.0 を REMI リポジトリからインストール:
# yum install –enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysqlnd php-intl php-pear

インストールされたパッケージ:
# rpm -qa | grep php
php-common-7.0.33-8.el7.remi.x86_64
php-xml-7.0.33-8.el7.remi.x86_64
php-7.0.33-8.el7.remi.x86_64
php-pear-1.10.9-2.el7.remi.noarch
php70-php-xml-7.0.33-8.el7.remi.x86_64
php70-php-pecl-mysql-1.0.0-0.9.20151007git294ce3b.el7.remi.x86_64
php-pdo-7.0.33-8.el7.remi.x86_64
php70-php-mysqlnd-7.0.33-8.el7.remi.x86_64
php-mysqlnd-7.0.33-8.el7.remi.x86_64
php-json-7.0.33-8.el7.remi.x86_64
php70-runtime-2.0-1.el7.remi.x86_64
php70-php-mbstring-7.0.33-8.el7.remi.x86_64
php-gd-7.0.33-8.el7.remi.x86_64
php70-php-gd-7.0.33-8.el7.remi.x86_64
php-cli-7.0.33-8.el7.remi.x86_64
php70-php-common-7.0.33-8.el7.remi.x86_64
php-fedora-autoloader-1.0.0-1.el7.remi.noarch
php70-php-json-7.0.33-8.el7.remi.x86_64
php70-php-pdo-7.0.33-8.el7.remi.x86_64
php-devel-7.0.33-8.el7.remi.x86_64
php-process-7.0.33-8.el7.remi.x86_64
php-mbstring-7.0.33-8.el7.remi.x86_64
php-intl-7.0.33-8.el7.remi.x86_64

カテゴリー
PHP Web

Microsoft Bing API Speech to Text で音声ファイルをテキスト化

音声ファイルをテキスト化する Microsoft Bing Speech to Text の試用をしてみました。STT にはクライアントライブラリとREST API が提供されています。お手軽な REST API の方を試してみます。シェルスクリプトのサンプルを元にPHPで書いてみました。

<?php
//
//  Microsoft Bing API Speech to Text
//

define("BING_TOKEN_URL", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken");
define("BING_BASE_URL", "https://speech.platform.bing.com/speech/recognition");
define("BING_SERVICE", "/cognitiveservices");
define("BING_VERSION", "/v1");
define("BING_SUBSCRIPTION_KEY", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

define("BING_LANG", "ja-JP");
define("BING_LOCALE", "ja-JP");
define("AUDIO_TYPE", "audio/wav");

/*
 * Recognition modes:
 * interactive: a user makes short requests and expects the application
 *              to perform an action in response.
 * conversation: users are engaged in a human-to-human conversation.
 *
 * dictation: users recite longer utterances to the application
 *            for further processing.
 */
define("RECOGNITION_MODE", "conversation");
/*
 * Output format:
 * simple: A simplified phrase result containing the recognition status 
 *         and the recognized text in display form.
 * detailed: A recognition status and N-best list of phrase results
 *           where each phrase result contains all four recognition forms
 *           and a confidence score.
 */
define("OUTPUT_FORMAT", "simple");


function Get_Token($url, $subscriptionKey) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-type: application/x-www-form-urlencoded",
        "Content-Length: 0",
        "Ocp-Apim-Subscription-Key: {$subscriptionKey}"
    ));
    $token = @curl_exec($ch);
    return $token;
}

function Speech_to_Text($url, $token, $audioFile, $audioType) {
    $size = filesize($audioFile);
    $data = file_get_contents($audioFile);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Transfer-Encoding: chunked",
        "Content-Type: {$audioType}; codec=\"audio/pcm\"; samplerate=16000",
        "Authorization: Bearer {$token}"
    ));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_INFILESIZE, $size);
    $res = @curl_exec($ch);
    return $res;
}

// Main

if (empty($argv[1])) {
	echo "Please, specify a file to transcribe.".PHP_EOL;
	exit;
}

$filename = trim($argv[1]);
if (!file_exists($filename)) {
	echo "The file specified doesn't exist.".PHP_EOL;
	exit;
}

$token = Get_Token(BING_TOKEN_URL, BING_SUBSCRIPTION_KEY);

if (!empty($token)) {
	$url = BING_BASE_URL."/".RECOGNITION_MODE;
	$url .= BING_SERVICE.BING_VERSION;
	$url .= "?language=".BING_LANG;
	$url .= "&locale=".BING_LOCALE;
	$url .= "&format=".OUTPUT_FORMAT;
	$url .= "&requestid=rest_sample_request_id";
	$res = Speech_to_Text($url, $token, $filename, AUDIO_TYPE);
	var_dump($res);
} else {
	echo "Failed to get token.".PHP_EOL;
}
?>

Bing Speech to Text REST API では 15秒以下という制限があるため、音声の始まりの部分しかテキスト化できませんが、ちゃんと日本語テキストとして出力してくれています。いくつか試してみました。

出力結果:

outbound_only.wav:「お電話ありがとうございます。発信専用ダイアルのためおつなぎすることが出来ません・・・」

# php sample.php outbound_only.wav 
string(125) "{"RecognitionStatus":"Success","DisplayText":"お電話ありがとうございます","Offset":19100000,"Duration":19100000}"
busy.wav: 「ただいま電話が大変混み合っております。・・・」

# php sample.php busy.wav 
string(141) "{"RecognitionStatus":"Success","DisplayText":"ただいま電話 ga 大変混み合っております","Offset":12500000,"Duration":34500000}"
outoofservice.wav: 「ただいまのお時間は受付を終了しております。・・・」

# php sample.php outofservice.wav 
string(146) "{"RecognitionStatus":"Success","DisplayText":"ただいまのお時間は受付を終了しております","Offset":16600000,"Duration":40700000}"
カテゴリー
PHP

PHP で複数ページのTIFFファイルをJPGに変換

ひとつのファイルに複数のページを格納したTIFFフォーマットの画像ファイルをそれぞれのページごとにJPGファイルとして保存する方法をPHPで実現します。

$path = "./src/foo.tif";
$dest = "./dst/";
$type = "jpg";

# ファイル名の取得
$extract = pathinfo($path);
$file = $extract['filename'];

# TIFF画像ファイルを読み込み
$images = new Imagick($path);

foreach($images as $i => $image) {
    $n = $i + 1;
    $image->writeImage("{$dest}{$file}_page{$n}.{$type}");
}
$images->clear(); 

例:

ソースファイル: foo.tif
出力ファイル: foo_page1.jpg  foo_page2.jpg foo_page3.jpg

以上です。