Pythonコードで、/ で区切られた複数行の文章を1行に結合し出力する

 Pythonコードで、/ で区切られた複数行の文章を1行に結合し出力する。

■ Pythonコード1
・入力ファイル(.txt)
I am happy.
You are happy.
She is happy.
/
I am cold.
We are cold.
It is cold today.

・出力ファイル(.txt)
I am happy.You are happy.She is happy.
I am cold.We are cold.It is cold today.

・コード:
def merge_text_lines(file_path, output_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        # テキストファイルを読み込む
        lines = file.read().splitlines()

    merged_lines = []
    current_sentence = []

    for line in lines:
        # '/'で区切られている場合
        if line == '/':
            # current_sentenceを結合して1行の文章にし、リストに追加
            if current_sentence:
                merged_lines.append(''.join(current_sentence))
                current_sentence = []
        else:
            # '/'でない行はcurrent_sentenceに追加
            current_sentence.append(line)

    # 最後の文がある場合は追加
    if current_sentence:
        merged_lines.append(''.join(current_sentence))

    # 各文章を改行で結合してファイルに書き込む
    with open(output_path, 'w', encoding='utf-8') as output_file:
        output_file.write('\n'.join(merged_lines))

# 入力ファイルと出力ファイルのパスを指定して実行
merge_text_lines('path_to_your_file.txt', 'output_file.txt')

■ Pythonコード2
・入力ファイル(.txt)
I am happy.
You are happy.
She is happy.
/
I am cold.
We are cold.
It is cold today.

・出力ファイル(.txt)[コンマ区切り]
I am happy.,You are happy.,She is happy.
I am cold.,We are cold.,It is cold today.

・コード2:
def merge_text_lines_with_commas(file_path, output_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        # テキストファイルを読み込む
        lines = file.read().splitlines()

    merged_lines = []
    current_sentence = []

    for line in lines:
        # '/'で区切られている場合
        if line == '/':
            # current_sentenceをカンマ区切りで1行の文章にし、リストに追加
            if current_sentence:
                merged_lines.append(','.join(current_sentence))
                current_sentence = []
        else:
            # '/'でない行はcurrent_sentenceに追加
            current_sentence.append(line)

    # 最後の文がある場合は追加
    if current_sentence:
        merged_lines.append(','.join(current_sentence))

    # 各文章を改行で結合してファイルに書き込む
    with open(output_path, 'w', encoding='utf-8') as output_file:
        output_file.write('\n'.join(merged_lines))

# 入力ファイルと出力ファイルのパスを指定して実行
merge_text_lines_with_commas('path_to_your_file.txt', 'output_file_with_commas.txt')

■ Pythonコード3
入力ファイル(.txt)[最後の行に/がある]
I am happy.
You are happy.
She is happy.
/
I am cold.
We are cold.
It is cold today.
/

・出力ファイル(.txt)[コンマ区切り]
I am happy.,You are happy.,She is happy.
I am cold.,We are cold.,It is cold today.

・コード3
def merge_text_lines_with_commas(file_path, output_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        # テキストファイルを読み込む
        lines = file.read().splitlines()

    merged_lines = []
    current_sentence = []

    for line in lines:
        # '/'で区切られている場合
        if line == '/':
            # current_sentenceに文がある場合のみカンマ区切りで1行に結合し、リストに追加
            if current_sentence:
                merged_lines.append(','.join(current_sentence))
                current_sentence = []  # 次の文のためにリストをリセット
        else:
            # '/'でない行はcurrent_sentenceに追加
            current_sentence.append(line)

    # 最後の'/'でcurrent_sentenceがリセットされているので、追加処理は不要

    # 各文章を改行で結合してファイルに書き込む
    with open(output_path, 'w', encoding='utf-8') as output_file:
        output_file.write('\n'.join(merged_lines))

# 入力ファイルと出力ファイルのパスを指定して実行
merge_text_lines_with_commas('path_to_your_file.txt', 'output_file_with_commas.txt')



Pythonから外部のコマンドラインツールを使う(.aacをmp3に変換する)

■必要な環境
ffmpegがインストールされていることを確認。subprocessで呼び出しています。
pydubとその依存関係(ffmpeg)が必要。

まだインストールしていない場合は、以下でインストールできます。
[ffmpegのインストール]
・MacOSやLinuxではbrew install ffmpegまたはsudo apt install ffmpegでインストールできます。
・Windowsの場合では、ffmpeg公式サイトからインストールしてください。

[pydubのインストール]
・pip install pydub

これで、ffmpegを使って.aacファイルを.wavに変換し、その後pydubで.mp3に変換する一貫したプロセスが実行できます。

----
import subprocess
from pydub import AudioSegment
import os

# 入力と出力のファイルパスを設定
input_file = "sample.aac"  # 変換したいAACファイルのパス
wav_file = "sample.wav"  # 一時的なWAVファイルのパス
output_file = "sample.mp3"  # 変換後のMP3ファイルのパス

# 1. ffmpegでAACからWAVに変換
subprocess.run(['ffmpeg', '-i', input_file, wav_file])

# 2. WAVファイルをMP3に変換
audio = AudioSegment.from_file(wav_file, format="wav")
audio.export(output_file, format="mp3")

print("変換が完了しました:", output_file)

# 一時的なWAVファイルを削除
os.remove(wav_file)
----

[学習のまとめ]
subprocess.run()を使うことで、Pythonから外部のコマンドラインツール(例えば、ffmpegやlsコマンドなど)を実行することができます。これにより、Pythonコード内でシステムのコマンドを直接呼び出すことができます。

[ffmpegの活用例]
1)ffmpeg -i input.aac output.wav
2)ffmpeg -i input.aac output.mp3

3)ffmpeg -i input.aac -map 0 output.wav -map 0 output.mp3
1),2)を1行で行う。

4)ffmpeg -i input.aac -map 0 output.wav -map 0 output.mp3 && rm output.wav
1),2)を1行で行い、output.wavを削除する。




ディレクトリ内のファイルを取得してテキストファイルに保存(python Windows10)

 
ディレクトリ /sound-part/ 内にあるすべてのファイル名を取得し、
それらを all_file_list.txtに保存する。
'dirctory-get_files_names.py'(20241107 作成)

[pythonコード(Windows10)]
----
import os

# 対象ディレクトリと出力ファイル
directory_path = "sound-part"# 読み取り対象のディレクトリ
output_file = "all_file_list.txt"  # 出力するテキストファイル

# ディレクトリ内のファイルを取得してテキストファイルに保存
with open(output_file, "w",encoding="utf-8") as file:
    for filename in os.listdir(directory_path):
        # ファイルパスを取得
        file_path = os.path.join(directory_path, filename)
        
        # ファイルのみを対象(ディレクトリは除外)
        if os.path.isfile(file_path):
            file.write(filename + "\n")  # ファイル名を1行ごとに保存

print(f"ファイルリストが {output_file} に保存されました(BOMなしのUTF-8形式)")
----

■with open(output_file, "w",encoding="utf-8") as fileに関連して
macOSのデフォルトエンコーディングは utf-8 であるため、
encoding="utf-8"がなくても'BOMなしのUTF-8形式'で保存されるようです。

with open(output_file, "w") as file:


■各OSでの動作
・Windows 10:
デフォルトエンコーディングは cp1252(Shift-JISやANSIと呼ばれることもあるWindowsのローカルエンコーディング)になります。
cp1252 はUTF-8とは異なるため、文字エンコーディングに互換性のない文字が含まれていると、文字化けが発生することがあります。

・macOS:
macOSのデフォルトエンコーディングは utf-8 であるため、BOMなしのUTF-8形式で保存されます。

■推奨事項
エンコーディングの違いを避け、常に同じ形式でファイルを扱うために、 encoding="utf-8" を明示的に指定するのがおすすめです。これにより、OSに関係なく、BOMなしのUTF-8形式でファイルが保存されます。

python
コードをコピーする
# BOMなしのUTF-8を明示的に指定
with open("example.txt", "w", encoding="utf-8") as file:
    file.write("これはテストの文章です。")
これで、WindowsとmacOSのどちらでも一貫してBOMなしのUTF-8形式で保存できます。

example.txtの中身:
これはテストの文章です。


複数の空ファイルの作成とそのファイル名の一部を一括変更する(python,wondows10)

利用する場合は、テスト用のディレクトリを作成しその中で作業して下さい。
ファイルの消去には注意してください。

■空のファイルを作成する
空のファイルを作成するには、Pythonでファイルを開いてすぐ閉じることで可能です。
以下のコードでは、指定されたファイル名のリストを使って空ファイルを作成。

[pythonコード例1]
空ファイルを作成する。拡張子が同じファイルの例
 F:\英語の学習-実習1>python empty_files.py
---
import os

# 作成したい空ファイルの名前リスト
file_names = [
    'sample_track-001.mp3',
    'sample_track-002.mp3',
    'sample_track-003.mp3',
    'sample-001.mp3'
]

# ファイルを保存するディレクトリ
directory = 'eigo'  # 必要に応じてディレクトリ名を変更してください

# ディレクトリが存在しない場合は作成
os.makedirs(directory, exist_ok=True)

# 空ファイルを作成
for file_name in file_names:
    file_path = os.path.join(directory, file_name)
    with open(file_path, 'w') as f:
        pass  # 'w' モードで開いてすぐ閉じることで空ファイルが作成される

print("空ファイルの作成が完了しました。")


●コードの説明
os.makedirs(directory, exist_ok=True) は、eigo ディレクトリが存在しない場合に作成します(既に存在する場合は何もしない)。
with open(file_path, 'w') as f: pass で空ファイルを作成します。ファイルが既に存在する場合、上書きされて空になる。

●実行結果
上記のコードを実行すると、指定した eigo ディレクトリに以下の空ファイルが作成される。

eigo/
├── sample_track-001.mp3
├── sample_track-002.mp3
├── sample_track-003.mp3
└── sample-001.mp3
これで、.mp3、.txt などの空ファイルが作成されます。

[pythonコード例2]
空ファイルを作成する。拡張子が同じファイルの例
 F:\英語の学習-実習1>python n-empty_files.py
---
import os
import time

# 作成したい空の .mp3 ファイルの名前リスト
file_names = [
    'sample_track-001.mp3',
    'sample_track-002.mp3',
    'sample_track-003.mp3',
    'sample-001.mp3'
]

# ファイルを保存するディレクトリ
directory = 'eigo'

# 既存のファイルをすべて削除してから再作成する
if os.path.exists(directory):
    for f in os.listdir(directory):
        os.remove(os.path.join(directory, f))
else:
    os.makedirs(directory)

# 指定順にファイルを作成し、間隔を開けて保存順を明確にする
for file_name in file_names:
    file_path = os.path.join(directory, file_name)
    with open(file_path, 'w') as f:
        pass  # 'w' モードで開いてすぐ閉じることで空ファイルが作成される
    time.sleep(0.1)  # 作成時間に間隔を設けて順序が保持されるようにする

print("空ファイルの作成が完了しました。")

# ディレクトリ内のファイルを指定順で表示
print("\nディレクトリ内のファイル一覧:")
for file_name in file_names:
    print(file_name)


■ファイル名の一部を一括変更する
 F:\英語の学習-実習1>pyton rename-files-name.py
----
import os
import shutil

# 元ディレクトリと新規保存ディレクトリのパス
source_dir = 'eigo'
target_dir = os.path.join(source_dir, 'rename_eigo')

# 変更する条件
target_extension = '.mp3'  # 変更するファイルの拡張子
old_text = 'sample_track'  # 置換前の文字列
new_text = 'eiken3'        # 置換後の文字列

# 保存ディレクトリを作成(存在しない場合のみ作成)
os.makedirs(target_dir, exist_ok=True)

# 元ディレクトリのファイルを順に処理
for filename in os.listdir(source_dir):
    source_file = os.path.join(source_dir, filename)
    
    # ファイルがディレクトリでないことを確認
    if os.path.isfile(source_file):
        # ファイル名と拡張子を分割
        name, ext = os.path.splitext(filename)
        
        # 拡張子が指定されたものであれば、名前の一部を置換
        if ext == target_extension and old_text in name:
            new_name = name.replace(old_text, new_text) + ext
        else:
            # 他のファイルは名前をそのまま保持
            new_name = filename
        
        # 変更後のファイルを新しいディレクトリにコピー
        target_file = os.path.join(target_dir, new_name)
        shutil.copy2(source_file, target_file)

print("ファイルの変更が完了しました。")





リスニング/スピーキングの独習アプリ(2024/10/17 by Takahashi)

●リスニング/スピーキングの独習アプリ(2024/10/17 by Takahashi)
(audio_player_20241101.py)

●audio_player.pyの実行ファイル(.exe)の作成
使用するときには実行ファイルを活用する。
>pyinstaller --onefile audio_player.py
これで作成されるディレクトリ[dist]内のaudio_player.exeをダブルクリックで立ち上げる。

●使用上の約束
・audio_player.exeと同じ場所にディレクトリ[sound]を作成して、そこにmp3を置く。
ディレクトリ[sound]はmp3ファイルを置くためのデフォルトディレクトリとしている。
ディレクトリ[sound]が無い場合には音声を入れたディレクトリ名を指定する。
・以後、起動後に表示されるメニューに従って利用します。
・再生中に
[p]を押すと再生の停止/再開
[m]を押すとメニューに戻る
[q]を押すとプログラム終了

●実行ファイルの提供について
未定

[立ち上げ時とメニュー表示]





















[pythonコード 参考]
-----------------

-----------------
■便利ツール(上記のメニュー画像の調整に下記の2,3を活用)
1) AIで画像を拡大|waifu2x.org
https://waifu2x.org/ja/

2) AIアップスケーラーで画像を大きく、美しく
https://imgupscaler.com/ja

3) デスクトップ版waifu2x-caffeの使い方
デスクトップ版「waifu2x-caffe」は、Windowsで動作するスタンドアロンのアプリケーションで、インターネットに接続せずに高画質化が行えます。
[waifu2x-caffeのダウンロードとインストール]
「waifu2x-caffe」のGitHubページ(https://github.com/lltcggie/waifu2x-caffe)から最新のリリースをダウンロードします。
ダウンロードしたZIPファイルを解凍し、「waifu2x-caffe.exe」をダブルクリックして起動。

テキストファイルから各センテンスを読み込み、無音を挿入した統合音声ファイルと個別センテンスの音声ファイルを作成

[F:\英語の学習-実習\20241102\1-each_sentence_basename.py](作業場所メモ)

Pythonを使って、テキストファイル(.txt)から各センテンスを読み込み、無音を挿入した音声ファイル(統合ファイル)と個別センテンスの音声ファイルを作成する。

[手順]
(1) テキスト読み込み
sentences.txtファイルから各センテンスを読み込む。
(2) 音声合成 (Text-to-Speech)
音声合成ライブラリ(例えば gTTS (Google Text-to-Speech))を使用して、各センテンスを音声データに変換。
(3) 音声ファイルの保存

Hello, how are you?
I am learning Python.
This is a test sentence.
Let's go fishing after school.
What do you do every saturday.

[pythonコード]
from gtts import gTTS
from pydub import AudioSegment

# 一括でファイル名を定義
txt_file = "sentences.txt"
out_mp3 = "sentences_with_silence.mp3"

# 各センテンスの音声ファイル名の頭部
each_sentence_basename = "lesson"

# 無音の長さを秒単位で設定(センテンスとセンテンスの間に無音を設定する)
silence_duration = 3  # 3秒間の無音

# テキストファイルの読み込み
with open(txt_file, "r", encoding="utf-8") as file:
    sentences = file.readlines()

# 初期の空の音声データ(全体の音声ファイル)
combined_audio = AudioSegment.silent(duration=0)

# 各センテンスを音声に変換し、無音を追加
for i, sentence in enumerate(sentences, start=1):
    sentence = sentence.strip()
    if sentence:
        # テキストを音声に変換
        tts = gTTS(sentence, lang='en')
        
        # 各センテンスのファイル名を作成(例: lesson001.mp3)
        sentence_filename = f"{each_sentence_basename}-{i:03}.mp3"
        tts.save(sentence_filename)
        
        # 個別の音声ファイルを読み込む
        sentence_audio = AudioSegment.from_mp3(sentence_filename)
        
        # 全体の音声にセンテンスと無音を追加
        combined_audio += sentence_audio
        combined_audio += AudioSegment.silent(duration=silence_duration * 1000)  # ミリ秒に変換

# 最終的な音声ファイルを保存
combined_audio.export(out_mp3, format="mp3")

print("無音を挿入した音声ファイルと個別のセンテンス音声ファイルが生成されました。")