Project

General

Profile

Bug #9636 » testcode.rb

テストに使用したコード - kiyoteru.inoue (Kiyoteru Inoue), 03/14/2014 05:36 PM

 
#!/usr/bin/ruby -Ku
#-*- encoding :utf-8 -*-
# -Ku は非推奨ですが。下位互換のために付与
$LOAD_PATH << File.dirname(__FILE__)

=begin
Ruby 1.8.7-p375
Ruby 1.9.3-p545
Ruby 2.1.1-p76

いずれのバージョンでも、同様のコアダンプを発生させています。
Ruby 2.1.1-p76 で実行時のコアダンプを添付します。
実行環境は
Ubuntu 13.10 x86_64 です。CPU の Byte Order は Little Endian です。
=end


# Ruby バージョン毎に処理を分岐。
case
# Ruby 1.9, 1.8 では 'dl/import'
when RUBY_VERSION.match(/1\.9/), RUBY_VERSION.match(/1\.8\.7/)
require 'dl/import'
# Ruby 2.x では 'fiddle/import'
when RUBY_VERSION.match(/2\.\d/)
require 'fiddle/import'
end

module LibAquesTalk2
# Ruby バージョン毎に処理を分岐。
case
# Ruby 1.9, 1.8.7 では DL::Importer
when RUBY_VERSION.match(/1\.9/), RUBY_VERSION.match(/1\.8\.7/)
extend DL::Importer
# Ruby 2.x では Fiddle::Importer
when RUBY_VERSION.match(/2\.\d/)
extend Fiddle::Importer
# Ruby 1.8.7 older では DL::Importable
else
extend DL::Importable
end
# AquesTalk2 評価版(linux)
dlload './libAquesTalk2Eva.so.2.3'

# AquesTalk2 開発用(linux) ←開発用でも同様のコアダンプが発生
# dlload './libAquesTalk2Eva.so.2.3'


# AquesTalk2_Synthe_Utf8(koe, iSpeed, size, phontDat)
# 音声変換を行う処理
@@synthe = extern('unsigned char * AquesTalk2_Synthe_Utf8(const char *, int, int *, void *)')

# AquesTalk2_FreeWave(*wav)
# メモリ解放を行う処理
@@free_wave = extern('void AquesTalk2_FreeWave(unsigned char *)')
end

# エラークラス
class AquesTalk2_Error < StandardError; end

# AquesTalk2 ライブラリのラッパークラス
class AquesTalk2
include LibAquesTalk2

# 読み上げ速度の初期値
DEFAULT_ISPEED = 100
# 音声話者の初期値
DEFAULT_PHONT = 0
# 出力ファイル名の初期値
DEFAULT_OUTPUT = 'output.wav'
# 読み上げ速度アクセサ
attr_accessor :ispeed
# 読み上げ話者アクセサ
attr_accessor :phont
# 出力ファイル名アクセサ
attr_accessor :output

# 引数なしでインスタンス生成された場合、初期値を用いる
def initialize(ispeed = nil, phont = nil)
@ispeed ||= DEFAULT_ISPEED
@phont ||= DEFAULT_PHONT
end
# テキストを音声へ変換する処理( AquesTalkライブラリのラッパーメソッド )
def synthe(input, output = nil, ispeed = nil, phont = nil)
begin
raise(AquesTalk2_Error.new('input arg required.')) unless input
rescue AquesTalk2_Error => error
return false
end
input.chomp!
output ||= DEFAULT_OUTPUT
ispeed ||= @ispeed
phont ||= @phont

begin
result = @@synthe.call(input, ispeed, size = 0, phont) # ←このコードが実行された時点でコアダンプ
raise(AquesTalk2_Error.new('AquesTalk2_Synthe_Utf8 error: '+size.to_s)) if size.zero?
rescue AquesTalk2_Error => error
return false
end
open(output, 'w+b'){|f|f.print(result)}
free_wave(result)
return true
end
# メモリ解放を行う処理のラッパーメソッド
def free_wave(wav)
@@free_wave.call(wav)
end
end

=begin
ここから、テスト処理です。
=end

# 評価用のテキストソース
sample_source = 'こんにちは'
# 出力ファイル名
sample_file = 'sample.wav'

# インスタンス生成
aques_talk = AquesTalk2.new
# テキストから音声ファイルを生成(AquesTalk2 ライブラリを実行)
aques_talk.synthe(sample_source, sample_file)


(1-1/2)