mfjt diary


2020-06-03(水)

Cubase LE 5 の再アクティベーション方法メモ

未だに G2.1Nu にバンドルされていた Cubase LE 5 を使っているが、Windows 再インストールのたびにアクティベーションの方法が分からなくなってしまうのでメモ。

順当にいけば、

  1. 最新版の eLicenser をインストールする
  2. eLicenser を起動して、Soft-eLicenser 番号を確認する
  3. My Steinberg にログインし、新しい Soft-eLicenser 番号でアクティベーションコードを再発行する
  4. 再発行されたアクティベーションコードを eLicenser に登録する

という手順で問題ないんだろうけど、Soft-eLicenser 番号が表示されずに手詰まりになる。

ということで、eLC Installation Helper というやつの出番になる。普通の eLicenser に上書きでインストールする必要があるのか否かいまいち分からんが多分どっちでも良いと思う。これで Soft-eLicenser 番号が表示されるようになるので、新しいアクティベーションコードを発行できる。eLicenser を管理者権限で起動する必要もなかった。


2020-05-10(日)

JAWS-UG 初心者支部&千葉支部 #26 新人さん歓迎!ハンズオン&LT(オンライン) を CLI でやってみる (ハンズオン 3' 編) #jawsug_bgnr

ハンズオン 1 編ハンズオン 2 編ハンズオン 3 編の続き。

2 つめの S3 バケットまではハンズオン 3 編を使い回しで。ただし、前回の分は削除してしまったので、改めて作成。

Lambda Function 作成

2 つめのバケットに PUT されたことをきっかけに動く Lambda Function を作成 (後述するけど、これでは動かなかった)。Python で書いたことがないので気持ち悪いところとかあるのかもしれないけれど、とりあえずは動けばいいや的な。

import json
import urllib.parse
import boto3

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')

    s3_obj = s3.get_object(Bucket=bucket, Key=key)
    s3_json = json.loads(s3_obj['Body'].read())

    translate = boto3.client('translate')
    input_text = s3_json['results']['transcripts']

    response = translate.translate_text(
        Text = input_text,
        SourceLanguageCode = 'en',
        TargetLanguageCode = 'ja'
    )

    output_text = response['TranslatedText']

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text
        })
    }
$ zip translate-function.zip translate-function.py
  adding: translate-function.py (deflated 51%)

$ aws lambda create-function \
    --function-name translate-function \
    --runtime python3.8 \
    --role "arn:aws:iam::760182048326:role/translate-function-role" \
    --handler translate-function.lambda_handler \
    --zip-file fileb://translate-function.zip
{
    "FunctionName": "translate-function",
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function",
    "Runtime": "python3.8",
    "Role": "arn:aws:iam::760182048326:role/translate-function-role",
    "Handler": "translate-function.lambda_handler",
    "CodeSize": 573,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2020-05-10T10:06:48.639+0000",
    "CodeSha256": "cMOe2mMvBRbkGApMIgK/7vYPdRj60c40C0i1O4MITvI=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "b0813324-c726-481f-b2d3-5a0137e5443b",
    "State": "Active",
    "LastUpdateStatus": "Successful"
}

2 つ目の S3 バケットへのイベント作成

Lambda Function への権限設定
$ aws lambda add-permission \
    --function-name translate-function \
    --statement-id s3-put-event \
    --action lambda:InvokeFunction \
    --principal s3.amazonaws.com \
    --source-arn arn:aws:s3:::20200510-transcribe-output-mfjt
{
    "Statement": "{\"Sid\":\"s3-put-event\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::20200510-transcribe-output-mfjt\"}}}"
}
S3 へのイベント追加
$ aws s3api put-bucket-notification-configuration \
    --bucket 20200510-transcribe-output-mfjt \
    --notification-configuration '{"LambdaFunctionConfigurations": [{"LambdaFunctionArn": "arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function", "Events": ["s3:ObjectCreated:Put"]}]}'

$ aws s3api get-bucket-notification-configuration --bucket 20200510-transcribe-input-mfjt
{
    "LambdaFunctionConfigurations": [
        {
            "Id": "NWRjZTc3NTgtZWE1Ny00NGFlLTliNTctN2I0ZTEwYWI3MjE4",
            "LambdaFunctionArn": "arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function",
            "Events": [
                "s3:ObjectCreated:Put"
            ]
        }
    ]
}

動作確認

どこで確認すればいいのか分からなかったけれど、CloudWatch Logs で確認できるようだったので今回はそこで。このあたりから CLI 縛りがきつくなってきたので、普通にマネジメントコンソール経由で操作していた。

[ERROR] TypeError: list indices must be integers or slices, not str
Traceback (most recent call last):
  File "/var/task/translate-function.py", line 15, in lambda_handler
    input_text = s3_json['results']['transcripts']

JSON の配列の参照の仕方が間違っていたので Lambda Function を修正。ついでに翻訳結果のレスポンスも CloudWatch Logs で確認できるように修正*1

import json
import urllib.parse
import boto3

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')

    s3_obj = s3.get_object(Bucket=bucket, Key=key)
    s3_json = json.loads(s3_obj['Body'].read())

    translate = boto3.client('translate')
    input_text = s3_json['results']['transcripts'][0]['transcript']

    response = translate.translate_text(
        Text = input_text,
        SourceLanguageCode = 'en',
        TargetLanguageCode = 'ja'
    )

    output_text = response['TranslatedText']

    print(output_text)

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text
        })
    }

再度 MP3 ファイルを PUT したら、CloudWatch Logs にこんにちは。外国語を話しますか?1つの言語では決して十分ではありません。と出力されたので上手く動いたことが確認できた。

Lambda Function 単体での動作確認は、イベントテンプレートの s3-put を流用して以下のようなテストイベントを作成すれば実行できた。

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "ap-northeast-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "20200510-transcribe-output-mfjt",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::20200510-transcribe-output-mfjt"
        },
        "object": {
          "key": "20200510100920_Transcription.json"
        }
      }
    }
  ]
}

サーバレスでやっていると、クラウド活用している感がより高まって楽しくなってくる。

*1 というか、ここまでの構成では確認する術がなかった


2020-05-05(火)

JAWS-UG 初心者支部&千葉支部 #26 新人さん歓迎!ハンズオン&LT(オンライン) を CLI でやってみる (ハンズオン 3 編) #jawsug_bgnr

ハンズオン 1 編ハンズオン 2 編の続き。

S3 バケット作成

$ aws s3 mb s3://20200505-transcribe-input-mfjt
make_bucket: 20200505-transcribe-input-mfjt

$ aws s3 mb s3://20200505-transcribe-output-mfjt
make_bucket: 20200505-transcribe-output-mfjt

Lambda Function 作成

OutpuBucketName は自分のバケット名に変更しておく。

import json
import urllib.parse
import boto3
import datetime

s3 = boto3.client('s3')
transcribe = boto3.client('transcribe')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    try:
        transcribe.start_transcription_job(
            TranscriptionJobName= datetime.datetime.now().strftime("%Y%m%d%H%M%S") + '_Transcription',
            LanguageCode='en-US',
            Media={
                'MediaFileUri': 's3://' + bucket + '/' + key
            },
            OutputBucketName='20200505-transcribe-output-mfjt'
        )
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

ロールは相変わらず流用で。

$ zip transcribe-function.zip transcribe-function.py
  adding: transcribe-function.py (deflated 48%)

$ aws lambda create-function \
    --function-name transcribe-function \
    --runtime python3.8 \
    --role "arn:aws:iam::760182048326:role/translate-function-role" \
    --handler transcribe-function.lambda_handler \
    --zip-file fileb://transcribe-function.zip
{
    "FunctionName": "transcribe-function",
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function",
    "Runtime": "python3.8",
    "Role": "arn:aws:iam::760182048326:role/translate-function-role",
    "Handler": "transcribe-function.lambda_handler",
    "CodeSize": 667,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2020-05-05T08:36:23.606+0000",
    "CodeSha256": "Ce79ystMNCxNtMV5JNg1cBs/wsPQZNBgU/EQ9y7ftIk=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "0406316d-82c6-4c2e-b315-d56b5e1f9ddd",
    "State": "Active",
    "LastUpdateStatus": "Successful"
}

イベント作成

マネジメントコンソールからの場合は設計図の使用からで大丈夫っぽいけど、CLI だと細かく設定が必要らしい。

Lambda Function への権限設定
$ aws lambda add-permission \
    --function-name transcribe-function \
    --statement-id s3-put-event \
    --action lambda:InvokeFunction \
    --principal s3.amazonaws.com \
    --source-arn arn:aws:s3:::20200505-transcribe-input-mfjt
{
    "Statement": "{\"Sid\":\"s3-put-event\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::20200505-transcribe-input-mfjt\"}}}"
}

$ aws lambda get-policy --function-name transcribe-function
{
    "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[{\"Sid\":\"s3-put-event\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::20200505-transcribe-input-mfjt\"}}}]}",
    "RevisionId": "be76518e-5680-4436-8c7a-6bc36ee78573"
}
S3 へのイベント追加
$ aws s3api put-bucket-notification-configuration \
    --bucket 20200505-transcribe-input-mfjt \
    --notification-configuration '{"LambdaFunctionConfigurations": [{"LambdaFunctionArn": "arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function", "Events": ["s3:ObjectCreated:Put"]}]}'

$ aws s3api get-bucket-notification-configuration --bucket 20200505-transcribe-input-mfjt
{
    "LambdaFunctionConfigurations": [
        {
            "Id": "MTlhZThmYTItZGE3Mi00ZTM1LWE2YzktZWFkYjRjM2JmYmRk",
            "LambdaFunctionArn": "arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function",
            "Events": [
                "s3:ObjectCreated:Put"
            ]
        }
    ]
}

ポリシーのアタッチ

$ aws iam attach-role-policy \
    --role-name translate-function-role \
    --policy-arn "arn:aws:iam::aws:policy/AmazonS3FullAccess"

$ aws iam attach-role-policy \
    --role-name translate-function-role \
    --policy-arn "arn:aws:iam::aws:policy/AmazonTranscribeFullAccess"

動作確認

$ aws s3 cp HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3 s3://20200505-transcribe-input-mfjt
upload: ./HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3 to s3://20200505-transcribe-input-mfjt/HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3

$ aws transcribe list-transcription-jobs
{
    "TranscriptionJobSummaries": [
        {
            "TranscriptionJobName": "20200505090252_Transcription",
            "CreationTime": "2020-05-05T18:02:53.280000+09:00",
            "StartTime": "2020-05-05T18:02:53.325000+09:00",
            "CompletionTime": "2020-05-05T18:04:52.861000+09:00",
            "LanguageCode": "en-US",
            "TranscriptionJobStatus": "COMPLETED",
            "OutputLocationType": "CUSTOMER_BUCKET"
        }
    ]
}

$ aws transcribe get-transcription-job --transcription-job-name 20200505090252_Transcription
{
    "TranscriptionJob": {
        "TranscriptionJobName": "20200505090252_Transcription",
        "TranscriptionJobStatus": "COMPLETED",
        "LanguageCode": "en-US",
        "MediaSampleRateHertz": 44100,
        "MediaFormat": "mp3",
        "Media": {
            "MediaFileUri": "s3://20200505-transcribe-input-mfjt/HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3"
        },
        "Transcript": {
            "TranscriptFileUri": "https://s3.ap-northeast-1.amazonaws.com/20200505-transcribe-output-mfjt/20200505090252_Transcription.json"
        },
        "StartTime": "2020-05-05T18:02:53.325000+09:00",
        "CreationTime": "2020-05-05T18:02:53.280000+09:00",
        "CompletionTime": "2020-05-05T18:04:52.861000+09:00",
        "Settings": {
            "ChannelIdentification": false,
            "ShowAlternatives": false
        }
    }
}

$ aws s3 cp s3://20200505-transcribe-output-mfjt/20200505090252_Transcription.json - | jq '.results | .transcripts'
[
  {
    "transcript": "Hello. Do you speak a foreign language? One language is never enough."
  }
]

参考